import { z } from "zod" import { Button, Container, Flex, Heading, Skeleton, Table, TableContainer, Tbody, Td, Th, Thead, Tr, } from "@chakra-ui/react" import { useQuery, useQueryClient } from "@tanstack/react-query" import { createFileRoute, useNavigate } from "@tanstack/react-router" import { useEffect } from "react" import { ItemsService } from "../../client" import ActionsMenu from "../../components/Common/ActionsMenu" import Navbar from "../../components/Common/Navbar" const itemsSearchSchema = z.object({ page: z.number().catch(1), }) export const Route = createFileRoute("/_layout/items")({ component: Items, validateSearch: (search) => itemsSearchSchema.parse(search), }) const PER_PAGE = 5 function getItemsQueryOptions({ page }: { page: number }) { return { queryFn: () => ItemsService.readItems({ skip: (page - 1) * PER_PAGE, limit: PER_PAGE }), queryKey: ["items", { page }], } } function ItemsTable() { const queryClient = useQueryClient() const { page } = Route.useSearch() const navigate = useNavigate({ from: Route.fullPath }) const setPage = (page: number) => navigate({ search: (prev) => ({ ...prev, page }) }) const { data: items, isPending, isPlaceholderData, } = useQuery({ ...getItemsQueryOptions({ page }), placeholderData: (prevData) => prevData, }) const hasNextPage = !isPlaceholderData && items?.data.length === PER_PAGE const hasPreviousPage = page > 1 useEffect(() => { if (hasNextPage) { queryClient.prefetchQuery(getItemsQueryOptions({ page: page + 1 })) } }, [page, queryClient]) return ( <> {isPending ? ( {new Array(5).fill(null).map((_, index) => ( {new Array(4).fill(null).map((_, index) => ( ))} ))} ) : ( {items?.data.map((item) => ( ))} )}
ID Title Description Actions
{item.id} {item.title} {item.description || "N/A"}
Page {page} ) } function Items() { return ( Items Management ) }