import type { Metadata } from "next"; import { headers } from "next/headers"; import { Label as MuLabel } from "@unlocalhosted/metalui"; import { deleteTokenAction } from "@/app/actions/settings"; import { ConfirmButton } from "@/components/confirm-button"; import { ShieldLockIcon } from "@/components/icons"; import { SettingsSection } from "@/components/metal"; import { ListRow, PlateSection, RowGlyph } from "@/components/settings-plate"; import { Blankslate, Label, PageTitle, RefChip } from "@/components/ui"; import { requireViewer } from "@/lib/auth"; import { formatDate, timeAgo } from "@/lib/format"; import { canWrite, listReposForUser, repoAccess } from "@/lib/repos"; import { listTokens, TOKEN_PREFIX } from "@/lib/tokens"; import { NewTokenForm } from "./form"; export const metadata: Metadata = { title: "API tokens" }; function Expiry({ expiresAt, expired }: { expiresAt: number | null; expired: boolean }) { if (!expiresAt) return Never expires; if (expired) return ( <> Expired {timeAgo(expiresAt)} > ); return ( <> Expires {formatDate(expiresAt)} > ); } export default async function TokensPage() { const viewer = await requireViewer(); const tokens = await listTokens(viewer.id); const repos = await Promise.all( (await listReposForUser(viewer.id)).map(async (r) => ({ id: r.id, fullName: `${r.owner}/${r.name}`, writable: canWrite(await repoAccess(r, viewer.id)), })), ); const h = await headers(); const origin = `${h.get("x-forwarded-proto") ?? "http"}://${h.get("host") ?? "localhost:3000"}`; return (