import React, { useCallback, useEffect, useState } from "react"; import Avatar from "../common/Avatar"; import { convertShortTime } from "../../utils/dateUtils"; import RegularizationActions from "./RegularizationActions"; import { useSelector } from "react-redux"; import { useRegularizationRequests } from "../../hooks/useAttendance"; import moment from "moment"; import usePagination from "../../hooks/usePagination"; import eventBus from "../../services/eventBus"; import { cacheData } from "../../slices/apiDataManager"; const Regularization = ({ handleRequest, searchQuery }) => { const selectedProject = useSelector((store) => store.localVariables.projectId); const [regularizesList, setRegularizedList] = useState([]); const { regularizes, loading, refetch } = useRegularizationRequests(selectedProject); // Update regularizesList when regularizes data changes useEffect(() => { setRegularizedList(regularizes); }, [regularizes]); const sortByName = useCallback((a, b) => { const nameA = (a.firstName + a.lastName).toLowerCase(); const nameB = (b.firstName + b.lastName).toLowerCase(); return nameA.localeCompare(nameB); }, []); const handler = useCallback( (msg) => { if (selectedProject === msg.projectId) { // Use strict equality for comparison // Filter out the updated item to effectively remove it from the list // as it's likely been processed (approved/rejected) const updatedAttendance = regularizesList?.filter(item => item.id !== msg.response.id); cacheData("regularizedList", { data: updatedAttendance, projectId: selectedProject, }); // Refetch to get the latest data from the source, ensuring consistency refetch(); } }, [selectedProject, regularizesList, refetch] // Added regularizesList and refetch to dependencies ); const employeeHandler = useCallback( (msg) => { // If any regularization request belongs to the updated employee, refetch if (regularizes?.some((item) => item.employeeId === msg.employeeId)) { // Use strict equality refetch(); } }, [regularizes, refetch] // Added refetch to dependencies ); // Event bus listeners useEffect(() => { eventBus.on("regularization", handler); return () => eventBus.off("regularization", handler); }, [handler]); useEffect(() => { eventBus.on("employee", employeeHandler); return () => eventBus.off("employee", employeeHandler); }, [employeeHandler]); // Search filter logic const filteredData = [...regularizesList] ?.filter((item) => { if (!searchQuery) return true; const lowerSearch = searchQuery.toLowerCase(); const fullName = `${item.firstName || ""} ${item.lastName || ""}`.toLowerCase(); return ( item.firstName?.toLowerCase().includes(lowerSearch) || item.lastName?.toLowerCase().includes(lowerSearch) || fullName.includes(lowerSearch) || item.employeeId?.toLowerCase().includes(lowerSearch) ); }) .sort(sortByName); const { currentPage, totalPages, currentItems, paginate } = usePagination(filteredData, 20); return (
{!loading && currentItems?.length > 0 ? ( currentItems.map((att, index) => ( )) ) : ( )}
Name Date Check-In Check-Out Action
{moment(att.checkOutTime).format("DD-MMM-YYYY")} {convertShortTime(att.checkInTime)} {att.checkOutTime ? convertShortTime(att.checkOutTime) : "--"}
{loading ? "Loading..." : "No Record Found"}
{!loading && totalPages > 1 && ( )}
); }; export default Regularization;