"use client"; import * as React from "react"; import { useState } from "react"; import { useSession } from "next-auth/react"; import { toast } from "sonner"; import { MaterialGroupSelectorDialogMulti } from "@/components/common/material/material-group-selector-dialog-multi"; import { MaterialSearchItem } from "@/lib/material/material-group-service"; import { addConfirmedMaterial, VendorPossibleMaterial } from "../vendor-possible-material-service"; interface AddConfirmedMaterialProps { vendorId: number; existingConfirmedMaterials: VendorPossibleMaterial[]; onMaterialAdded?: () => void; } export function AddConfirmedMaterial({ vendorId, existingConfirmedMaterials, onMaterialAdded, }: AddConfirmedMaterialProps) { const { data: session } = useSession(); const [isLoading, setIsLoading] = useState(false); const [selectedMaterials, setSelectedMaterials] = useState([]); // 이미 등록된 자재그룹코드들의 Set const existingMaterialCodes = new Set( existingConfirmedMaterials.map(material => material.itemCode).filter((code): code is string => Boolean(code)) ); // 자재 선택 완료 시 처리 const handleMaterialsSelect = async (materials: MaterialSearchItem[]) => { if (!session?.user) { toast.error("로그인이 필요합니다."); return; } if (materials.length === 0) { toast.error("추가할 자재를 선택해주세요."); return; } setIsLoading(true); try { // 선택된 자재들을 각각 추가 for (const material of materials) { const materialData = { itemCode: material.materialGroupCode, itemName: material.materialGroupDescription, }; await addConfirmedMaterial( vendorId, materialData, Number(session.user.id), session.user.name || "알 수 없음" ); } toast.success(`${materials.length}개의 자재가 확정정보에 추가되었습니다.`); // 폼 리셋 setSelectedMaterials([]); // 부모 컴포넌트에 추가 완료 알림 onMaterialAdded?.(); } catch (error) { console.error("자재 추가 실패:", error); // 에러 메시지를 더 구체적으로 표시 if (error instanceof Error) { if (error.message.includes("이미 확정정보에 등록되어 있습니다")) { toast.error(error.message); } else { toast.error(`자재 추가 실패: ${error.message}`); } } else { toast.error("자재 추가 중 알 수 없는 오류가 발생했습니다."); } } finally { setIsLoading(false); } }; return ( ); }