import { ForbiddenError, apiGet } from "@/lib/server-api"; import { fmtDateTime } from "@/lib/format"; import type { Account, Me, UserSummary } from "@/lib/types"; import { AccountActions, CreateAccountForm } from "./forms"; export default async function AccountsPage() { const me = await apiGet("/auth/me"); if (me.account.role !== "owner") { return ( <>

Contas do painel

Somente contas owner gerenciam as contas do painel.

); } let accounts: Account[] = []; let users: UserSummary[] = []; try { [accounts, users] = await Promise.all([ apiGet<{ accounts: Account[] }>("/accounts").then((r) => r.accounts), apiGet<{ users: UserSummary[] }>("/users").then((r) => r.users), ]); } catch (err) { if (!(err instanceof ForbiddenError)) throw err; } const userOptions = users.map((u) => ({ id: u.id, name: u.display_name })); return ( <>

Contas do painel

owner gerencia contas; admin altera usuários, lembretes, feriados e configurações; leitura só consulta. Uma conta de leitura ligada a um usuário do Telegram enxerga e altera somente os dados desse usuário. Sempre existe pelo menos um owner ativo.

{accounts.map((a) => ( ))}
Usuário Papel Usuário do Telegram Situação Último login
{a.username} {a.id === me.account.id && (você)} {a.role === "viewer" ? "leitura" : a.role} {userOptions.find((u) => u.id === a.user_id)?.name ?? —} {a.disabled ? ( desativada ) : a.locked_until && new Date(a.locked_until) > new Date() ? ( bloqueada até {fmtDateTime(a.locked_until)} ) : ( ativa )} {fmtDateTime(a.last_login_at)}

Nova conta

); }