import { DevTool } from '@hookform/devtools' import { zodResolver } from '@hookform/resolvers/zod' import { useEffect, useState } from 'react' 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' 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 [error, setError] = useState() 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 ? new Date(newsData.live_at).toISOString().split('T')[0] : '', }, }) const { handleSubmit, control, watch } = formMethods const watchCategories = watch('categories') const watchTags = watch('tags') useEffect(() => { if (!fetcher.data?.success) { setError(fetcher.data?.message) return } navigate('/lg-admin/contents') 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" />
) }