import { DevTool } from '@hookform/devtools' import { zodResolver } from '@hookform/resolvers/zod' import { useEffect } from 'react' import toast from 'react-hot-toast' import { useFetcher, useNavigate, useRouteLoaderData } from 'react-router' import { RemixFormProvider, useRemixForm } from 'remix-hook-form' import { z } from 'zod' import type { newsResponseSchema } from '~/apis/common/get-news' 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 { InputFile } from '~/components/ui/input-file' import { Switch } from '~/components/ui/switch' import { TitleDashboard } from '~/components/ui/title-dashboard' import type { loader } from '~/routes/_admin.lg-admin._dashboard' import { dateInput } from '~/utils/formatter' export const contentSchema = z.object({ id: z.string().optional(), categories: z .array( z .object({ id: z.string(), code: z.string(), name: z.string(), }) .optional() .nullable(), ) .refine((data) => data.length, { message: 'Please select a category', }), tags: z .array( z .object({ id: z.string(), code: z.string(), name: z.string(), }) .optional() .nullable(), ) .optional(), title: z.string().min(1, { message: 'Judul is required', }), content: z.string().min(1, { message: 'Konten is required', }), featured_image: z.string().url({ message: 'Gambar Unggulan must be a valid URL', }), is_premium: z.boolean().optional(), live_at: z.string().min(1, { message: 'Tanggal live is required', }), }) export type TContentSchema = z.infer type TProperties = { newsData?: z.infer } export const FormContentsPage = (properties: TProperties) => { const { newsData } = properties || {} const fetcher = useFetcher() const navigate = useNavigate() const loaderData = useRouteLoaderData( 'routes/_admin.lg-admin._dashboard', ) const { categoriesData: categories } = loaderData || {} const { tagsData: tags } = loaderData || {} const formMethods = useRemixForm({ mode: 'onSubmit', fetcher, resolver: zodResolver(contentSchema), values: { id: newsData?.id || undefined, categories: newsData?.categories || [], tags: newsData?.tags || [], title: newsData?.title || '', content: newsData?.content || '', featured_image: newsData?.featured_image || '', is_premium: newsData?.is_premium || false, live_at: newsData?.live_at ? dateInput(newsData.live_at) : '', }, }) const { handleSubmit, control, watch } = formMethods const watchCategories = watch('categories') const watchTags = watch('tags') useEffect(() => { if (!fetcher.data?.success && fetcher.data?.message) { toast.error(fetcher.data.message) } if (fetcher.data?.success) { toast.success(`Artikel berhasil ${newsData ? 'diupdate' : 'dibuat'}!`) navigate('/lg-admin/contents') } // eslint-disable-next-line react-hooks/exhaustive-deps }, [fetcher.data]) return (
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" />
) }