import React, { useState, useEffect } from "react"; import moment from "moment"; import DateRangePicker from "../common/DateRangePicker"; import { useDispatch, useSelector } from "react-redux"; import { fetchEmployeeAttendanceData } from "../../slices/apiSlice/employeeAttendanceSlice"; import usePagination from "../../hooks/usePagination"; import Avatar from "../common/Avatar"; import { convertShortTime } from "../../utils/dateUtils"; import RenderAttendanceStatus from "../Activities/RenderAttendanceStatus"; import AttendLogs from "../Activities/AttendLogs"; import { useAttendanceByEmployee } from "../../hooks/useAttendance"; import GlobalModel from "../common/GlobalModel"; import { ITEMS_PER_PAGE } from "../../utils/constants"; const EmpAttendance = ({ employee }) => { const [attendances, setAttendnaces] = useState([]); const [selectedDate, setSelectedDate] = useState(""); const [dateRange, setDateRange] = useState({ startDate: "", endDate: "" }); const [isModalOpen, setIsModalOpen] = useState(false); const [attendanceId, setAttendanecId] = useState(); const { data = [], isLoading: loading, isFetching, isError, error, refetch, } = useAttendanceByEmployee(employee, dateRange.startDate, dateRange.endDate); const dispatch = useDispatch(); // const { data, loading, error } = useSelector( // (store) => store.employeeAttendance // ); const [isRefreshing, setIsRefreshing] = useState(true); const today = new Date(); today.setHours(0, 0, 0, 0); const isSameDay = (dateStr) => { if (!dateStr) return false; const d = new Date(dateStr); d.setHours(0, 0, 0, 0); return d.getTime() === today.getTime(); }; const isBeforeToday = (dateStr) => { if (!dateStr) return false; const d = new Date(dateStr); d.setHours(0, 0, 0, 0); return d.getTime() < today.getTime(); }; const sortByName = (a, b) => { const nameA = a.firstName.toLowerCase() + a.lastName.toLowerCase(); const nameB = b.firstName.toLowerCase() + b.lastName.toLowerCase(); return nameA?.localeCompare(nameB); }; const group1 = data .filter((d) => d.activity === 1 && isSameDay(d.checkInTime)) .sort(sortByName); const group2 = data .filter((d) => d.activity === 4 && isSameDay(d.checkOutTime)) .sort(sortByName); const group3 = data .filter((d) => d.activity === 1 && isBeforeToday(d.checkInTime)) .sort(sortByName); const group4 = data .filter((d) => d.activity === 4 && isBeforeToday(d.checkOutTime)) .sort(sortByName); const group5 = data.filter((d) => d.activity === 5).sort(sortByName); // const sortedFinalList = [ // ...group1, // ...group2, // ...group3, // ...group4, // ...group5, // ]; const uniqueMap = new Map(); [...group1, ...group2, ...group3, ...group4, ...group5].forEach((rec) => { const date = moment(rec.checkInTime || rec.checkOutTime).format( "YYYY-MM-DD" ); const key = `${rec.employeeId}-${date}`; const existing = uniqueMap.get(key); if ( !existing || new Date(rec.checkInTime || rec.checkOutTime) > new Date(existing.checkInTime || existing.checkOutTime) ) { uniqueMap.set(key, rec); } }); const sortedFinalList = [...uniqueMap.values()].sort( (a, b) => new Date(b.checkInTime || b.checkOutTime) - new Date(a.checkInTime || a.checkOutTime) ); const currentDate = new Date().toLocaleDateString("en-CA"); const { currentPage, totalPages, currentItems, paginate } = usePagination( sortedFinalList, ITEMS_PER_PAGE ); const openModal = (id) => { setAttendanecId(id); setIsModalOpen(true); }; const closeModal = () => setIsModalOpen(false); return ( <> {isModalOpen && ( )}
refetch()} />
{!loading && data.length === 0 && No employee logs} {isError &&
{error.message}
} {loading && !data &&
Loading...
} {data && data.length > 0 && ( {currentItems?.map((attendance, index) => ( ))}
Name Date {" "} Check-In {" "} Check-Out Action
{" "} {moment(attendance.checkInTime).format("DD-MMM-YYYY")} {convertShortTime(attendance.checkInTime)} {attendance.checkOutTime ? convertShortTime(attendance.checkOutTime) : "--"}
)}
{!loading && sortedFinalList.length > 20 && ( )}
); }; export default EmpAttendance;