'use client'; import { getSubscribeList } from '@/services/admin/subscribe'; import { zodResolver } from '@hookform/resolvers/zod'; import { Icon } from '@iconify/react'; import { useQuery } from '@tanstack/react-query'; import { Button } from '@workspace/ui/components/button'; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage, } from '@workspace/ui/components/form'; import { RadioGroup, RadioGroupItem } from '@workspace/ui/components/radio-group'; 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 { unitConversion } from '@workspace/ui/utils'; import { useTranslations } from 'next-intl'; import { useEffect, useState } from 'react'; import { useForm } from 'react-hook-form'; import { z } from 'zod'; const formSchema = z.object({ name: z.string(), code: z.string().optional(), count: z.number().optional(), type: z.number().optional(), discount: z.number().optional(), start_time: z.number().optional(), expire_time: z.number().optional(), subscribe: z.array(z.number()).nullish(), user_limit: z.number().optional(), }); interface CouponFormProps { onSubmit: (data: T) => Promise | boolean; initialValues?: T; loading?: boolean; trigger: string; title: string; } export default function CouponForm>({ onSubmit, initialValues, loading, trigger, title, }: CouponFormProps) { const t = useTranslations('coupon'); const [open, setOpen] = useState(false); const form = useForm({ resolver: zodResolver(formSchema), defaultValues: { type: 1, ...initialValues, } as any, }); useEffect(() => { form?.reset(initialValues); }, [form, initialValues]); async function handleSubmit(data: { [x: string]: any }) { const bool = await onSubmit(data as T); if (bool) setOpen(false); } const type = form.watch('type'); const { data: subscribe } = useQuery({ queryKey: ['getSubscribeList', 'all'], queryFn: async () => { const { data } = await getSubscribeList({ page: 1, size: 9999, }); return data.data?.list as API.Subscribe[]; }, }); return ( {title}
( {t('form.name')} { form.setValue(field.name, value); }} /> )} /> ( {t('form.customCouponCode')} { form.setValue(field.name, value); }} /> )} /> ( {t('form.type')} { form.setValue(field.name, Number(value)); form.setValue('discount', ''); }} className='flex gap-2' > {t('form.percentageDiscount')} {t('form.amountDiscount')} )} /> {type === 1 && ( ( {t('form.percentageDiscount')} { form.setValue(field.name, value); }} min={1} max={100} /> )} /> )} {type === 2 && ( ( {t('form.amountDiscount')} unitConversion('centsToDollars', value)} formatOutput={(value) => unitConversion('dollarsToCents', value)} onValueChange={(value) => { form.setValue(field.name, value); }} /> )} /> )} ( {t('form.specifiedServer')} multiple placeholder={t('form.selectServer')} value={field.value} onChange={(value) => { form.setValue(field.name, value); }} options={subscribe?.map((item: API.Subscribe) => ({ value: item.id, label: item.name, }))} /> )} /> ( {t('form.startTime')} date < new Date(Date.now() - 24 * 60 * 60 * 1000)} onChange={(value) => { form.setValue(field.name, value); }} /> )} /> ( {t('form.expireTime')} { form.setValue(field.name, value); }} /> )} /> ( {t('form.count')} { form.setValue(field.name, value); }} /> )} /> ( {t('form.userLimit')} { form.setValue(field.name, value); }} /> )} />
); }