"use client"; import { useState } from "react"; import { useRouter } from "next/navigation"; import { useTranslations, useLocale } from "next-intl"; import { formatDistanceToNow } from "@/lib/date"; import { MoreHorizontal, Shield, User, Trash2, BadgeCheck } from "lucide-react"; import { Avatar, AvatarFallback, AvatarImage } from "@/components/ui/avatar"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { AlertDialog, AlertDialogAction, AlertDialogCancel, AlertDialogContent, AlertDialogDescription, AlertDialogFooter, AlertDialogHeader, AlertDialogTitle, } from "@/components/ui/alert-dialog"; import { toast } from "sonner"; interface User { id: string; email: string; username: string; name: string | null; avatar: string | null; role: "ADMIN" | "USER"; verified: boolean; createdAt: Date; _count: { prompts: number; }; } interface UsersTableProps { users: User[]; } export function UsersTable({ users }: UsersTableProps) { const router = useRouter(); const t = useTranslations("admin.users"); const locale = useLocale(); const [deleteUserId, setDeleteUserId] = useState(null); const [loading, setLoading] = useState(false); const handleRoleChange = async (userId: string, newRole: "ADMIN" | "USER") => { try { const res = await fetch(`/api/admin/users/${userId}`, { method: "PATCH", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ role: newRole }), }); if (!res.ok) throw new Error("Failed to update role"); toast.success(t("roleUpdated")); router.refresh(); } catch { toast.error(t("roleUpdateFailed")); } }; const handleVerifyToggle = async (userId: string, verified: boolean) => { try { const res = await fetch(`/api/admin/users/${userId}`, { method: "PATCH", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ verified }), }); if (!res.ok) throw new Error("Failed to update verification"); toast.success(verified ? t("verified") : t("unverified")); router.refresh(); } catch { toast.error(t("verifyFailed")); } }; const handleDelete = async () => { if (!deleteUserId) return; setLoading(true); try { const res = await fetch(`/api/admin/users/${deleteUserId}`, { method: "DELETE", }); if (!res.ok) throw new Error("Failed to delete user"); toast.success(t("deleted")); router.refresh(); } catch { toast.error(t("deleteFailed")); } finally { setLoading(false); setDeleteUserId(null); } }; return ( <>

{t("title")}

{t("description")}

{t("user")} {t("email")} {t("role")} {t("prompts")} {t("joined")} {users.map((user) => (
{user.name?.charAt(0) || user.username.charAt(0)}
{user.name || user.username} {user.verified && }
@{user.username}
{user.email} {user.role === "ADMIN" ? : } {user.role} {user._count.prompts} {formatDistanceToNow(user.createdAt, locale)} {user.role === "USER" ? ( handleRoleChange(user.id, "ADMIN")}> {t("makeAdmin")} ) : ( handleRoleChange(user.id, "USER")}> {t("removeAdmin")} )} handleVerifyToggle(user.id, !user.verified)}> {user.verified ? t("unverify") : t("verify")} setDeleteUserId(user.id)} > {t("delete")}
))}
setDeleteUserId(null)}> {t("deleteConfirmTitle")} {t("deleteConfirmDescription")} {t("cancel")} {t("delete")} ); }