import { useForm } from 'react-hook-form'; import { zodResolver } from '@hookform/resolvers/zod'; import { z } from 'zod'; import { Trash2 } from 'lucide-react'; import type { ReqCreateSupplier as SupplierCreate } from '@/api/generated/model/reqCreateSupplier'; import type { ReqUpdateSupplier as SupplierUpdate } from '@/api/generated/model/reqUpdateSupplier'; import { showToast } from '@/lib/notify'; import { Typography } from '@/components/ui/typography'; import { Button } from '@/components/ui/button'; import { Input } from '@/components/ui/input'; import { Sheet } from '@/components/ui/sheet'; import { type Partner } from '../types'; const schema = z.object({ name: z.string().trim().min(1, '회사명/협력사명을 작성해 주십시오.'), code: z.string().trim().min(1, '협력사코드를 입력해 주십시오.'), managerName: z.string().trim().min(1, '담당자명을 입력해 주십시오.'), managerEmail: z.string().trim().email('정확한 담당자 이메일 형식을 점검해 주십시오.'), managerPhone: z.string().trim().min(1, '담당자 연락처를 입력해 주십시오.'), totalRevenue: z.string().trim().optional(), // 총매출액(원) }); type FormValues = z.infer; type PartnerFormSheetProps = { open: boolean; mode: 'create' | 'edit'; partner: Partner | null; // edit 모드일 때 초기값 출처 onCreate: (data: SupplierCreate) => Promise; onUpdate: (supplierId: string, data: SupplierUpdate) => Promise; onDelete: (supplierId: string, name: string) => void; onClose: () => void; }; // mode/partner로 폼 초기값 산출. create는 기본값, edit는 partner에서. function buildDefaults(mode: 'create' | 'edit', partner: Partner | null): FormValues { if (mode === 'edit' && partner) { return { name: partner.name ?? '', code: partner.code || '', managerName: partner.manager_name || '', managerEmail: partner.manager_email || '', managerPhone: partner.manager_contact_number || '', totalRevenue: partner.total_revenue != null ? String(partner.total_revenue) : '', }; } return { name: '', code: `PART-CORP-${Math.floor(100 + Math.random() * 900)}`, managerName: '', managerEmail: '', managerPhone: '010-', totalRevenue: '', }; } const inputClass = 'text-foreground text-xs'; export function PartnerFormSheet({ open, mode, partner, onCreate, onUpdate, onDelete, onClose, }: PartnerFormSheetProps) { const { register, handleSubmit, formState: { errors, isSubmitting }, } = useForm({ resolver: zodResolver(schema), defaultValues: buildDefaults(mode, partner), }); const onValid = async (v: FormValues) => { const common = { name: v.name, code: v.code, manager_name: v.managerName, manager_email: v.managerEmail, manager_contact_number: v.managerPhone, total_revenue: v.totalRevenue?.trim() ? Number(v.totalRevenue.replace(/[^0-9]/g, '')) : undefined, }; if (mode === 'create') { try { await onCreate(common as SupplierCreate); showToast('신규 협력사가 등록되었습니다.', 'success'); onClose(); } catch (err) { showToast(err instanceof Error ? err.message : '협력사 등록 실패', 'error'); } } else if (partner) { try { await onUpdate(partner.supplier_id, common as SupplierUpdate); showToast('협력사 정보가 최신화되었습니다.', 'success'); onClose(); } catch (err) { showToast(err instanceof Error ? err.message : '협력사 수정 실패', 'error'); } } }; return (
{/* Partner Name */}
협력사명 {errors.name &&

{errors.name.message}

}
{/* Code */}
협력사코드 {errors.code &&

{errors.code.message}

}
{/* 총매출액 */}
총매출액 (원, 선택)
{/* Manager Name */}
담당자명 {errors.managerName &&

{errors.managerName.message}

}
{/* Manager Email */}
담당자 이메일 {errors.managerEmail &&

{errors.managerEmail.message}

}
{/* Manager Phone */}
담당자 연락처 {errors.managerPhone &&

{errors.managerPhone.message}

}
{/* Buttons wrapper */}
{mode === 'edit' && partner && ( )}
); }