diff --git a/src/components/Activities/AttendcesLogs.jsx b/src/components/Activities/AttendcesLogs.jsx index 5c62c912..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 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,21 +59,19 @@ const AttendanceLog = ({ handleModalData, projectId, showOnlyCheckout }) => { 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(() => { - // Filter the raw data based on showOnlyCheckout const filteredData = showOnlyCheckout - ? data.filter((item) => item.checkInTime && item.checkOutTime) + ? data.filter((item) => item.checkOutTime === null) : data; const group1 = filteredData @@ -95,13 +108,18 @@ const AttendanceLog = ({ handleModalData, projectId, showOnlyCheckout }) => { // Create the final sorted array const finalData = sortedDates.flatMap((date) => groupedByDate[date]); setProcessedData(finalData); - }, [data, showOnlyCheckout]); // Re-run this effect when data or showOnlyCheckout changes + }, [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 ( <>
{
setIsRefreshing(!isRefreshing)} + onClick={() => setIsRefreshing(true)} />
@@ -139,8 +157,12 @@ const AttendanceLog = ({ handleModalData, projectId, showOnlyCheckout }) => { - {loading && Loading...} - {paginatedAttendances.reduce((acc, attendance, index, arr) => { + {(loading || isRefreshing) && ( + + Loading... + + )} + {!loading && !isRefreshing && paginatedAttendances.reduce((acc, attendance, index, arr) => { const currentDate = moment(attendance.checkInTime || attendance.checkOutTime).format("YYYY-MM-DD"); const previousAttendance = arr[index - 1]; const previousDate = previousAttendance ? moment(previousAttendance.checkInTime || previousAttendance.checkOutTime).format("YYYY-MM-DD") : null; @@ -196,10 +218,14 @@ const AttendanceLog = ({ handleModalData, projectId, showOnlyCheckout }) => { )} - {!loading && data.length === 0 && No employee logs} - {error && {error}} + {!loading && !isRefreshing && data.length === 0 && No employee logs} + {error && !loading && !isRefreshing && ( + + {error} + + )} - {!loading && processedData.length > 10 && ( + {!loading && !isRefreshing && processedData.length > 10 && (