import React, { useState, useEffect } from "react"; import Avatar from "../../common/Avatar"; import { useDebounce } from "../../../utils/appUtils"; import { useSelectedProject } from "../../../slices/apiDataManager"; import { useOrganizationEmployees } from "../../../hooks/useOrganization"; import { useEmployeesByProjectAllocated, useManageProjectAllocation, } from "../../../hooks/useProjects"; import useMaster, { useServices } from "../../../hooks/masterHook/useMaster"; import showToast from "../../../services/toastService"; const TeamEmployeeList = ({ organizationId, searchTerm, closeModal }) => { const selectedProject = useSelectedProject(); const debounceSearchTerm = useDebounce(searchTerm, 500); const { data: employeesData = [], isLoading, isError, error, } = useOrganizationEmployees( selectedProject, organizationId, debounceSearchTerm ); const { projectEmployees, loading: employeeLodaing } = useEmployeesByProjectAllocated(selectedProject, null); const { data: jobRoles } = useMaster(); const { data: services } = useServices(); const [employees, setEmployees] = useState([]); const { mutate: handleAssignEmployee, isPending } = useManageProjectAllocation({ onSuccessCallback: () => { closeModal(); }, onErrorCallback: () => { closeModal(); }, }); useEffect(() => { if (employeesData?.data?.length > 0) { const available = employeesData.data.filter((emp) => { const projEmp = projectEmployees.find((pe) => pe.employeeId === emp.id); return !projEmp || projEmp.isActive === false; }); setEmployees( available.map((emp) => ({ ...emp, isChecked: false, jobRole: emp?.jobRoleId || null, serviceId: "", errors: {}, })) ); } }, [employeesData, projectEmployees, organizationId]); const handleCheckboxChange = (index) => { setEmployees((prev) => { const newArr = [...prev]; newArr[index].isChecked = !newArr[index].isChecked; newArr[index].errors = {}; return newArr; }); }; const handleSelectChange = (index, field, value) => { setEmployees((prev) => { const newArr = [...prev]; newArr[index][field] = value; newArr[index].errors[field] = ""; return newArr; }); }; const onSubmit = () => { const checkedEmployees = employees.filter((emp) => emp.isChecked); setEmployees((prev) => prev.map((emp) => ({ ...emp, errors: {} }))); if (checkedEmployees.length === 0) { showToast("Select at least one employee", "info"); return; } let hasError = false; const newEmployees = employees.map((emp) => { const empErrors = {}; if (emp.isChecked) { if (!emp.jobRole) { empErrors.jobRole = "Job role is required"; hasError = true; } if (!emp.serviceId) { empErrors.serviceId = "Service is required"; hasError = true; } } return { ...emp, errors: empErrors }; }); setEmployees(newEmployees); if (hasError) return; // stop submit if validation fails const payload = checkedEmployees.map((emp) => ({ employeeId: emp.id, jobRoleId: emp.jobRole, serviceId: emp.serviceId, projectId: selectedProject, status: true, })); handleAssignEmployee({ payload,actionType:"assign"} ); setEmployees((prev) => prev.map((emp) => ({ ...emp, isChecked: false, jobRole: "", serviceId: "", errors: {}, })) ); }; if (isLoading) { return (

Loading employees...

) ; } if (isError) { return (
{error?.status === 400 ? (

Enter employee you want to find.

) : (

Something went wrong. Please try again later.

)}
); } if (employees.length === 0) { return(

No available employees to assign.

) ; } return (
{employees.map((emp, index) => ( ))}
Employee Service Job Role Select
{emp.firstName} {emp.lastName}
{emp.errors.serviceId && (
{emp.errors.serviceId}
)}
{emp.errors.jobRole && (
{emp.errors.jobRole}
)}
handleCheckboxChange(index)} />
); }; export default TeamEmployeeList;