import React, { useState, useEffect, useCallback } from "react"; import moment from "moment"; import Avatar from "../common/Avatar"; import { convertShortTime } 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"; const Attendance = ({ getRole, handleModalData }) => { 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 { 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 filteredData = [...group1, ...group2]; const { currentPage, totalPages, currentItems, paginate } = usePagination( filteredData, ITEMS_PER_PAGE ); const handler = useCallback( (msg) => { if (selectedProject == msg.projectId) { // const updatedAttendance = attendances.map((item) => // item.employeeId === msg.response.employeeId // ? { ...item, ...msg.response } // : item // ); 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 (attendances.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 : {todayDate.toLocaleDateString("en-GB")}
setShowPending(e.target.checked)} />
{Array.isArray(attendance) && attendance.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 && ( No employees assigned to the project! )}
Name Role Check-In Check-Out Actions
{item.jobRoleName} {item.checkInTime ? convertShortTime(item.checkInTime) : "--"} {item.checkOutTime ? convertShortTime(item.checkOutTime) : "--"}
{!loading && filteredData.length > 20 && ( )} ) : attLoading ? (
Loading...
) : (
{Array.isArray(attendance) ? "No employees assigned to the project" : "Attendance data unavailable"}
)} {currentItems?.length == 0 && attendance.length > 0 && (
No Pending Record Available !
)}
); }; export default Attendance;