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/composed/combobox"; import { DatePicker } from "@workspace/ui/composed/date-picker"; import { EnhancedInput } from "@workspace/ui/composed/enhanced-input"; import { Icon } from "@workspace/ui/composed/icon"; import { unitConversion } from "@workspace/ui/utils/unit-conversions"; import { type ReactNode, useState } from "react"; import { useForm } from "react-hook-form"; import { useTranslation } from "react-i18next"; import { z } from "zod"; import { useSubscribe } from "@/stores/subscribe"; 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 } = useTranslation("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", "Subscription")} onChange={(value) => { form.setValue(field.name, value); }} options={subscribes?.map((item) => ({ value: item.id!, label: item.name!, }))} placeholder="Select Subscription" value={field.value} /> )} /> ( {t("trafficLimit", "Traffic Limit")} unitConversion("bytesToGb", value) } formatOutput={(value) => unitConversion("gbToBytes", value) } onValueChange={(value) => { form.setValue(field.name, value as number); }} suffix="GB" /> )} /> ( {t("uploadTraffic", "Upload Traffic")} unitConversion("bytesToGb", value) } formatOutput={(value) => unitConversion("gbToBytes", value) } onValueChange={(value) => { form.setValue(field.name, value as number); }} suffix="GB" /> )} /> ( {t("downloadTraffic", "Download Traffic")} unitConversion("bytesToGb", value) } formatOutput={(value) => unitConversion("gbToBytes", value) } onValueChange={(value) => { form.setValue(field.name, value as number); }} suffix="GB" /> )} /> ( {t("expiredAt", "Expired At")} { form.setValue(field.name, value || 0); }} placeholder={t("permanent", "Permanent")} value={ field.value && field.value > 0 ? field.value : undefined } /> )} />
); }