import { useState, useEffect, useRef } from "react"; import { useEmployeesName } from "../../hooks/useEmployees"; import { useDebounce } from "../../utils/appUtils"; import { useController } from "react-hook-form"; import Avatar from "../common/Avatar"; const MultiEmployeeSearchInput = ({ control, name, projectId, placeholder, forAll, }) => { const { field: { onChange, value, ref }, fieldState: { error }, } = useController({ name, control }); const [search, setSearch] = useState(""); const [showDropdown, setShowDropdown] = useState(false); const [selectedEmployees, setSelectedEmployees] = useState([]); const dropdownRef = useRef(null); const debouncedSearch = useDebounce(search, 500); const { data: employees, isLoading } = useEmployeesName( projectId, debouncedSearch, forAll ); useEffect(() => { if (value && employees?.data) { // Ensure value is a string (sometimes it may come as array/object) const stringValue = typeof value === "string" ? value : Array.isArray(value) ? value.join(",") : ""; const emails = stringValue.split(",").filter(Boolean); const foundEmps = employees.data.filter((emp) => emails.includes(emp.email) ); setSelectedEmployees(foundEmps); if (forAll && foundEmps.length > 0) { setSearch(""); // clear search field } } }, [value, employees?.data, forAll]); const handleSelect = (employee) => { if (!selectedEmployees.find((emp) => emp.email === employee.email)) { const newSelected = [...selectedEmployees, employee]; setSelectedEmployees(newSelected); // Store emails instead of IDs onChange( newSelected .map((e) => e.email) .filter(Boolean) .join(",") ); setSearch(""); setShowDropdown(false); } }; const handleRemove = (email) => { const newSelected = selectedEmployees.filter((e) => e.email !== email); setSelectedEmployees(newSelected); onChange( newSelected .map((e) => e.email) .filter(Boolean) .join(",") ); }; useEffect(() => { const handleClickOutside = (event) => { if (dropdownRef.current && !dropdownRef.current.contains(event.target)) { setShowDropdown(false); } }; const handleEsc = (event) => { if (event.key === "Escape") setShowDropdown(false); }; document.addEventListener("mousedown", handleClickOutside); document.addEventListener("keydown", handleEsc); return () => { document.removeEventListener("mousedown", handleClickOutside); document.removeEventListener("keydown", handleEsc); }; }, []); return (