import { zodResolver } from '@hookform/resolvers/zod' import { useEffect, useState } from 'react' import { useFetcher, useNavigate } from 'react-router' import { RemixFormProvider, useRemixForm } from 'remix-hook-form' import { z } from 'zod' import type { TCategoryResponse } from '~/apis/common/get-categories' import { Button } from '~/components/ui/button' import { Input } from '~/components/ui/input' import { TitleDashboard } from '~/components/ui/title-dashboard' import { urlFriendlyCode } from '~/utils/formatter' export const createCategorySchema = z.object({ id: z.string().optional(), name: z.string().min(3, 'Nama minimal 3 karakter'), code: z.string(), sequence: z.preprocess(Number, z.number().optional()), description: z.string(), }) export type TCategorySchema = z.infer type TProperties = { categoryData?: TCategoryResponse } export const FormCategoryPage = (properties: TProperties) => { const { categoryData } = properties || {} const fetcher = useFetcher() const navigate = useNavigate() const formMethods = useRemixForm({ mode: 'onSubmit', fetcher, resolver: zodResolver(createCategorySchema), values: { id: categoryData?.id || undefined, code: categoryData?.code || '', name: categoryData?.name || '', sequence: categoryData?.sequence || undefined, description: categoryData?.description || '', }, }) const [error, setError] = useState() const { handleSubmit, watch, setValue } = formMethods const watchName = watch('name') useEffect(() => { if (!fetcher.data?.success) { setError(fetcher.data?.message) return } navigate('/lg-admin/categories') setError(undefined) // eslint-disable-next-line react-hooks/exhaustive-deps }, [fetcher]) useEffect(() => { setValue('code', urlFriendlyCode(watchName)) // eslint-disable-next-line react-hooks/exhaustive-deps }, [watchName]) return (
{error && (
{error}
)}
) }