"use client"; import { useState } from "react"; import { Button } from "~/components/ui/button"; import { Badge } from "~/components/ui/badge"; import { Input } from "~/components/ui/input"; import { Label } from "~/components/ui/label"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "~/components/ui/select"; import { Dialog, DialogContent, DialogDescription, DialogHeader, DialogTitle, DialogTrigger, } from "~/components/ui/dialog"; import { api } from "~/trpc/react"; import { formatRole, getAvailableRoles } from "~/lib/auth-client"; import type { SystemRole } from "~/lib/auth-client"; interface UserWithRoles { id: string; name: string | null; email: string; image: string | null; createdAt: Date; roles: SystemRole[]; } export function AdminUserTable() { const [search, setSearch] = useState(""); const [selectedRole, setSelectedRole] = useState(""); const [page, setPage] = useState(1); const [selectedUser, setSelectedUser] = useState(null); const [roleToAssign, setRoleToAssign] = useState(""); const { data: usersData, isLoading, refetch, } = api.users.list.useQuery({ page, limit: 10, search: search || undefined, role: selectedRole || undefined, }); const assignRole = api.users.assignRole.useMutation({ onSuccess: () => { void refetch(); setSelectedUser(null); setRoleToAssign(""); }, }); const removeRole = api.users.removeRole.useMutation({ onSuccess: () => { void refetch(); }, }); const handleAssignRole = () => { if (!selectedUser || !roleToAssign) return; assignRole.mutate({ userId: selectedUser.id, role: roleToAssign, }); }; const handleRemoveRole = (userId: string, role: SystemRole) => { removeRole.mutate({ userId, role, }); }; const availableRoles = getAvailableRoles(); if (isLoading) { return (
); } return (
{/* Filters */}
setSearch(e.target.value)} />
{/* Users Table */}
{usersData?.users.map((user) => ( ))}
User Email Roles Created Actions
{(user.name ?? user.email).charAt(0).toUpperCase()}

{user.name ?? "Unnamed User"}

ID: {user.id.slice(0, 8)}...

{user.email}

{user.roles.length > 0 ? ( user.roles.map((role) => (
{formatRole(role)}
)) ) : ( No roles )}

{new Date(user.createdAt).toLocaleDateString()}

Manage User Roles Assign or remove roles for {user.name ?? user.email}
{user.roles.length > 0 ? ( user.roles.map((role) => (
{formatRole(role)}

{ availableRoles.find( (r) => r.value === role, )?.description }

)) ) : (

No roles assigned

)}
{/* Pagination */} {usersData && usersData.pagination.pages > 1 && (

Showing {usersData.users.length} of {usersData.pagination.total}{" "} users

{page} of {usersData.pagination.pages}
)} {/* Error Messages */} {assignRole.error && (

Error assigning role

{assignRole.error.message}

)} {removeRole.error && (

Error removing role

{removeRole.error.message}

)}
); }