import type { Metadata } from "next"; 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 { serverOrigin } from "@/lib/request-origin"; 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 = listTokens(viewer.id); const repos = listReposForUser(viewer.id).map((r) => ({ id: r.id, fullName: `${r.owner}/${r.name}`, writable: canWrite(repoAccess(r, viewer.id)), })); const origin = await serverOrigin(); return (