import { useRef, useEffect, useState } from "react"; import { X } from "lucide-react"; import { PROJECT_ICON_MAP, PROJECT_ICON_CODES } from "../../../../lib/ProjectIcons"; import { LuSendHorizontal, LuMail } from "react-icons/lu"; import { useCreateProject } from "../../../../hooks/useProjects"; interface CreateProjectModalProps { isOpen: boolean; onClose: () => void; } export default function CreateProjectModal({ isOpen, onClose }: CreateProjectModalProps) { const dialogRef = useRef(null); const [selectedIcon, setSelectedIcon] = useState(PROJECT_ICON_CODES[0]); const [projectName, setProjectName] = useState(""); const [projectDescription, setProjectDescription] = useState(""); const [emailInput, setEmailInput] = useState(""); const [invitedEmails, setInvitedEmails] = useState([]); const [startDate, setStartDate] = useState(""); const [endDate, setEndDate] = useState(""); const { create, loading, error } = useCreateProject(); const projectIcons = PROJECT_ICON_CODES.map((id) => ({ id, icon: PROJECT_ICON_MAP[id], })); useEffect(() => { const dialog = dialogRef.current; if (!dialog) return; if (isOpen) { dialog.showModal(); document.body.style.overflow = "hidden"; } else { dialog.close(); document.body.style.overflow = "unset"; } const handleCancel = (e: Event) => { e.preventDefault(); onClose(); }; dialog.addEventListener("cancel", handleCancel); return () => { dialog.removeEventListener("cancel", handleCancel); document.body.style.overflow = "unset"; }; }, [isOpen, onClose]); const handleAddEmail = (e: React.FormEvent) => { e.preventDefault(); if (emailInput.trim() && !invitedEmails.includes(emailInput.trim())) { setInvitedEmails([...invitedEmails, emailInput.trim()]); setEmailInput(""); } }; const handleRemoveEmail = (emailToRemove: string) => { setInvitedEmails(invitedEmails.filter(email => email !== emailToRemove)); }; // Handler Submit Utama const handleSubmit = async (e: React.FormEvent) => { e.preventDefault(); const payload: any = { project_icon: selectedIcon, project_name: projectName, description: projectDescription, start_date: startDate, end_date: endDate, }; if (invitedEmails.length > 0) { payload.member_emails = invitedEmails; } const result = await create(payload); if (result) { onClose(); } }; return ( {/* Header Modal */}

Create New Project

Launch a new internship assignment or trackable milestone.

{/* Body Form Modal */}
{/* Section: Select Project Icon */}
{projectIcons.map((item) => { const IconComponent = item.icon; const isSelected = selectedIcon === item.id; return ( ); })}
{/* Section: Project Name */}
setProjectName(e.target.value)} className="w-full px-4 py-2.5 bg-white border border-gray-200 rounded-lg text-sm placeholder-gray-400 text-gray-800 focus:outline-none focus:border-red-600 focus:ring-1 focus:ring-red-600 font-medium" />
{/* Section: Project Description */}