"use client"; import { useState } from "react"; import useSWR from "swr"; import AppShell from "@/components/AppShell"; import { ConfirmDialog, EmptyState, FormError, LoadError, Modal, PageHeader, SkeletonRows, StatusBadge, } from "@/components/ui"; import { useToast } from "@/components/toast"; import { api, fetcher } from "@/lib/api"; type User = { id: number; email: string; full_name: string | null; role: string; is_active: boolean; }; const ROLES = ["readonly", "support", "admin"]; export default function UsersPage() { const { data: users, error: usersError, isLoading, mutate } = useSWR( "/api/users", fetcher ); const toast = useToast(); const [open, setOpen] = useState(false); const [form, setForm] = useState({ email: "", password: "", full_name: "", role: "readonly" }); const [error, setError] = useState(null); const [creating, setCreating] = useState(false); const [deleteId, setDeleteId] = useState(null); const [deleting, setDeleting] = useState(false); const create = async (e: React.FormEvent) => { e.preventDefault(); setError(null); setCreating(true); try { await api("/api/users", { method: "POST", body: JSON.stringify(form) }); setOpen(false); setForm({ email: "", password: "", full_name: "", role: "readonly" }); toast.success("User created"); mutate(); } catch (err: any) { setError(err.message); toast.error(err.message || "Could not create user"); } finally { setCreating(false); } }; const update = async (id: number, patch: Partial) => { try { await api(`/api/users/${id}`, { method: "PATCH", body: JSON.stringify(patch) }); toast.success("User updated"); mutate(); } catch (err: any) { toast.error(err.message || "Update failed"); } }; const remove = async () => { if (deleteId == null) return; setDeleting(true); try { await api(`/api/users/${deleteId}`, { method: "DELETE" }); toast.success("User deleted"); mutate(); } catch (err: any) { toast.error(err.message || "Delete failed"); } finally { setDeleting(false); setDeleteId(null); } }; return ( setOpen(true)}> + New user } /> {isLoading && !users ? ( ) : usersError ? ( mutate()} /> ) : (users || []).length === 0 ? ( ) : (
{(users || []).map((u) => ( ))}
Email Name Role Active
{u.email} {u.full_name || "—"}
)} setOpen(false)} title="Create user">
setForm({ ...form, email: e.target.value })} required />
setForm({ ...form, full_name: e.target.value })} />
setForm({ ...form, password: e.target.value })} required />
setDeleteId(null)} />
); }