import React, { useState, useEffect, useCallback, useMemo } from "react"; import moment from "moment"; import Avatar from "../common/Avatar"; import { convertShortTime, formatUTCToLocalTime } from "../../utils/dateUtils"; import RenderAttendanceStatus from "./RenderAttendanceStatus"; import usePagination from "../../hooks/usePagination"; import { useNavigate } from "react-router-dom"; import { ITEMS_PER_PAGE } from "../../utils/constants"; import { useAttendance } from "../../hooks/useAttendance"; import { useSelector } from "react-redux"; import { useQueryClient } from "@tanstack/react-query"; import eventBus from "../../services/eventBus"; import { useSelectedProject } from "../../slices/apiDataManager"; const Attendance = ({ getRole, handleModalData, searchTerm }) => { const queryClient = useQueryClient(); const [loading, setLoading] = useState(false); const navigate = useNavigate(); const [todayDate, setTodayDate] = useState(new Date()); const [ShowPending, setShowPending] = useState(false); // const selectedProject = useSelector( // (store) => store.localVariables.projectId // ); const selectedProject = useSelectedProject(); const { attendance, loading: attLoading, recall: attrecall, isFetching } = useAttendance(selectedProject); const filteredAttendance = ShowPending ? attendance?.filter( (att) => att?.checkInTime !== null && att?.checkOutTime === null ) : attendance; const attendanceList = Array.isArray(filteredAttendance) ? filteredAttendance : []; const sortByName = (a, b) => { const nameA = (a.firstName + a.lastName).toLowerCase(); const nameB = (b.firstName + b.lastName).toLowerCase(); return nameA?.localeCompare(nameB); }; const group1 = attendanceList .filter((d) => d.activity === 1 || d.activity === 4) .sort(sortByName); const group2 = attendanceList .filter((d) => d.activity === 0) .sort(sortByName); const finalFilteredData = useMemo(() => { const combinedData = [...group1, ...group2]; if (!searchTerm) { return combinedData; } const lowercasedSearchTerm = searchTerm.toLowerCase(); return combinedData.filter((item) => { const fullName = `${item.firstName} ${item.lastName}`.toLowerCase(); const role = item.jobRoleName?.toLowerCase() || ""; return ( fullName.includes(lowercasedSearchTerm) || role.includes(lowercasedSearchTerm) // also search by role ); }); }, [group1, group2, searchTerm]); // const finalFilteredData = useMemo(() => { // const combinedData = [...group1, ...group2]; // let tempData = combinedData; // // Search filter // if (searchTerm) { // const lowercasedSearchTerm = searchTerm.toLowerCase(); // tempData = tempData.filter((item) => { // const fullName = `${item.firstName} ${item.lastName}`.toLowerCase(); // const role = item.jobRoleName?.toLowerCase() || ""; // return ( // fullName.includes(lowercasedSearchTerm) || // role.includes(lowercasedSearchTerm) // also search by role // ); // }); // } // // Organization filter // if (filters?.selectedOrganization) { // tempData = tempData.filter( // (item) => item.organization?.name === filters.selectedOrganization // ); // } // // Services filter // if (filters?.selectedServices?.length > 0) { // tempData = tempData.filter((item) => // filters.selectedServices.includes(item.service?.name) // ); // } // return tempData; // }, [group1, group2, searchTerm, filters]); const { currentPage, totalPages, currentItems, paginate } = usePagination( finalFilteredData, ITEMS_PER_PAGE ); // Reset pagination when the filter or search term changes useEffect(() => { }, [finalFilteredData]); const handler = useCallback( (msg) => { if (selectedProject == msg.projectId) { queryClient.setQueryData(["attendance", selectedProject], (oldData) => { if (!oldData) { queryClient.invalidateQueries({ queryKey: ["attendance"] }) }; return oldData.map((record) => record.employeeId === msg.response.employeeId ? { ...record, ...msg.response } : record ); }); } }, [selectedProject, attrecall] ); const employeeHandler = useCallback( (msg) => { if (attendance.some((item) => item.employeeId == msg.employeeId)) { attrecall(); } }, [selectedProject, attendance] ); useEffect(() => { eventBus.on("attendance", handler); return () => eventBus.off("attendance", handler); }, [handler]); useEffect(() => { eventBus.on("employee", employeeHandler); return () => eventBus.off("employee", employeeHandler); }, [employeeHandler]); return ( <>
Date : {formatUTCToLocalTime(todayDate)}
setShowPending(e.target.checked)} />
{attLoading ? (
Loading...
) : currentItems?.length > 0 ? ( <> {currentItems && currentItems .sort((a, b) => { const checkInA = a?.checkInTime ? new Date(a.checkInTime) : new Date(0); const checkInB = b?.checkInTime ? new Date(b.checkInTime) : new Date(0); return checkInB - checkInA; }) .map((item) => ( ))} {!attendance && ( )}
Name Role Check-In Check-Out Actions
{item.jobRoleName} {item.checkInTime ? convertShortTime(item.checkInTime) : "--"} {item.checkOutTime ? convertShortTime(item.checkOutTime) : "--"}
No employees assigned to the project!
{!loading && finalFilteredData.length > ITEMS_PER_PAGE && ( )} ) : (
{searchTerm ? "No results found for your search." : attendanceList.length === 0 ? "No employees assigned to the project." : "No pending records available."}
)}
); }; export default Attendance;