'use client'; import React, { useState, useEffect, useRef } from 'react'; import { X, Search } from 'lucide-react'; import projectService from '@/services/projectService'; import employeeService from '@/services/employeeService'; import type { Project, EmployeeSearchResult } from '@/types'; interface Props { isOpen: boolean; onClose: () => void; onSaved: () => void; editData?: Project | null; } export default function ProjectFormModal({ isOpen, onClose, onSaved, editData }: Props) { const isEdit = !!editData; const [projectName, setProjectName] = useState(''); const [projectType, setProjectType] = useState('SI'); const [contractCompany, setContractCompany] = useState(''); const [endUserCompany, setEndUserCompany] = useState(''); const [contractType, setContractType] = useState('TURN_KEY'); const [startDate, setStartDate] = useState(''); const [endDate, setEndDate] = useState(''); const [workLocationType, setWorkLocationType] = useState('ON_SITE'); const [workAddress, setWorkAddress] = useState(''); const [techEnvironment, setTechEnvironment] = useState(''); const [mainTaskDesc, setMainTaskDesc] = useState(''); const [loading, setLoading] = useState(false); const [error, setError] = useState(null); // Internal manager search const [mgrSearch, setMgrSearch] = useState(''); const [mgrResults, setMgrResults] = useState([]); const [selectedMgr, setSelectedMgr] = useState(null); const [showMgrDropdown, setShowMgrDropdown] = useState(false); const debounceRef = useRef(undefined); // Pre-populate on edit useEffect(() => { if (!editData) { resetForm(); return; } setProjectName(editData.projectName || ''); setProjectType(editData.projectType || 'SI'); setContractCompany(editData.contractCompany || ''); setEndUserCompany(editData.endUserCompany || ''); setContractType(editData.contractType || 'TURN_KEY'); setStartDate(editData.startDate || ''); setEndDate(editData.endDate || ''); setWorkLocationType(editData.workLocationType || 'ON_SITE'); setWorkAddress(editData.workAddress || ''); setTechEnvironment(editData.techEnvironment || ''); setMainTaskDesc(editData.mainTaskDesc || ''); if (editData.internalManager) { setSelectedMgr(editData.internalManager as EmployeeSearchResult); setMgrSearch(editData.internalManager.name); } }, [editData, isOpen]); const resetForm = () => { setProjectName(''); setProjectType('SI'); setContractCompany(''); setEndUserCompany(''); setContractType('TURN_KEY'); setStartDate(''); setEndDate(''); setWorkLocationType('ON_SITE'); setWorkAddress(''); setTechEnvironment(''); setMainTaskDesc(''); setMgrSearch(''); setSelectedMgr(null); setError(null); }; const handleMgrSearch = (val: string) => { setMgrSearch(val); setShowMgrDropdown(true); if (debounceRef.current) clearTimeout(debounceRef.current); debounceRef.current = window.setTimeout(() => { if (val.trim().length >= 1) { employeeService.search(val.trim()).then((res) => { setMgrResults(res.data || []); }).catch(() => {}); } else { setMgrResults([]); } }, 300); }; const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); if (!projectName.trim() || !contractCompany.trim() || !startDate) { setError('Project name, contract company, and start date are required.'); return; } setLoading(true); setError(null); try { const payload: Record = { projectName: projectName.trim(), projectType, contractCompany: contractCompany.trim(), endUserCompany: endUserCompany.trim() || undefined, contractType, startDate, endDate: endDate || undefined, workLocationType, workAddress: workAddress.trim() || undefined, techEnvironment: techEnvironment.trim() || undefined, mainTaskDesc: mainTaskDesc.trim() || undefined, internalManagerId: selectedMgr?.empId || null, }; if (isEdit) { await projectService.update(editData!.projectId, payload); } else { await projectService.create(payload); } onSaved(); onClose(); resetForm(); } catch { setError('Failed to save project. Please try again.'); } setLoading(false); }; if (!isOpen) return null; return (
e.stopPropagation()}>

{isEdit ? 'Edit Project' : 'New Project'}

setProjectName(e.target.value)} placeholder="e.g. Samsung Pay SI" className="w-full px-3 py-2 rounded-xl border border-border text-sm focus:outline-none focus:ring-2 focus:ring-primary" />
setContractCompany(e.target.value)} placeholder="e.g. Samsung Electronics" className="w-full px-3 py-2 rounded-xl border border-border text-sm focus:outline-none focus:ring-2 focus:ring-primary" />
setEndUserCompany(e.target.value)} placeholder="e.g. Samsung SDS" className="w-full px-3 py-2 rounded-xl border border-border text-sm focus:outline-none focus:ring-2 focus:ring-primary" />
setStartDate(e.target.value)} className="w-full px-3 py-2 rounded-xl border border-border text-sm focus:outline-none focus:ring-2 focus:ring-primary" />
setEndDate(e.target.value)} className="w-full px-3 py-2 rounded-xl border border-border text-sm focus:outline-none focus:ring-2 focus:ring-primary" />
setWorkAddress(e.target.value)} placeholder="e.g. Seoul, Gangnam-gu" className="w-full px-3 py-2 rounded-xl border border-border text-sm focus:outline-none focus:ring-2 focus:ring-primary" />
setTechEnvironment(e.target.value)} placeholder="e.g. Java, Spring Boot, React, PostgreSQL" className="w-full px-3 py-2 rounded-xl border border-border text-sm focus:outline-none focus:ring-2 focus:ring-primary" />