"use client"; import { useState } from "react"; import { clientFetch } from "@/lib/api"; import { toast } from "sonner"; import { User, UserRole } from "@/lib/types"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Input } from "@/components/ui/input"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue, } from "@/components/ui/select"; import { Loader2, Pencil, X, Check } from "lucide-react"; interface Props { initialUsers: User[]; } const roleColor: Record = { [UserRole.ADMIN]: "bg-red-100 text-red-800 border-red-200", [UserRole.MANAGER]: "bg-amber-100 text-amber-800 border-amber-200", [UserRole.MEMBER]: "bg-blue-100 text-blue-700 border-blue-200", }; export function UsersTable({ initialUsers }: Props) { const [users, setUsers] = useState(initialUsers); const [editingId, setEditingId] = useState(null); const [editName, setEditName] = useState(""); const [editRole, setEditRole] = useState(UserRole.MEMBER); const [loading, setLoading] = useState(false); const startEdit = (user: User) => { setEditingId(user.id); setEditName(user.name || ""); setEditRole(user.role); }; const cancelEdit = () => { setEditingId(null); }; const handleUpdate = async (user: User) => { setLoading(true); try { // Update name if changed let updated = user; if (editName !== (user.name || "")) { const res = await clientFetch<{ success: boolean; user: User }>( `/users/${user.id}`, { method: "PATCH", body: JSON.stringify({ name: editName || undefined }), } ); updated = res.user; } // Update role if changed if (editRole !== user.role) { const res = await clientFetch<{ success: boolean; user: User }>( `/users/${user.id}/role`, { method: "PATCH", body: JSON.stringify({ role: editRole }), } ); updated = res.user; } toast.success("User updated."); setUsers((prev) => prev.map((u) => (u.id === user.id ? updated : u))); setEditingId(null); } catch (err: unknown) { toast.error(err instanceof Error ? err.message : "Update failed"); } finally { setLoading(false); } }; return (
{users.length === 0 ? (
No users found.
) : ( users.map((user) => (
{editingId === user.id ? ( /* ── Edit row ─────────────────────────────────────────────── */
setEditName(e.target.value)} />
) : ( /* ── View row ─────────────────────────────────────────────── */ <>
{/* Avatar placeholder */}
{(user.name || user.email).charAt(0)}

{user.name ?? ( No name )}

{user.email}

{user.role} {!user.isActive && ( Inactive )}

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

{/* Actions */} )}
)) )}
); }