import type { Metadata } from "next"; import Link from "next/link"; import { notFound, redirect } from "next/navigation"; import { PageHeader } from "@/components/status"; import { DateTime } from "@/components/time"; import { Button, buttonVariants } from "@/components/ui/button"; import { Card, CardContent } from "@/components/ui/card"; import { Input } from "@/components/ui/input"; import { Table, TableBody, TableCell, TableHead, TableHeader, TableRow } from "@/components/ui/table"; import { api, unwrap } from "@/lib/api"; import { ConsoleNav, requireConsole } from "../console-nav"; export const metadata: Metadata = { title: "Blocks" }; export default async function BlocksPage({ searchParams }: { searchParams: Promise> }) { const { console: c } = await requireConsole("/console/blocks"); if (!c.sections.includes("blocks")) notFound(); const params = await searchParams; // Looking a file up goes to its page. if (typeof params.sha256 === "string") { const sha256 = params.sha256.trim().toLowerCase(); if (/^[0-9a-f]{64}$/.test(sha256)) redirect(`/console/blocks/${sha256}`); } const before = typeof params.before === "string" && !Number.isNaN(Date.parse(params.before)) ? params.before : undefined; const data = unwrap(await api.blocks.get({ query: before ? { before } : {} })); return ( <> Blocked files: uploads with them are refused, and catalogs delete them.
{data.blocks.length === 0 ? (

Nothing blocked. Block a file from a product's files, or look it up above.

) : ( File Reason By When {data.blocks.map((b) => ( {b.sha256.slice(0, 16)}… {b.reason} {b.by ?? ""} ))}
)}
{data.before && (
Older
)} ); }