"use client"; import { ActionButtonWithTooltip } from "@/components/ui/action-button"; import { ButtonWithTooltip } from "@/components/ui/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 { Check, KeyRound, Pencil, Trash, UserPlus, X } from "lucide-react"; import { useSession } from "next-auth/react"; import AddUserDialog from "./AddUserDialog"; import ChangeRoleDialog from "./ChangeRoleDialog"; import ResetPasswordDialog from "./ResetPasswordDialog"; function toHumanReadableSize(size: number) { const sizes = ["Bytes", "KB", "MB", "GB", "TB"]; if (size === 0) return "0 Bytes"; const i = Math.floor(Math.log(size) / Math.log(1024)); return (size / Math.pow(1024, i)).toFixed(2) + " " + sizes[i]; } export default function UsersSection() { const { data: session } = useSession(); const invalidateUserList = api.useUtils().users.list.invalidate; const { data: users } = api.users.list.useQuery(); const { data: userStats } = api.admin.userStats.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 || !userStats) { return ; } return ( <>
Users List
Name Email Num Bookmarks Asset Sizes Role Local User Actions {users.users.map((u) => ( {u.name} {u.email} {userStats[u.id].numBookmarks} {toHumanReadableSize(userStats[u.id].assetSizes)} {u.role} {u.localUser ? : } deleteUser({ userId: u.id })} loading={isDeletionPending} disabled={session!.user.id == u.id} > ))}
); }