"use client"; import { ActionButton } from "@/components/ui/action-button"; import LoadingSpinner from "@/components/ui/spinner"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { toast } from "@/components/ui/use-toast"; import { api } from "@/lib/trpc"; import { keepPreviousData } from "@tanstack/react-query"; import { useSession } from "next-auth/react"; import { useRouter } from "next/navigation"; export default function AdminPage() { const router = useRouter(); const { data: session, status } = useSession(); if (status == "loading") { return ; } if (!session || session.user.role != "admin") { router.push("/"); return; } const { data } = api.admin.stats.useQuery(undefined, { refetchInterval: 1000, placeholderData: keepPreviousData, }); const { mutate: recrawlLinks, isPending: isRecrawlPending } = api.admin.recrawlAllLinks.useMutation({ onSuccess: () => { toast({ description: "Recrawl enqueued", }); }, onError: (e) => { toast({ variant: "destructive", description: e.message, }); }, }); const { mutate: reindexBookmarks, isPending: isReindexPending } = api.admin.reindexAllBookmarks.useMutation({ onSuccess: () => { toast({ description: "Reindex enqueued", }); }, onError: (e) => { toast({ variant: "destructive", description: e.message, }); }, }); return (

Admin


{data ? ( <>

Server Stats

Num Users {data.numUsers} Num Bookmarks {data.numBookmarks}

Background Jobs

Pending Crawling Jobs {data.pendingCrawls} Pending Indexing Jobs {data.pendingIndexing} Pending OpenAI Jobs {data.pendingOpenai}
) : ( )}

Actions

recrawlLinks()} > Recrawl All Links reindexBookmarks()} > Reindex All Bookmarks
); }