import "server-only";
import { PrototypeGalleryClient } from "@prototype/components/prototype-gallery-client";
import {
PrototypeGalleryHeader,
PrototypeGalleryPageLayout,
} from "@prototype/components/shell/prototype-gallery-shell";
import { createPrototypeRegistry } from "@prototype/lib/prototypes/create-prototype-registry";
import type { PrototypeConfig } from "@prototype/lib/prototypes/prototype-config-types";
import { formatSourceDirectoryName } from "@prototype/lib/format-source-directory-name";
import { readScreenshotManifest } from "../lib/prototypes/screenshot-manifest";
import { sortPrototypesByCreationDate } from "../lib/prototypes/sort-prototypes-by-creation-date";
import { readHostEnvValue, resolveHostRoot } from "../server/host-env";
import { reconcilePrototypeRegistry } from "../server/redis/prototype-telemetry";
type PrototypeGalleryPageOptions = {
title?: string;
description?: string;
eyebrow?: string;
sourcePath?: string;
};
export function createPrototypeGalleryPage(
config: PrototypeConfig,
options: PrototypeGalleryPageOptions = {},
) {
const registry = createPrototypeRegistry(config);
const {
title = "Prototypes",
description = "UI experiments and concept explorations. Select a prototype to open it.",
eyebrow,
sourcePath = readHostEnvValue(resolveHostRoot(), "SOURCE_PATH"),
} = options;
const sourceDirectoryName = formatSourceDirectoryName(sourcePath);
async function PrototypeGallery() {
const [prototypes, screenshotManifest] = await Promise.all([
Promise.resolve(registry.getAllPrototypes()),
readScreenshotManifest(),
]);
// Detect prototypes added/removed since the last gallery load and emit
// server-origin creation/deletion telemetry. Never block or break the page.
try {
await reconcilePrototypeRegistry(
prototypes.map((prototype) => ({
slug: prototype.slug,
title: prototype.title,
})),
);
} catch (error) {
console.error("Prototype registry telemetry reconcile error:", error);
}
const sortedPrototypes = await sortPrototypesByCreationDate(prototypes);
const screenshotVersions =
process.env.NODE_ENV === "development" ? screenshotManifest : {};
return (
);
}
function HomePage() {
return (
}
>
);
}
return HomePage;
}