"use client"; import { Ban, CheckCircle, Edit, Trash2 } from "lucide-react"; import { useCallback, useEffect, useState } from "react"; import { getUserApi } from "@/lib/api-helpers"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Card, CardContent, CardDescription, CardHeader, CardTitle } from "@/components/ui/card"; import { Dialog, DialogContent, DialogDescription, DialogFooter, DialogHeader, DialogTitle, } from "@/components/ui/dialog"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import { api } from "@/lib/api"; import { useSession } from "@/lib/auth-client"; type User = { id: string; name: string; email: string; role: string; createdAt: string; emailVerified: boolean; isSuspended: boolean; suspendedUntil: string | null; }; export default function UsersPage() { const { data: session } = useSession(); const [users, setUsers] = useState([]); const [loading, setLoading] = useState(true); const [editingUser, setEditingUser] = useState(null); const [suspendingUser, setSuspendingUser] = useState(null); const [deleteUser, setDeleteUser] = useState(null); const fetchUsers = useCallback(async () => { try { const { data } = await api.api.users.get(); if (data && typeof data === "object" && "users" in data) { setUsers(data.users as User[]); } } catch (error) { console.error("Failed to fetch users:", error); } finally { setLoading(false); } }, []); useEffect(() => { fetchUsers(); }, [fetchUsers]); const handleEdit = async (e: React.FormEvent) => { e.preventDefault(); if (!editingUser) return; const formData = new FormData(e.currentTarget); const name = formData.get("name") as string; const role = formData.get("role") as string; try { const { error } = await api.api.users({ id: editingUser.id }).patch({ name, role: role as "admin" | "user", }); if (!error) { await fetchUsers(); setEditingUser(null); } } catch (error) { console.error("Failed to update user:", error); } }; const handleSuspend = async (e: React.FormEvent) => { e.preventDefault(); if (!suspendingUser) return; const formData = new FormData(e.currentTarget); const suspendedUntil = formData.get("suspendedUntil") as string; try { const { error } = await getUserApi(suspendingUser.id).suspension.patch({ isSuspended: true, suspendedUntil: suspendedUntil || null, }); if (!error) { await fetchUsers(); setSuspendingUser(null); } } catch (error) { console.error("Failed to suspend user:", error); } }; const handleUnsuspend = async (userId: string) => { try { const { error } = await getUserApi(userId).suspension.patch({ isSuspended: false, suspendedUntil: null, }); if (!error) { await fetchUsers(); } } catch (error) { console.error("Failed to unsuspend user:", error); } }; const handleDelete = async () => { if (!deleteUser) return; try { const { error } = await api.api.users({ id: deleteUser.id }).delete(); if (!error) { await fetchUsers(); setDeleteUser(null); } } catch (error) { console.error("Failed to delete user:", error); } }; const isUserSuspended = (user: User): boolean => { if (!user.isSuspended) return false; if (user.suspendedUntil && new Date(user.suspendedUntil) <= new Date()) { return false; } return true; }; if (loading) { return (
Loading...
); } return (

User Management

Manage user accounts and permissions

Users All registered users in the system
Name Email Role Status Created Actions {users.map((user) => ( {user.name} {user.email} {user.role}
{isUserSuspended(user) ? ( Suspended {user.suspendedUntil && ` until ${new Date(user.suspendedUntil).toLocaleDateString()}`} ) : ( {user.emailVerified ? "Active" : "Unverified"} )}
{new Date(user.createdAt).toLocaleDateString()}
{isUserSuspended(user) ? ( ) : ( )}
))}
{/* Edit Dialog */} setEditingUser(null)}> Edit User Update user information and role
{/* Suspend Dialog */} setSuspendingUser(null)}> Suspend User Suspend {suspendingUser?.name} from accessing the system

Leave empty for indefinite suspension

{/* Delete Dialog */} setDeleteUser(null)}> Delete User Are you sure you want to delete {deleteUser?.name}? This action cannot be undone.
); }