import type { ReactNode } from "react"; import type { HousekeepingResult } from "../../../foundation/contracts"; import type { ContentQueryData } from "../queries/content-queries"; export interface ContentPageProps { readonly context: import("../../../foundation/contracts").HousekeepingCapabilityContext; readonly result?: HousekeepingResult; readonly routeId: import("../routes").ContentRouteId | null; } export function ContentPageFrame({ title, description, result, forms, }: { readonly title: string; readonly description: string; readonly result?: HousekeepingResult; readonly forms?: ReactNode; }) { if (!result) { return (

{title}

{description}

Loading content…

); } if (!result.ok) { const state = result.error.code === "FORBIDDEN" ? "forbidden" : "error"; return (

{title}

{result.error.messageKey}

); } const state = result.data.items.length === 0 ? "empty" : "ready"; return (

{title}

{description}

{forms} {result.data.items.length === 0 ? (

No matching content.

) : (
    {result.data.items.map((item) => (
  • {item.href ? {item.title} : item.title} {item.status ? — {item.status} : null} {item.description ?

    {item.description}

    : null}
  • ))}
)}
); } export function parseContentListInput( searchParams: Readonly< Record >, ) { const first = (value: string | readonly string[] | undefined) => Array.isArray(value) ? value[0] : value; return { search: first(searchParams.search), pageSize: Number(first(searchParams.pageSize) ?? 25), offset: Number(first(searchParams.offset) ?? 0), }; }