"use client"; import { useState } from "react"; import { toast } from "sonner"; import { KeyRound, Mail, MoreVertical, Trash2 } from "lucide-react"; import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuSeparator, DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import { ConfirmDeleteDialog } from "@/components/confirm-delete-dialog"; import { UserRoleMenu } from "@/components/admin/user-role-menu"; import { EditUserEmailDialog } from "@/components/admin/edit-user-email-dialog"; import { ChangePasswordDialog } from "@/components/admin/change-password-dialog"; import { deleteUser } from "@/lib/actions/admin"; import { Role } from "@/lib/generated/prisma/enums"; export interface AdminUserRow { id: string; name: string | null; email: string; role: Role; createdAtLabel: string; } export function AdminUserTable({ initialUsers, currentUserId, }: { initialUsers: AdminUserRow[]; currentUserId: string; }) { const [users, setUsers] = useState(initialUsers); const [emailDialogFor, setEmailDialogFor] = useState(null); const [passwordDialogFor, setPasswordDialogFor] = useState(null); const [deleteDialogFor, setDeleteDialogFor] = useState(null); async function handleDelete(userId: string) { const result = await deleteUser(userId); if (result?.error) { toast.error(result.error); return; } setUsers((prev) => prev.filter((u) => u.id !== userId)); } return ( <>
{users.map((user) => { const isSelf = user.id === currentUserId; return ( ); })}
Name Email Role Joined Actions
{user.name || "—"} {user.email} {user.createdAtLabel} } /> setEmailDialogFor(user)}> Edit email setPasswordDialogFor(user)}> Change password setDeleteDialogFor(user)} > Delete account
{emailDialogFor && ( !open && setEmailDialogFor(null)} onSaved={(email) => setUsers((prev) => prev.map((u) => (u.id === emailDialogFor.id ? { ...u, email } : u))) } /> )} {passwordDialogFor && ( !open && setPasswordDialogFor(null)} /> )} {deleteDialogFor && ( !open && setDeleteDialogFor(null)} title="Delete account?" description={`Delete ${deleteDialogFor.email}? This permanently deletes their account and all of their categories, groups, and to-dos. This can't be undone.`} onConfirm={() => handleDelete(deleteDialogFor.id)} /> )} ); }