import { revalidatePath } from "next/cache"; import { redirect } from "next/navigation"; import { auth } from "@/auth"; import { NotAuthorized } from "@/components/ShellEmpty"; import type { SessionWithExtras } from "@/lib/session"; import { canSee } from "@/lib/session"; import { fetchCatalog, fetchEntitlements, fetchTenantBySlug, requestProduct, startTrial, type CatalogEntry, } from "@/lib/tenant-registry"; export default async function CatalogPage({ params, searchParams, }: { params: Promise<{ slug: string }>; searchParams: Promise<{ ok?: string; err?: string }>; }) { const { slug } = await params; const flash = await searchParams; const session = (await auth()) as SessionWithExtras | null; if (!canSee(session, "catalog")) return ; const tenant = await fetchTenantBySlug(slug); if (!tenant) redirect(`/${slug}/dashboard`); const [catalog, entitlements] = await Promise.all([ fetchCatalog(), fetchEntitlements(tenant.id), ]); const enabled = new Set(entitlements.filter((e) => e.enabled).map((e) => e.product)); async function doRequest(formData: FormData) { "use server"; const product = String(formData.get("product")); const tenantId = String(formData.get("tenant_id")); const slugV = String(formData.get("slug")); const res = await requestProduct(tenantId, product); const param = res.ok ? `ok=requested:${product}` : `err=${res.error}`; redirect(`/${slugV}/catalog?${param}`); } async function doTrial(formData: FormData) { "use server"; const product = String(formData.get("product")); const tenantId = String(formData.get("tenant_id")); const slugV = String(formData.get("slug")); const res = await startTrial(tenantId, product); const param = res.ok ? `ok=trial:${product}` : `err=${res.error}`; revalidatePath(`/${slugV}/catalog`); redirect(`/${slugV}/catalog?${param}`); } return (

Catalog

Pick a product to add to your plan. Trial-eligible products start a 14-day evaluation; everything else opens a CRM lead for sales follow-up.

    {catalog.map((p) => ( ))}
); } function FlashBanner({ ok, err }: { ok?: string; err?: string }) { if (!ok && !err) return null; const isOk = !!ok; return (
{isOk ? `OK — ${ok}` : `Error — ${err}`}
); } function CatalogCard({ product, owned, tenantId, slug, doRequest, doTrial, }: { product: CatalogEntry; owned: boolean; tenantId: string; slug: string; doRequest: (fd: FormData) => Promise; doTrial: (fd: FormData) => Promise; }) { return (
  • {product.name}

    {product.description}

    Plans: {product.plans_required.join(", ")}
    {owned ? ( Active ) : (
    {product.supports_trial && (
    )}
    )}
  • ); }