import { useState } from "react"; import { CompanyModalState, CompanyFormData } from "@/types/company"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogFooter } from "@/components/ui/dialog"; import { LoadingSpinner } from "@/components/common/LoadingSpinner"; import { validateBusinessNumber, formatBusinessNumber } from "@/lib/validation/businessNumber"; interface CompanyFormModalProps { modalState: CompanyModalState; isLoading: boolean; error: string | null; onClose: () => void; onSave: () => Promise; onFormChange: (field: keyof CompanyFormData, value: string) => void; onClearError: () => void; } /** * 회사 등록/수정 모달 컴포넌트 */ export function CompanyFormModal({ modalState, isLoading, error, onClose, onSave, onFormChange, onClearError, }: CompanyFormModalProps) { const [isSaving, setIsSaving] = useState(false); const [businessNumberError, setBusinessNumberError] = useState(""); // 모달이 열려있지 않으면 렌더링하지 않음 if (!modalState.isOpen) return null; const { mode, formData, selectedCompany } = modalState; const isEditMode = mode === "edit"; // 사업자등록번호 변경 처리 const handleBusinessNumberChange = (value: string) => { // 자동 포맷팅 const formatted = formatBusinessNumber(value); onFormChange("business_registration_number", formatted); // 유효성 검사 (10자리가 다 입력되었을 때만) const cleaned = formatted.replace(/-/g, ""); if (cleaned.length === 10) { const validation = validateBusinessNumber(formatted); setBusinessNumberError(validation.isValid ? "" : validation.message); } else if (cleaned.length < 10 && businessNumberError) { // 10자리 미만이면 에러 초기화 setBusinessNumberError(""); } }; // 저장 처리 const handleSave = async () => { // 입력값 검증 (필수 필드) if (!formData.company_name.trim()) { return; } if (!formData.business_registration_number.trim()) { return; } // 사업자등록번호 최종 검증 const validation = validateBusinessNumber(formData.business_registration_number); if (!validation.isValid) { setBusinessNumberError(validation.message); return; } setIsSaving(true); onClearError(); setBusinessNumberError(""); try { const success = await onSave(); if (success) { // 성공 시 모달 닫기 onClose(); } } catch (err) { // 에러는 부모 컴포넌트에서 처리 } finally { setIsSaving(false); } }; // 취소 처리 const handleCancel = () => { onClearError(); onClose(); }; // Enter 키 처리 const handleKeyDown = (e: React.KeyboardEvent) => { if (e.key === "Enter" && !isLoading && !isSaving) { e.preventDefault(); handleSave(); } }; return ( {isEditMode ? "회사 정보 수정" : "새 회사 등록"}
{/* 회사명 입력 (필수) */}
onFormChange("company_name", e.target.value)} placeholder="회사명을 입력하세요" disabled={isLoading || isSaving} className={error ? "border-destructive" : ""} autoFocus />
{/* 사업자등록번호 입력 (필수) */}
handleBusinessNumberChange(e.target.value)} placeholder="000-00-00000" disabled={isLoading || isSaving} maxLength={12} className={businessNumberError ? "border-destructive" : ""} /> {businessNumberError ? (

{businessNumberError}

) : (

10자리 숫자 (자동 하이픈 추가)

)}
{/* 대표자명 입력 */}
onFormChange("representative_name", e.target.value)} placeholder="대표자명을 입력하세요" disabled={isLoading || isSaving} />
{/* 대표 연락처 입력 */}
onFormChange("representative_phone", e.target.value)} placeholder="010-0000-0000" disabled={isLoading || isSaving} type="tel" />
{/* 이메일 입력 */}
onFormChange("email", e.target.value)} placeholder="company@example.com" disabled={isLoading || isSaving} type="email" />
{/* 웹사이트 입력 */}
onFormChange("website", e.target.value)} placeholder="https://example.com" disabled={isLoading || isSaving} type="url" />
{/* 회사 주소 입력 */}
onFormChange("address", e.target.value)} placeholder="서울특별시 강남구..." disabled={isLoading || isSaving} />
{/* 에러 메시지 */} {error && (

{error}

)} {/* 수정 모드일 때 추가 정보 표시 */} {isEditMode && modalState.selectedCompany && (

회사 코드: {modalState.selectedCompany.company_code}

등록자: {modalState.selectedCompany.writer}

등록일:{" "} {new Date(modalState.selectedCompany.regdate).toLocaleDateString("ko-KR")}

)}
); }