import { useDeferredValue, useEffect, useMemo, useState, useCallback, } from "react"; import { View, Text } from "react-native"; import { useFocusEffect } from "@react-navigation/native"; import { LogsTable } from "@/components/features/logs/LogsTable"; import { LoadingSpinner } from "@/components/ui/LoadingSpinner"; import { NoData } from "@/components/ui/NoData"; import { useGetUserLogsQuery } from "@/store/api/usersApi"; import { TableSortDirection } from "@/constants/tableSortDirectionEnum"; import { useAppSelector } from "@/store/hooks"; import { selectIsMobile } from "@/store/screen/screenSizeSlice"; export const LogsPage = () => { const [page, setPage] = useState(0); const [itemsPerPage, setItemsPerPage] = useState(25); const [searchQuery, setSearchQuery] = useState(""); const [sortColumn, setSortColumn] = useState(null); const [sortDirection, setSortDirection] = useState( TableSortDirection.ASCENDING ); const isMobile = useAppSelector(selectIsMobile); const deferredSearch = useDeferredValue(searchQuery); const [debouncedSearch, setDebouncedSearch] = useState(deferredSearch); useEffect(() => { const handler = setTimeout( () => setDebouncedSearch(deferredSearch.trim()), 450 ); return () => clearTimeout(handler); }, [deferredSearch]); const queryArgs = useMemo(() => { const searchParam = debouncedSearch && debouncedSearch.length >= 2 ? debouncedSearch : undefined; return { page: page + 1, limit: itemsPerPage, search: searchParam, } as const; }, [page, itemsPerPage, debouncedSearch]); const { data: logsData, isLoading, isFetching, error, refetch, } = useGetUserLogsQuery(queryArgs); const logs = logsData?.items ?? []; const totalItems = logsData?.total ?? 0; const from = logs.length ? page * itemsPerPage + 1 : 0; const to = logs.length ? Math.min(from + logs.length - 1, totalItems) : 0; // Refetch whenever the screen/page gains focus useFocusEffect( useCallback(() => { refetch(); }, [refetch]) ); return ( Users login activity {isLoading ? ( Loading logs... ) : error ? ( ) : ( { setSearchQuery(q); setPage(0); }} sortColumn={sortColumn} sortDirection={sortDirection} onSort={(column) => { if (sortColumn === column) { setSortDirection((d) => d === TableSortDirection.ASCENDING ? TableSortDirection.DESCENDING : TableSortDirection.ASCENDING ); } else { setSortColumn(column); setSortDirection(TableSortDirection.ASCENDING); } setPage(0); }} onItemsPerPageChange={(value) => { setItemsPerPage(value); setPage(0); }} onPageChange={(newPage) => setPage(newPage)} /> )} ); };