import React, { useEffect, useRef, useState } from "react"; import Label from "../Label"; import { useDebounce } from "../../../utils/appUtils"; import { useEmployeesName } from "../../../hooks/useEmployees"; const SelectEmployeeServerSide = ({ label = "Select", placeholder = "Select Employee", required = false, value = null, onChange, valueKey = "id", isFullObject = false, isMultiple = false, projectId = null, isAllEmployee = false, }) => { const [searchText, setSearchText] = useState(""); const debounce = useDebounce(searchText, 300); const { data, isLoading } = useEmployeesName( projectId, debounce, isAllEmployee ); const options = data?.data ?? []; const [open, setOpen] = useState(false); const dropdownRef = useRef(null); const getDisplayName = (emp) => { if (!emp) return ""; return `${emp.firstName || ""} ${emp.lastName || ""}`.trim(); }; /** ----------------------------- * SELECTED OPTION (SINGLE) * ----------------------------- */ let selectedSingle = null; if (!isMultiple) { if (isFullObject && value) selectedSingle = value; else if (!isFullObject && value) selectedSingle = options.find((o) => o[valueKey] === value); } /** ----------------------------- * SELECTED OPTION (MULTIPLE) * ----------------------------- */ let selectedList = []; if (isMultiple && Array.isArray(value)) { if (isFullObject) selectedList = value; else { selectedList = options.filter((opt) => value.includes(opt[valueKey])); } } /** Main button label */ const displayText = !isMultiple ? getDisplayName(selectedSingle) || placeholder : selectedList.length > 0 ? selectedList.map((e) => getDisplayName(e)).join(", ") : placeholder; /** ----------------------------- * HANDLE OUTSIDE CLICK * ----------------------------- */ useEffect(() => { const handleClickOutside = (e) => { if (dropdownRef.current && !dropdownRef.current.contains(e.target)) { setOpen(false); } }; document.addEventListener("mousedown", handleClickOutside); return () => document.removeEventListener("mousedown", handleClickOutside); }, []); /** ----------------------------- * HANDLE SELECT * ----------------------------- */ const handleSelect = (option) => { if (!isMultiple) { // SINGLE SELECT if (isFullObject) onChange(option); else onChange(option[valueKey]); } else { // MULTIPLE SELECT let updated = []; const exists = selectedList.some((e) => e[valueKey] === option[valueKey]); if (exists) { // remove updated = selectedList.filter((e) => e[valueKey] !== option[valueKey]); } else { // add updated = [...selectedList, option]; } if (isFullObject) onChange(updated); else onChange(updated.map((x) => x[valueKey])); } }; return (