'use client'; import * as React from 'react'; import { useEffect, useMemo } from 'react'; import { useStore } from '@tanstack/react-form'; import { useMutation } from '@tanstack/react-query'; import { toast } from 'sonner'; import { Icons } from '@/components/icons'; import { Button } from '@/components/ui/button'; import { Sheet, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle } from '@/components/ui/sheet'; import { useAppForm, useFormFields } from '@/components/ui/tanstack-form'; import { createCustomerMutation, updateCustomerMutation } from '../api/mutations'; import type { CustomerMutationPayload, CustomerRecord, CustomerReferenceData } from '../api/types'; import { customerSchema, type CustomerFormValues } from '../schemas/customer.schema'; interface CustomerFormSheetProps { customer?: CustomerRecord; open: boolean; onOpenChange: (open: boolean) => void; referenceData: CustomerReferenceData; } function toDefaultValues( customer: CustomerRecord | undefined, referenceData: CustomerReferenceData ): CustomerFormValues { return { name: customer?.name ?? '', abbr: customer?.abbr ?? '', taxId: customer?.taxId ?? '', customerType: customer?.customerType ?? referenceData.customerTypes[0]?.id ?? '', customerStatus: customer?.customerStatus ?? referenceData.customerStatuses[0]?.id ?? '', branchId: customer?.branchId ?? undefined, address: customer?.address ?? '', province: customer?.province ?? '', district: customer?.district ?? '', subDistrict: customer?.subDistrict ?? '', postalCode: customer?.postalCode ?? '', country: customer?.country ?? 'Thailand', phone: customer?.phone ?? '', fax: customer?.fax ?? '', email: customer?.email ?? '', website: customer?.website ?? '', leadChannel: customer?.leadChannel ?? undefined, customerGroup: customer?.customerGroup ?? undefined, customerSubGroup: customer?.customerSubGroup ?? undefined, notes: customer?.notes ?? '', isActive: customer?.isActive ?? true }; } export function CustomerFormSheet({ customer, open, onOpenChange, referenceData }: CustomerFormSheetProps) { const isEdit = !!customer; const defaultValues = useMemo( () => toDefaultValues(customer, referenceData), [customer, referenceData] ); const { FormTextField, FormSelectField, FormTextareaField, FormSwitchField } = useFormFields(); const createMutation = useMutation({ ...createCustomerMutation, onSuccess: () => { toast.success('สร้างลูกค้าสำเร็จ'); onOpenChange(false); }, onError: (error) => toast.error(error instanceof Error ? error.message : 'ไม่สามารถสร้างลูกค้าได้') }); const updateMutation = useMutation({ ...updateCustomerMutation, onSuccess: () => { toast.success('อัปเดตลูกค้าสำเร็จ'); onOpenChange(false); }, onError: (error) => toast.error(error instanceof Error ? error.message : 'ไม่สามารถอัปเดตลูกค้าได้') }); const form = useAppForm({ defaultValues, validators: { onSubmit: customerSchema }, onSubmit: async ({ value }) => { const payload: CustomerMutationPayload = { ...value, branchId: value.branchId || null, leadChannel: value.leadChannel || null, customerGroup: value.customerGroup || null, customerSubGroup: value.customerSubGroup || null }; if (isEdit && customer) { await updateMutation.mutateAsync({ id: customer.id, values: payload }); return; } await createMutation.mutateAsync(payload); } }); useEffect(() => { if (!open) { return; } form.reset(defaultValues); }, [defaultValues, form, open]); const selectedCustomerGroup = useStore(form.store, (state) => state.values.customerGroup); const selectedCustomerSubGroup = useStore(form.store, (state) => state.values.customerSubGroup); const filteredCustomerSubGroups = useMemo( () => referenceData.customerSubGroups.filter((item) => item.parentId === selectedCustomerGroup), [referenceData.customerSubGroups, selectedCustomerGroup] ); useEffect(() => { if (!selectedCustomerSubGroup) { return; } const isValid = filteredCustomerSubGroups.some((item) => item.id === selectedCustomerSubGroup); if (!isValid) { form.setFieldValue('customerSubGroup', ''); } }, [filteredCustomerSubGroups, form, selectedCustomerSubGroup]); const isPending = createMutation.isPending || updateMutation.isPending; return ( {isEdit ? 'แก้ไขลูกค้า' : 'เพิ่มลูกค้า'} จัดการข้อมูลหลักของลูกค้า สาขาที่ดูแล และการจัดประเภทใน CRM
({ value: item.id, label: item.label }))} /> ({ value: item.id, label: item.label }))} /> ({ value: branch.id, label: branch.name }))} /> ({ value: item.id, label: item.label }))} /> ({ value: item.id, label: item.label }))} /> ({ value: item.id, label: item.label }))} />
); } export function CustomerFormSheetTrigger({ referenceData }: { referenceData: CustomerReferenceData; }) { const [open, setOpen] = React.useState(false); return ( <> ); }