"use client"; import * as React from "react"; import { useForm } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { z } from "zod"; import { format } from "date-fns"; import { ko } from "date-fns/locale/ko"; import { toast } from "sonner"; import { Loader2, CalendarIcon } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Form, FormControl, FormField, FormItem, FormLabel, FormMessage } from "@/components/ui/form"; import { Input } from "@/components/ui/input"; import { Sheet, SheetContent, SheetHeader, SheetTitle, SheetDescription, SheetFooter, SheetClose } from "@/components/ui/sheet"; import { Popover, PopoverTrigger, PopoverContent } from "@/components/ui/popover"; import { Calendar } from "@/components/ui/calendar"; import { cn } from "@/lib/utils"; import { updateTechSalesRfq, getTechSalesRfqById } from "@/lib/techsales-rfq/service"; // Zod schema for form validation const updateRfqSchema = z.object({ rfqId: z.number().min(1, "RFQ ID is required"), description: z.string(), dueDate: z.string(), }); type UpdateRfqSchema = z.infer; interface UpdateSheetProps { open: boolean; onOpenChange?: (open: boolean) => void; rfqId: number; onUpdated?: () => void; } export default function UpdateSheet({ open, onOpenChange, rfqId, onUpdated }: UpdateSheetProps) { const [isPending, startTransition] = React.useTransition(); const [projectInfo, setProjectInfo] = React.useState({ projNm: "", sector: "", projMsrm: "", ptypeNm: "", rfqNo: "", }); const [isLoading, setIsLoading] = React.useState(false); // Initialize form with React Hook Form and Zod const form = useForm({ resolver: zodResolver(updateRfqSchema), defaultValues: { rfqId, description: "", dueDate: "", }, }); // Load RFQ data when sheet opens React.useEffect(() => { if (open && rfqId) { loadRfqData(); } }, [open, rfqId]); const loadRfqData = async () => { try { setIsLoading(true); const result = await getTechSalesRfqById(rfqId); if (result.error) { toast.error(result.error); onOpenChange?.(false); return; } if (result.data) { form.reset({ rfqId, description: result.data.description || "", dueDate: result.data.dueDate ? new Date(result.data.dueDate).toISOString().slice(0, 10) : "", }); setProjectInfo({ projNm: result.data.project[0].projectName || "", sector: result.data.project[0].pjtType || "", projMsrm: result.data.project[0].projMsrm || "", ptypeNm: result.data.project[0].ptypeNm || "", rfqNo: result.data.rfqCode || "", }); } } catch (error: any) { toast.error("RFQ 정보를 불러오는 중 오류가 발생했습니다: " + error.message); onOpenChange?.(false); } finally { setIsLoading(false); } }; // Form submission handler with debug logs async function onSubmit(values: UpdateRfqSchema) { console.log("Form submitted with values:", values); startTransition(async () => { try { console.log("Submitting RFQ update for ID:", values.rfqId); const result = await updateTechSalesRfq({ id: values.rfqId, description: values.description, dueDate: new Date(values.dueDate), updatedBy: 1, // Replace with actual user ID }); if (result.error) { console.error("Update error:", result.error); toast.error(result.error); } else { console.log("RFQ updated successfully"); toast.success("RFQ가 성공적으로 업데이트되었습니다!"); onUpdated?.(); onOpenChange?.(false); form.reset(); } } catch (error: any) { console.error("Update failed with error:", error.message); toast.error("업데이트 중 오류 발생: " + error.message); } }); } // Debug form errors on change React.useEffect(() => { const subscription = form.watch(() => { console.log("Form values changed:", form.getValues()); console.log("Form errors:", form.formState.errors); }); return () => subscription.unsubscribe(); }, [form]); return ( RFQ 수정 RFQ 정보를 수정합니다. 모든 필드를 입력한 후 저장 버튼을 클릭하세요.
{isLoading ? (
) : (
프로젝트명: {projectInfo.projNm}
섹터: {projectInfo.sector}
척수: {projectInfo.projMsrm}
선종: {projectInfo.ptypeNm}
RFQ No: {projectInfo.rfqNo}
( RFQ Title )} /> ( 마감일 { // date-fns format을 사용해 yyyy-MM-dd로 변환하여 string 저장 if (date) { field.onChange(format(date, "yyyy-MM-dd")); } }} disabled={(date) => date < new Date() || date < new Date("1900-01-01") } initialFocus /> )} />
)}
); }