From 64f75a0fb010d4a12086b839cc9d80ed011aa2b3 Mon Sep 17 00:00:00 2001 From: MohamedBassem Date: Sat, 2 Mar 2024 12:48:26 +0000 Subject: feature: Show user list in admin page --- packages/web/app/dashboard/admin/page.tsx | 193 +++++++++++++++++++++--------- 1 file changed, 134 insertions(+), 59 deletions(-) (limited to 'packages/web/app') diff --git a/packages/web/app/dashboard/admin/page.tsx b/packages/web/app/dashboard/admin/page.tsx index b2f8e9ac..6babdd79 100644 --- a/packages/web/app/dashboard/admin/page.tsx +++ b/packages/web/app/dashboard/admin/page.tsx @@ -13,27 +13,11 @@ import { import { toast } from "@/components/ui/use-toast"; import { api } from "@/lib/trpc"; import { keepPreviousData } from "@tanstack/react-query"; +import { Trash } from "lucide-react"; 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, - }); - +function ActionsSection() { const { mutate: recrawlLinks, isPending: isRecrawlPending } = api.admin.recrawlAllLinks.useMutation({ onSuccess: () => { @@ -65,47 +49,7 @@ export default function AdminPage() { }); 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

Reindex All Bookmarks + + ); +} + +function ServerStatsSection() { + const { data: serverStats } = api.admin.stats.useQuery(undefined, { + refetchInterval: 1000, + placeholderData: keepPreviousData, + }); + + if (!serverStats) { + return ; + } + + return ( + <> +

Server Stats

+ + + + Num Users + {serverStats.numUsers} + + + Num Bookmarks + {serverStats.numBookmarks} + + +
+
+

Background Jobs

+ + + + Pending Crawling Jobs + {serverStats.pendingCrawls} + + + Pending Indexing Jobs + {serverStats.pendingIndexing} + + + Pending OpenAI Jobs + {serverStats.pendingOpenai} + + +
+ + ); +} + +function UsersSection() { + const { data: session } = useSession(); + const invalidateUserList = api.useUtils().users.list.invalidate; + const { data: users } = api.users.list.useQuery(); + const { mutate: deleteUser, isPending: isDeletionPending } = + api.users.delete.useMutation({ + onSuccess: () => { + toast({ + description: "User deleted", + }); + invalidateUserList(); + }, + onError: (e) => { + toast({ + variant: "destructive", + description: `Something went wrong: ${e.message}`, + }); + }, + }); + + if (!users) { + return ; + } + + return ( + <> +

Users

+ + + Name + Email + Role + Action + + + {users.users.map((u) => ( + + {u.name} + {u.email} + {u.role} + + deleteUser({ userId: u.id })} + loading={isDeletionPending} + disabled={session!.user.id == u.id} + > + + + + + ))} + +
+ + ); +} + +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; + } + + return ( +
+

Admin

+
+ +
+ +
+
); } -- cgit v1.2.3-70-g09d2