diff --git a/src/components/Activities/AttendcesLogs.jsx b/src/components/Activities/AttendcesLogs.jsx index c42ce1ab..b57a9c75 100644 --- a/src/components/Activities/AttendcesLogs.jsx +++ b/src/components/Activities/AttendcesLogs.jsx @@ -1,4 +1,4 @@ -import React, { useEffect, useState } from "react"; +import React, { useEffect, useState, useMemo, useCallback } from "react"; import moment from "moment"; import Avatar from "../common/Avatar"; import { convertShortTime } from "../../utils/dateUtils"; @@ -7,13 +7,28 @@ import { useSelector, useDispatch } from "react-redux"; import { fetchAttendanceData } from "../../slices/apiSlice/attedanceLogsSlice"; import DateRangePicker from "../common/DateRangePicker"; import { getCachedData } from "../../slices/apiDataManager"; -import usePagination from "../../hooks/usePagination"; -const AttendanceLog = ({ handleModalData, projectId }) => { +const usePagination = (data, itemsPerPage) => { + const [currentPage, setCurrentPage] = useState(1); + const maxPage = Math.ceil(data.length / itemsPerPage); + + const currentItems = useMemo(() => { + const startIndex = (currentPage - 1) * itemsPerPage; + const endIndex = startIndex + itemsPerPage; + return data.slice(startIndex, endIndex); + }, [data, currentPage, itemsPerPage]); + + const paginate = useCallback((pageNumber) => setCurrentPage(pageNumber), []); + const resetPage = useCallback(() => setCurrentPage(1), []); + + return { currentPage, totalPages: maxPage, currentItems, paginate, resetPage }; +}; + +const AttendanceLog = ({ handleModalData, projectId, showOnlyCheckout }) => { const [dateRange, setDateRange] = useState({ startDate: "", endDate: "" }); const dispatch = useDispatch(); const { data, loading, error } = useSelector((store) => store.attendanceLogs); - const [isRefreshing, setIsRefreshing] = useState(true); + const [isRefreshing, setIsRefreshing] = useState(false); const [processedData, setProcessedData] = useState([]); const today = new Date(); @@ -44,33 +59,36 @@ const AttendanceLog = ({ handleModalData, projectId }) => { useEffect(() => { const { startDate, endDate } = dateRange; - if (startDate && endDate) { - dispatch( - fetchAttendanceData({ - projectId, - fromDate: startDate, - toDate: endDate, - }) - ); - } - }, [dateRange, projectId, isRefreshing]); + dispatch( + fetchAttendanceData({ + projectId, + fromDate: startDate, + toDate: endDate, + }) + ); + setIsRefreshing(false); + }, [dateRange, projectId, dispatch, isRefreshing]); useEffect(() => { - const group1 = data + const filteredData = showOnlyCheckout + ? data.filter((item) => item.checkOutTime === null) + : data; + + const group1 = filteredData .filter((d) => d.activity === 1 && isSameDay(d.checkInTime)) .sort(sortByName); - const group2 = data + const group2 = filteredData .filter((d) => d.activity === 4 && isSameDay(d.checkOutTime)) .sort(sortByName); - const group3 = data + const group3 = filteredData .filter((d) => d.activity === 1 && isBeforeToday(d.checkInTime)) .sort(sortByName); - const group4 = data + const group4 = filteredData .filter((d) => d.activity === 4 && isBeforeToday(d.checkOutTime)); - const group5 = data + const group5 = filteredData .filter((d) => d.activity === 2 && isBeforeToday(d.checkOutTime)) .sort(sortByName); - const group6 = data.filter((d) => d.activity === 5).sort(sortByName); + const group6 = filteredData.filter((d) => d.activity === 5).sort(sortByName); const sortedList = [...group1, ...group2, ...group3, ...group4, ...group5, ...group6]; @@ -90,13 +108,18 @@ const AttendanceLog = ({ handleModalData, projectId }) => { // Create the final sorted array const finalData = sortedDates.flatMap((date) => groupedByDate[date]); setProcessedData(finalData); - }, [data]); + }, [data, showOnlyCheckout]); - const { currentPage, totalPages, currentItems: paginatedAttendances, paginate } = usePagination( + const { currentPage, totalPages, currentItems: paginatedAttendances, paginate, resetPage } = usePagination( processedData, 10 ); + // Reset to the first page whenever processedData changes (due to switch on/off) + useEffect(() => { + resetPage(); + }, [processedData, resetPage]); + return ( <>