93 lines
3.6 KiB
TypeScript
93 lines
3.6 KiB
TypeScript
|
|
import Link from "next/link";
|
||
|
|
import { listDocuments, readDocument } from "@/lib/wiki";
|
||
|
|
import { ChatBubble } from "@/components/chat-bubble";
|
||
|
|
import { AuthBar } from "@/components/auth-bar";
|
||
|
|
import { BatchProgressBanner } from "@/components/batch-progress-banner";
|
||
|
|
import { getLocale } from "@/components/locale-toggle";
|
||
|
|
import { summarize, pickPitch } from "@/lib/doc-summary";
|
||
|
|
import { DocListFilters } from "@/components/doc-list-filters";
|
||
|
|
|
||
|
|
// Read wiki/ filesystem at request time, not build time.
|
||
|
|
export const dynamic = "force-dynamic";
|
||
|
|
|
||
|
|
export default async function Home() {
|
||
|
|
const ids = await listDocuments();
|
||
|
|
const locale = await getLocale();
|
||
|
|
const summaryLang: "pt" | "en" = locale === "en" ? "en" : "pt";
|
||
|
|
|
||
|
|
const docs = await Promise.all(
|
||
|
|
ids.map(async (id) => {
|
||
|
|
const f = await readDocument(id);
|
||
|
|
return {
|
||
|
|
id,
|
||
|
|
title: (f?.fm.canonical_title as string) ?? id,
|
||
|
|
pages: (f?.fm.page_count as number) ?? 0,
|
||
|
|
collection: (f?.fm.collection as string) ?? "uncategorized",
|
||
|
|
classification: (f?.fm.highest_classification as string) ?? "—",
|
||
|
|
summary: pickPitch(f?.fm as Record<string, unknown> | undefined, summaryLang) ?? (f?.body ? summarize(f.body, summaryLang) : ""),
|
||
|
|
};
|
||
|
|
}),
|
||
|
|
);
|
||
|
|
|
||
|
|
return (
|
||
|
|
<main className="min-h-screen p-6 md:p-10 max-w-[1600px] mx-auto">
|
||
|
|
<header className="mb-12 border-b border-[rgba(0,255,156,0.32)] pb-6">
|
||
|
|
<div className="flex items-start justify-between gap-4 mb-2">
|
||
|
|
<div className="font-mono text-[10px] text-[#5a6678] tracking-[0.18em] uppercase">
|
||
|
|
// THE DISCLOSURE BUREAU // CLASSIFIED ARCHIVE //
|
||
|
|
</div>
|
||
|
|
<div className="flex items-center gap-2">
|
||
|
|
<Link
|
||
|
|
href="/search"
|
||
|
|
className="font-mono text-xs px-3 py-1.5 border border-[#ffa500] text-[#ffa500] hover:bg-[rgba(255,165,0,0.10)] rounded"
|
||
|
|
title="Hybrid search (or ⌘K anywhere)"
|
||
|
|
>
|
||
|
|
🔍 search
|
||
|
|
</Link>
|
||
|
|
<Link
|
||
|
|
href="/timeline"
|
||
|
|
className="font-mono text-xs px-3 py-1.5 border border-[#ff8a4d] text-[#ff8a4d] hover:bg-[rgba(255,138,77,0.10)] rounded"
|
||
|
|
>
|
||
|
|
📅 timeline
|
||
|
|
</Link>
|
||
|
|
<Link
|
||
|
|
href="/graph"
|
||
|
|
className="font-mono text-xs px-3 py-1.5 border border-[#7fdbff] text-[#7fdbff] hover:bg-[rgba(127,219,255,0.10)] rounded"
|
||
|
|
>
|
||
|
|
🕸 graph
|
||
|
|
</Link>
|
||
|
|
<Link
|
||
|
|
href="/admin/stats"
|
||
|
|
className="font-mono text-xs px-3 py-1.5 border border-[#a78bfa] text-[#a78bfa] hover:bg-[rgba(167,139,250,0.10)] rounded"
|
||
|
|
title="Corpus analytics"
|
||
|
|
>
|
||
|
|
📊 stats
|
||
|
|
</Link>
|
||
|
|
<Link
|
||
|
|
href="/admin/batch"
|
||
|
|
className="font-mono text-xs px-3 py-1.5 border border-[rgba(0,255,156,0.30)] text-[#00ff9c] hover:bg-[rgba(0,255,156,0.10)] rounded"
|
||
|
|
title="Batch rebuild progress"
|
||
|
|
>
|
||
|
|
📈 batch
|
||
|
|
</Link>
|
||
|
|
<AuthBar />
|
||
|
|
</div>
|
||
|
|
</div>
|
||
|
|
<h1 className="font-mono text-3xl text-[#00ff9c] mb-2">
|
||
|
|
▍ war.gov/ufo — Investigative Wiki
|
||
|
|
</h1>
|
||
|
|
<p className="text-[#8896aa] text-sm">
|
||
|
|
{docs.length} declassified documents · {docs.reduce((s, d) => s + d.pages, 0)} pages ·
|
||
|
|
AI-cataloged by the Investigation Bureau (Holmes · Poirot · Dupin · Locard)
|
||
|
|
</p>
|
||
|
|
</header>
|
||
|
|
|
||
|
|
<BatchProgressBanner />
|
||
|
|
|
||
|
|
<DocListFilters docs={docs} />
|
||
|
|
|
||
|
|
<ChatBubble context={{}} />
|
||
|
|
</main>
|
||
|
|
);
|
||
|
|
}
|