'use client'; import { useSubscribe } from '@/store/subscribe'; import { zodResolver } from '@hookform/resolvers/zod'; import { Button } from '@workspace/ui/components/button'; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from '@workspace/ui/components/form'; import { ScrollArea } from '@workspace/ui/components/scroll-area'; import { Sheet, SheetContent, SheetFooter, SheetHeader, SheetTitle, SheetTrigger, } from '@workspace/ui/components/sheet'; import { Combobox } from '@workspace/ui/custom-components/combobox'; import { DatePicker } from '@workspace/ui/custom-components/date-picker'; import { EnhancedInput } from '@workspace/ui/custom-components/enhanced-input'; import { Icon } from '@workspace/ui/custom-components/icon'; import { unitConversion } from '@workspace/ui/utils'; import { useTranslations } from 'next-intl'; import { ReactNode, useState } from 'react'; import { useForm } from 'react-hook-form'; import { z } from 'zod'; interface Props { trigger: ReactNode; title: string; loading?: boolean; initialData?: API.UserSubscribe; onSubmit: (values: any) => Promise; } const formSchema = z.object({ subscribe_id: z.number().optional(), traffic: z.number().optional(), speed_limit: z.number().optional(), device_limit: z.number().optional(), expired_at: z.number().nullish().optional(), upload: z.number().optional(), download: z.number().optional(), id: z.number().optional(), }); export function SubscriptionForm({ trigger, title, loading, initialData, onSubmit }: Props) { const t = useTranslations('user'); const [open, setOpen] = useState(false); const form = useForm({ resolver: zodResolver(formSchema), defaultValues: { subscribe_id: initialData?.subscribe_id || 0, traffic: initialData?.traffic || 0, upload: initialData?.upload || 0, download: initialData?.download || 0, expired_at: initialData?.expire_time || 0, ...(initialData && { id: initialData.id }), }, }); const handleSubmit = async (values: any) => { const success = await onSubmit(values); if (success) { setOpen(false); form.reset(); } }; const { subscribes } = useSubscribe(); return ( {title}
( {t('subscription')} placeholder='Select Subscription' value={field.value} onChange={(value) => { form.setValue(field.name, value); }} options={subscribes?.map((item) => ({ value: item.id!, label: item.name!, }))} /> )} /> ( {t('trafficLimit')} unitConversion('bytesToGb', value)} formatOutput={(value) => unitConversion('gbToBytes', value)} suffix='GB' onValueChange={(value) => { form.setValue(field.name, value as number); }} /> )} /> ( {t('uploadTraffic')} unitConversion('bytesToGb', value)} formatOutput={(value) => unitConversion('gbToBytes', value)} suffix='GB' onValueChange={(value) => { form.setValue(field.name, value as number); }} /> )} /> ( {t('downloadTraffic')} unitConversion('bytesToGb', value)} formatOutput={(value) => unitConversion('gbToBytes', value)} suffix='GB' onValueChange={(value) => { form.setValue(field.name, value as number); }} /> )} /> ( {t('expiredAt')} { if (value === field.value) { form.setValue(field.name, 0); } else { form.setValue(field.name, value!); } }} /> )} />
); }