"use client"; import { useEffect, useState, useRef } from "react"; import { useForm, Controller } from "react-hook-form"; import { zodResolver } from "@hookform/resolvers/zod"; import { Dialog, DialogContent, DialogHeader, DialogTitle, Button, Input, Textarea, Select, SelectContent, SelectItem, SelectTrigger, SelectValue, Label, ComboboxItemProps, } from "ikoncomponents"; import { Plus } from "lucide-react"; import { getUsersApi } from "@/app/utils/api/projectApi"; import { projectSchema, ProjectFormData } from "./zodProject"; import { useAppCache } from "@/app/utils/context/AppCacheContext"; interface User { userId: string; userName: string; userEmail: string; active: boolean; } interface CreateProjectModalProps { open: boolean; onClose: (open: boolean) => void; onSubmit: (data: ProjectFormData) => void; projectManagerDropdownOptions: ComboboxItemProps[]; } export default function CreateProjectModal({ open, onClose, onSubmit, projectManagerDropdownOptions, }: CreateProjectModalProps) { const { control, handleSubmit, formState: { errors }, setValue, watch, reset, } = useForm({ resolver: zodResolver(projectSchema), defaultValues: { projectName: "", projectDescription: "", projectStatus: "Active", projectManager: "", projectTeam: [], contractedStartDate: "", contractedEndDate: "", source: "manual", productType: "", }, }); const projectTeam = watch("projectTeam"); const [users, setUsers] = useState([]); const [loadingUsers, setLoadingUsers] = useState(false); const [teamDropdownOpen, setTeamDropdownOpen] = useState(false); const [managerDropdown, setManagerDropdown] = useState( [], ); const dropdownRef = useRef(null); // Project Manager options come from the shared app-wide cache. const { projectManagerOptions } = useAppCache(); useEffect(() => { if (!open) { reset(); return; } const fetchUsers = async () => { setLoadingUsers(true); try { const data = await getUsersApi(); setUsers(data ?? []); } finally { setLoadingUsers(false); } }; fetchUsers(); }, [open, reset]); // Keep the manager dropdown in sync with the cached Project Manager options. useEffect(() => { setManagerDropdown( projectManagerOptions.map((opt) => ({ label: opt.label, value: opt.value, })), ); }, [projectManagerOptions]); useEffect(() => { const handleClickOutside = (event: MouseEvent) => { if ( dropdownRef.current && !dropdownRef.current.contains(event.target as Node) ) { setTeamDropdownOpen(false); } }; if (teamDropdownOpen) { document.addEventListener("mousedown", handleClickOutside); } return () => document.removeEventListener("mousedown", handleClickOutside); }, [teamDropdownOpen]); const toggleTeamMember = (userId: string) => { setValue( "projectTeam", projectTeam.includes(userId) ? projectTeam.filter((id) => id !== userId) : [...projectTeam, userId], { shouldValidate: true }, ); }; return ( Create New Project
{/* Project Name */}
} /> {errors.projectName && (

{errors.projectName.message}

)}
{/* Description */}