import { DevTool } from '@hookform/devtools' import { zodResolver } from '@hookform/resolvers/zod' import { useEffect } from 'react' import toast from 'react-hot-toast' import { useFetcher, useNavigate } from 'react-router' import { RemixFormProvider, useRemixForm } from 'remix-hook-form' import { z } from 'zod' import type { TSubscribePlanResponse } from '~/apis/common/get-subscribe-plan' import { Button } from '~/components/ui/button' import { Input } from '~/components/ui/input' import { Select } from '~/components/ui/select' import { TitleDashboard } from '~/components/ui/title-dashboard' import { urlFriendlyCode } from '~/utils/formatter' export const subscribePlanSchema = z.object({ id: z.string().optional(), name: z.string().min(3, 'Nama minimal 3 karakter'), code: z.string(), length: z.preprocess(Number, z.number().min(1, 'Length minimal 1')), price: z.preprocess(Number, z.number().min(1, 'Harga minimal 1')), status: z.string().min(1, 'Status is required'), }) export type TSubscribePlanSchema = z.infer type TProperties = { subscribePlanData?: TSubscribePlanResponse } export const FormSubscribePlanPage = (properties: TProperties) => { const { subscribePlanData } = properties || {} const fetcher = useFetcher() const navigate = useNavigate() const formMethods = useRemixForm({ mode: 'onSubmit', fetcher, resolver: zodResolver(subscribePlanSchema), values: { id: subscribePlanData?.id || undefined, code: subscribePlanData?.code || '', name: subscribePlanData?.name || '', length: subscribePlanData?.length || 0, price: subscribePlanData?.price || 0, status: subscribePlanData?.status.toString() || '', }, }) const { handleSubmit, watch, setValue, control } = formMethods const watchName = watch('name') useEffect(() => { if (fetcher.data?.success === false) { toast.error(fetcher.data?.message) return } if (fetcher.data?.success === true) { toast.success( `Subscribe Plan berhasil ${subscribePlanData ? 'diupdate' : 'dibuat'}!`, ) navigate('/lg-admin/subscribe-plan') return } // eslint-disable-next-line react-hooks/exhaustive-deps }, [fetcher.data]) useEffect(() => { setValue('code', urlFriendlyCode(watchName)) // eslint-disable-next-line react-hooks/exhaustive-deps }, [watchName]) return (