import { Badge, Container, Flex, Heading, Table } from "@chakra-ui/react" import { useQuery, useQueryClient } from "@tanstack/react-query" import { createFileRoute, useNavigate } from "@tanstack/react-router" import { z } from "zod" import { type UserPublic, UsersService } from "@/client" import AddUser from "@/components/Admin/AddUser" import { UserActionsMenu } from "@/components/Common/UserActionsMenu" import PendingUsers from "@/components/Pending/PendingUsers" import { PaginationItems, PaginationNextTrigger, PaginationPrevTrigger, PaginationRoot, } from "@/components/ui/pagination.tsx" const usersSearchSchema = z.object({ page: z.number().catch(1), }) const PER_PAGE = 5 function getUsersQueryOptions({ page }: { page: number }) { return { queryFn: () => UsersService.readUsers({ skip: (page - 1) * PER_PAGE, limit: PER_PAGE }), queryKey: ["users", { page }], } } export const Route = createFileRoute("/_layout/admin")({ component: Admin, validateSearch: (search) => usersSearchSchema.parse(search), }) function UsersTable() { const queryClient = useQueryClient() const currentUser = queryClient.getQueryData(["currentUser"]) const navigate = useNavigate({ from: Route.fullPath }) const { page } = Route.useSearch() const { data, isLoading, isPlaceholderData } = useQuery({ ...getUsersQueryOptions({ page }), placeholderData: (prevData) => prevData, }) const setPage = (page: number) => navigate({ search: (prev: { [key: string]: string }) => ({ ...prev, page }), }) const users = data?.data.slice(0, PER_PAGE) ?? [] const count = data?.count ?? 0 if (isLoading) { return } return ( <> Full name Email Role Status Actions {users?.map((user) => ( {user.full_name || "N/A"} {currentUser?.id === user.id && ( You )} {user.email} {user.is_superuser ? "Superuser" : "User"} {user.is_active ? "Active" : "Inactive"} ))} setPage(page)} > ) } function Admin() { return ( Users Management ) }