"use client"; import { useState } from "react"; import { Loader2Icon } from "lucide-react"; import { Badge } from "@/components/ui/badge"; import { Button } from "@/components/ui/button"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow, } from "@/components/ui/table"; import type { AdminAppUser } from "@/server/admin/app-users"; type ApiResponse = { ok: boolean; data: T; error?: string; }; export function UsersManager({ initialUsers, }: { initialUsers: AdminAppUser[]; }) { const [users, setUsers] = useState(initialUsers); const [updatingId, setUpdatingId] = useState(null); const [error, setError] = useState(null); const updateStatus = async (user: AdminAppUser) => { const status = user.status === "active" ? "disabled" : "active"; setUpdatingId(user.id); setError(null); try { const res = await fetch(`/api/admin/app-users/${user.id}`, { method: "PATCH", headers: { "content-type": "application/json", }, body: JSON.stringify({ status }), }); const json = (await res.json()) as ApiResponse; if (!json.ok) { throw new Error(json.error || "Failed to update user."); } setUsers((current) => current.map((item) => item.id === json.data.id ? json.data : item, ), ); } catch (err) { setError(err instanceof Error ? err.message : "Unknown error."); } finally { setUpdatingId(null); } }; return (

App users

{users.length} total
{error ?

{error}

: null}
Email Provider Status Favorites Last login Created Actions {users.map((user) => (
{user.email ?? user.phone ?? "No email"}
{user.display_name ? (
{user.display_name}
) : null}
{user.auth_provider} {user.status} {user.favorite_count} {user.last_login_at ? new Date( user.last_login_at, ).toLocaleDateString() : "-"} {new Date( user.created_at, ).toLocaleDateString()}
))} {users.length === 0 && ( No app users yet. )}
); }