'use client'; import * as React from 'react'; import { useEffect, useMemo, useState } from 'react'; import { useMutation, useQuery } from '@tanstack/react-query'; import { toast } from 'sonner'; import { Icons } from '@/components/icons'; import { Button } from '@/components/ui/button'; import { ProjectPartiesEditor, type ProjectPartyEditorItem } from '@/features/crm/components/project-parties-editor'; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from '@/components/ui/select'; import { Sheet, SheetContent, SheetDescription, SheetFooter, SheetHeader, SheetTitle } from '@/components/ui/sheet'; import { useAppForm, useFormFields } from '@/components/ui/tanstack-form'; import { enquiryProjectPartiesOptions } from '../api/queries'; import { createEnquiryMutation, updateEnquiryMutation } from '../api/mutations'; import type { EnquiryMutationPayload, EnquiryRecord, EnquiryReferenceData } from '../api/types'; import { enquirySchema, type EnquiryFormValues } from '../schemas/enquiry.schema'; function toDefaultValues( enquiry: EnquiryRecord | undefined, referenceData: EnquiryReferenceData ): EnquiryFormValues { return { customerId: enquiry?.customerId ?? referenceData.customers[0]?.id ?? '', contactId: enquiry?.contactId ?? undefined, assignedToUserId: enquiry?.assignedToUserId ?? undefined, title: enquiry?.title ?? '', description: enquiry?.description ?? '', requirement: enquiry?.requirement ?? '', projectName: enquiry?.projectName ?? '', projectLocation: enquiry?.projectLocation ?? '', branchId: enquiry?.branchId ?? undefined, productType: enquiry?.productType ?? referenceData.productTypes[0]?.id ?? '', status: enquiry?.status ?? referenceData.statuses[0]?.id ?? '', priority: enquiry?.priority ?? referenceData.priorities[1]?.id ?? referenceData.priorities[0]?.id ?? '', leadChannel: enquiry?.leadChannel ?? undefined, estimatedValue: enquiry?.estimatedValue ?? undefined, chancePercent: enquiry?.chancePercent ?? undefined, expectedCloseDate: enquiry?.expectedCloseDate ? enquiry.expectedCloseDate.slice(0, 10) : '', competitor: enquiry?.competitor ?? '', source: enquiry?.source ?? '', isHotProject: enquiry?.isHotProject ?? false, notes: enquiry?.notes ?? '', isActive: enquiry?.isActive ?? true }; } export function EnquiryFormSheet({ enquiry, open, onOpenChange, referenceData, workspace = 'enquiry' }: { enquiry?: EnquiryRecord; open: boolean; onOpenChange: (open: boolean) => void; referenceData: EnquiryReferenceData; workspace?: 'lead' | 'enquiry'; }) { const isEdit = !!enquiry; const defaultValues = useMemo( () => toDefaultValues(enquiry, referenceData), [enquiry, referenceData] ); const [selectedCustomerId, setSelectedCustomerId] = useState(defaultValues.customerId); const [projectParties, setProjectParties] = useState([]); const { FormTextField, FormTextareaField, FormSelectField, FormSwitchField } = useFormFields(); const projectPartiesQuery = useQuery({ ...enquiryProjectPartiesOptions(enquiry?.id ?? ''), enabled: open && !!enquiry?.id }); const createMutation = useMutation({ ...createEnquiryMutation, onSuccess: () => { toast.success(`สร้าง${recordLabel}สำเร็จ`); onOpenChange(false); }, onError: (error) => toast.error(error instanceof Error ? error.message : `ไม่สามารถสร้าง${recordLabel}ได้`) }); const updateMutation = useMutation({ ...updateEnquiryMutation, onSuccess: () => { toast.success(`อัปเดต${recordLabel}สำเร็จ`); onOpenChange(false); }, onError: (error) => toast.error(error instanceof Error ? error.message : `ไม่สามารถอัปเดต${recordLabel}ได้`) }); const contactsForCustomer = referenceData.contacts.filter( (contact) => contact.customerId === selectedCustomerId ); const selectedCustomer = referenceData.customers.find((customer) => customer.id === selectedCustomerId); const form = useAppForm({ defaultValues, validators: { onSubmit: enquirySchema }, onSubmit: async ({ value }) => { const payload: EnquiryMutationPayload = { customerId: value.customerId, contactId: value.contactId || null, assignedToUserId: value.assignedToUserId || null, title: value.title, description: value.description, requirement: value.requirement, projectName: value.projectName, projectLocation: value.projectLocation, branchId: value.branchId || null, productType: value.productType, status: value.status, priority: value.priority, leadChannel: value.leadChannel || null, estimatedValue: typeof value.estimatedValue === 'number' ? value.estimatedValue : null, chancePercent: typeof value.chancePercent === 'number' ? value.chancePercent : null, expectedCloseDate: value.expectedCloseDate || null, competitor: value.competitor, source: value.source, isHotProject: value.isHotProject ?? false, notes: value.notes, isActive: value.isActive ?? true, projectParties: projectParties .filter((item) => item.customerId && item.role) .map((item) => ({ customerId: item.customerId, role: item.role, remark: item.remark || null })) }; if (isEdit && enquiry) { await updateMutation.mutateAsync({ id: enquiry.id, values: payload }); return; } await createMutation.mutateAsync(payload); } }); useEffect(() => { if (!open) { return; } setSelectedCustomerId(defaultValues.customerId); form.reset(defaultValues); setProjectParties( enquiry ? (projectPartiesQuery.data?.items ?? []).map((item) => ({ key: item.id, customerId: item.customerId, role: item.role, remark: item.remark ?? '' })) : [] ); }, [defaultValues, enquiry, form, open, projectPartiesQuery.data?.items]); useEffect(() => { if (!open || isEdit) { return; } const ownerUserId = referenceData.customers.find((customer) => customer.id === selectedCustomerId)?.ownerUserId ?? ''; form.setFieldValue('assignedToUserId', ownerUserId); }, [form, isEdit, open, referenceData.customers, selectedCustomerId]); const isPending = createMutation.isPending || updateMutation.isPending; const recordLabel = workspace === 'lead' ? 'ลีด' : 'โอกาสขาย'; return ( {isEdit ? `แก้ไข${recordLabel}` : `เพิ่ม${recordLabel}`} {workspace === 'lead' ? 'บันทึกข้อมูลลีดของฝ่ายการตลาดก่อนส่งต่อให้ฝ่ายขาย' : 'บันทึกข้อมูลโอกาสขายของฝ่ายขายก่อนเริ่มทำใบเสนอราคา'}
( ลูกค้าผู้รับใบเสนอราคา * )} /> ( ผู้ติดต่อ )} /> ({ value: user.id, label: user.name }))} /> ({ value: branch.id, label: branch.name }))} /> ({ value: item.id, label: item.label }))} /> ({ value: item.id, label: item.label }))} /> ({ value: item.id, label: item.label }))} /> ({ value: item.id, label: item.label }))} />
); } export function EnquiryFormSheetTrigger({ referenceData, workspace = 'enquiry' }: { referenceData: EnquiryReferenceData; workspace?: 'lead' | 'enquiry'; }) { const [open, setOpen] = React.useState(false); return ( <> ); }