import { DevTool } from '@hookform/devtools' import { zodResolver } from '@hookform/resolvers/zod' import { useEffect, useState } from 'react' import { useFetcher, useRouteLoaderData } from 'react-router' import { RemixFormProvider, useRemixForm } from 'remix-hook-form' import { z } from 'zod' import { TextEditor } from '~/components/text-editor' import { Button } from '~/components/ui/button' import { Combobox } from '~/components/ui/combobox' import { Input } from '~/components/ui/input' import { TitleDashboard } from '~/components/ui/title-dashboard' import type { loader } from '~/routes/_admin.lg-admin' export const contentSchema = z.object({ categories: z .array( z .object({ id: z.string(), code: z.string(), name: z.string(), }) .optional() .nullable(), ) .refine((data) => !!data, { message: 'Please select a category', }), tags: z.array( z .object({ id: z.string(), code: z.string(), name: z.string(), }) .optional() .nullable(), ), title: z.string().min(1, { message: 'Judul is required', }), content: z.string().min(1, { message: 'Konten is required', }), featured_image: z.string().optional(), is_premium: z.boolean().optional(), live_at: z.string().min(1, { message: 'Tanggal live is required', }), }) export type TContentSchema = z.infer export const CreateContentsPage = () => { const fetcher = useFetcher() const loaderData = useRouteLoaderData('routes/_admin.lg-admin') const categories = loaderData?.categoriesData const tags = loaderData?.tagsData const [error, setError] = useState() const [disabled, setDisabled] = useState(false) const formMethods = useRemixForm({ mode: 'onSubmit', fetcher, resolver: zodResolver(contentSchema), }) const { handleSubmit, control, watch } = formMethods const watchCategories = watch('categories') const watchTags = watch('tags') useEffect(() => { if (!fetcher.data?.success) { setError(fetcher.data?.message) setDisabled(false) return } setDisabled(true) setError(undefined) // eslint-disable-next-line react-hooks/exhaustive-deps }, [fetcher]) return (
{error && (
{error}
)}
category?.name).join(', ') : 'Pilih Kategori' } options={categories} className="border-0 bg-white shadow focus:ring-1 focus:ring-[#2E2F7C] focus:outline-none" labelClassName="text-sm font-medium text-[#363636]" containerClassName="flex-1" /> tag?.name).join(', ') : 'Pilih Tags' } options={tags} className="border-0 bg-white shadow focus:ring-1 focus:ring-[#2E2F7C] focus:outline-none" labelClassName="text-sm font-medium text-[#363636]" containerClassName="flex-1" />
) }