"use client"; import { useState } from "react"; import { UserCog, Trash2, Pencil, Ban, CheckCircle2 } from "lucide-react"; import { PageHeader } from "@/components/ui/PageHeader"; import { Button } from "@/components/ui/button"; import { Card, CardContent } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; import { Label } from "@/components/ui/label"; import { Badge } from "@/components/ui/badge"; import { Select, SelectContent, SelectItem, SelectTrigger, SelectValue } from "@/components/ui/select"; import { useRouter } from "next/navigation"; import { updateUserRoleAction, updateUserStatusAction, updateUserInfoAction, deleteUserAction, } from "./actions"; type UserEntry = { id: number; email: string; name: string | null; role: "admin" | "user" | "viewer"; provider: string | null; subject: string | null; avatarUrl: string | null; status: string; createdAt: string; updatedAt: string; }; type Props = { users: UserEntry[]; }; const ROLE_COLORS: Record = { admin: "bg-red-500/10 text-red-600 dark:text-red-400 border-red-500/30", user: "bg-blue-500/10 text-blue-600 dark:text-blue-400 border-blue-500/30", viewer: "bg-gray-500/10 text-gray-600 dark:text-gray-400 border-gray-500/30", }; const STATUS_COLORS: Record = { active: "bg-emerald-500/10 text-emerald-600 dark:text-emerald-400 border-emerald-500/30", disabled: "bg-red-500/10 text-red-600 dark:text-red-400 border-red-500/30", }; export default function UsersClient({ users }: Props) { const router = useRouter(); const [editUserId, setEditUserId] = useState(null); const [search, setSearch] = useState(""); const filtered = search ? users.filter( (u) => u.name?.toLowerCase().includes(search.toLowerCase()) || u.email.toLowerCase().includes(search.toLowerCase()) || u.role.includes(search.toLowerCase()) ) : users; return (
setSearch(e.target.value)} className="max-w-xs" /> {filtered.length} user{filtered.length !== 1 ? "s" : ""}
{filtered.length === 0 && (

No users found.

)}
{filtered.map((user) => ( {editUserId === user.id ? ( setEditUserId(null)} onSave={() => { setEditUserId(null); router.refresh(); }} /> ) : ( setEditUserId(user.id)} onRefresh={() => router.refresh()} /> )} ))}
); } function UserRow({ user, onEdit, onRefresh, }: { user: UserEntry; onEdit: () => void; onRefresh: () => void; }) { const isDisabled = user.status !== "active"; return (
{(user.name ?? user.email)[0]?.toUpperCase()}
{user.name ?? user.email.split("@")[0]} {isDisabled && ( disabled )}
{user.email} ยท {user.provider}
{user.role}
{user.status === "active" ? ( ) : ( )}
); } function EditUserRow({ user, onClose, onSave, }: { user: UserEntry; onClose: () => void; onSave: () => void; }) { const [role, setRole] = useState(user.role); return (
Editing {user.name ?? user.email}
{ await updateUserInfoAction(user.id, formData); if (role !== user.role) { await updateUserRoleAction(user.id, role); } onSave(); }} className="grid grid-cols-1 sm:grid-cols-3 gap-3" >
); }