import { useEffect, useState } from "react"; import { Dialog, DialogContent, DialogHeader, DialogTitle, DialogDescription, DialogFooter, } from "@/components/ui/dialog"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { Camera, X, Car, Wrench, Clock, Plus, Trash2 } from "lucide-react"; import { ProfileFormData } from "@/types/profile"; import { Separator } from "@/components/ui/separator"; import { VehicleRegisterData } from "@/lib/api/driver"; import { apiClient } from "@/lib/api/client"; // 언어 정보 타입 interface LanguageInfo { langCode: string; langName: string; langNative: string; } // 운전자 정보 타입 export interface DriverInfo { vehicleNumber: string; vehicleType: string | null; licenseNumber: string; phoneNumber: string; vehicleStatus: string | null; branchName: string | null; } // 알림 모달 컴포넌트 interface AlertModalProps { isOpen: boolean; onClose: () => void; title: string; message: string; type?: "success" | "error" | "info"; } function AlertModal({ isOpen, onClose, title, message, type = "info" }: AlertModalProps) { const getTypeColor = () => { switch (type) { case "success": return "text-green-600"; case "error": return "text-destructive"; default: return "text-primary"; } }; return ( {title}

{message}

); } // 운전자 폼 데이터 타입 export interface DriverFormData { vehicleNumber: string; vehicleType: string; licenseNumber: string; phoneNumber: string; branchName: string; } interface ProfileModalProps { isOpen: boolean; user: any; formData: ProfileFormData; selectedImage: string; isSaving: boolean; departments: Array<{ deptCode: string; deptName: string; }>; alertModal: { isOpen: boolean; title: string; message: string; type: "success" | "error" | "info"; }; // 운전자 관련 props (선택적) isDriver?: boolean; hasVehicle?: boolean; driverInfo?: DriverInfo | null; driverFormData?: DriverFormData; onDriverFormChange?: (field: keyof DriverFormData, value: string) => void; onDriverStatusChange?: (status: "off" | "maintenance") => void; onDriverAccountDelete?: () => void; // 차량 삭제/등록 관련 props onDeleteVehicle?: () => void; onOpenVehicleRegisterModal?: () => void; // 새 차량 등록 모달 관련 props isVehicleRegisterModalOpen?: boolean; newVehicleData?: VehicleRegisterData; onCloseVehicleRegisterModal?: () => void; onNewVehicleDataChange?: (field: keyof VehicleRegisterData, value: string) => void; onRegisterVehicle?: () => void; onClose: () => void; onFormChange: (field: keyof ProfileFormData, value: string) => void; onImageSelect: (event: React.ChangeEvent) => void; onImageRemove: () => void; onSave: () => void; onAlertClose: () => void; } /** * 프로필 수정 모달 컴포넌트 */ export function ProfileModal({ isOpen, user, formData, selectedImage, isSaving, departments, alertModal, isDriver = false, hasVehicle = false, driverInfo, driverFormData, onDriverFormChange, onDriverStatusChange, onDriverAccountDelete, onDeleteVehicle, onOpenVehicleRegisterModal, isVehicleRegisterModalOpen = false, newVehicleData, onCloseVehicleRegisterModal, onNewVehicleDataChange, onRegisterVehicle, onClose, onFormChange, onImageSelect, onImageRemove, onSave, onAlertClose, }: ProfileModalProps) { // 언어 목록 상태 const [languages, setLanguages] = useState([]); // 언어 목록 로드 useEffect(() => { const loadLanguages = async () => { try { const response = await apiClient.get("/multilang/languages"); if (response.data?.success && response.data?.data) { // is_active가 'Y'인 언어만 필터링하고 정렬 const activeLanguages = response.data.data .filter((lang: any) => lang.isActive === "Y" || lang.is_active === "Y") .map((lang: any) => ({ langCode: lang.langCode || lang.lang_code, langName: lang.langName || lang.lang_name, langNative: lang.langNative || lang.lang_native, })) .sort((a: LanguageInfo, b: LanguageInfo) => { // KR을 먼저 표시 if (a.langCode === "KR") return -1; if (b.langCode === "KR") return 1; return a.langCode.localeCompare(b.langCode); }); setLanguages(activeLanguages); } } catch (error) { console.error("언어 목록 로드 실패:", error); // 기본값 설정 setLanguages([ { langCode: "KR", langName: "Korean", langNative: "한국어" }, { langCode: "US", langName: "English", langNative: "English" }, ]); } }; if (isOpen) { loadLanguages(); } }, [isOpen]); // 차량 상태 한글 변환 const getStatusLabel = (status: string | null) => { switch (status) { case "off": return "대기"; case "active": return "운행중"; case "inactive": return "공차"; case "maintenance": return "정비"; default: return status || "-"; } }; return ( <> 프로필 수정
{/* 프로필 사진 섹션 */}
{selectedImage && selectedImage.trim() !== "" ? ( 프로필 사진 미리보기 ) : (
{formData.userName?.substring(0, 1)?.toUpperCase() || "U"}
)}
{selectedImage && selectedImage.trim() !== "" ? ( ) : null}
{/* 사용자 정보 폼 */}
onFormChange("userName", e.target.value)} placeholder="이름을 입력하세요" />
onFormChange("email", e.target.value)} placeholder="이메일을 입력하세요" />
onFormChange("positionName", e.target.value)} placeholder="직급을 입력하세요" />
{/* 운전자 정보 섹션 (공차중계 사용자만) */} {isDriver && ( <>

차량/운전자 정보

{/* 차량 유무에 따른 버튼 표시 */} {hasVehicle ? ( ) : ( )}
{/* 운전자 정보 (항상 수정 가능) */} {driverFormData && onDriverFormChange && ( <> {/* 차량 정보 - 차량이 있을 때만 수정 가능 */} {hasVehicle ? (
onDriverFormChange("vehicleNumber", e.target.value)} placeholder="12가1234" />
onDriverFormChange("vehicleType", e.target.value)} placeholder="1톤 카고" />
) : ( /* 차량이 없는 경우: 안내 메시지 */

등록된 차량이 없습니다.

새 차량 등록 버튼을 눌러 차량을 등록하세요.

)} {/* 운전자 개인 정보 - 항상 수정 가능 */}
onDriverFormChange("phoneNumber", e.target.value)} placeholder="010-1234-5678" />
onDriverFormChange("licenseNumber", e.target.value)} placeholder="12-34-567890-12" />
onDriverFormChange("branchName", e.target.value)} placeholder="서울 본점" />
{/* 차량 상태 - 차량이 있을 때만 표시 */} {hasVehicle && driverInfo && onDriverStatusChange && (
{getStatusLabel(driverInfo.vehicleStatus)}

* 운행/공차 상태는 공차등록 화면에서 변경하세요

)} )}
)}
{/* 알림 모달 */} {/* 새 차량 등록 모달 */} {isVehicleRegisterModalOpen && newVehicleData && onNewVehicleDataChange && onRegisterVehicle && onCloseVehicleRegisterModal && ( 새 차량 등록 새로운 차량 정보를 입력해주세요.
onNewVehicleDataChange("vehicleNumber", e.target.value)} placeholder="12가1234" />
onNewVehicleDataChange("vehicleType", e.target.value)} placeholder="1톤 카고" />
)} ); }