"use client"; import { useEffect, useState } from "react"; import Link from "next/link"; import { AcademyPackageSchema } from "@/lib/schemas/academy"; import type { AcademyPackage } from "@/lib/schemas/academy"; import { SiteConfigSchema } from "@/lib/schemas/site-config"; import type { SiteConfig } from "@/lib/schemas/site-config"; import { getTheme } from "@/lib/theme"; const LESSON_TYPE_COLORS: Record = { video: "bg-violet-500/20 text-violet-300", reading: "bg-sky-500/20 text-sky-300", quiz: "bg-amber-500/20 text-amber-300", exercise: "bg-orange-500/20 text-orange-300", }; export default function PreviewPage() { const [academy, setAcademy] = useState(null); const [missing, setMissing] = useState(false); const [siteConfig, setSiteConfig] = useState(null); useEffect(() => { try { const raw = localStorage.getItem("nexus_academy_preview"); if (!raw) { setMissing(true); return; } const parsed = AcademyPackageSchema.parse(JSON.parse(raw)); setAcademy(parsed); } catch { setMissing(true); } try { const rawCfg = localStorage.getItem("nexus_site_config"); if (rawCfg) setSiteConfig(SiteConfigSchema.parse(JSON.parse(rawCfg))); } catch { /* ignore */ } }, []); // I: Open Graph meta tags — injected dynamically for link preview support useEffect(() => { if (!academy) return; const setMeta = (property: string, content: string) => { let el = document.querySelector(`meta[property="${property}"]`); if (!el) { el = document.createElement("meta"); el.setAttribute("property", property); document.head.appendChild(el); } el.setAttribute("content", content); }; setMeta("og:type", "website"); setMeta("og:title", academy.seoMeta.title); setMeta("og:description", academy.seoMeta.description); document.title = academy.seoMeta.title; }, [academy]); if (missing || !academy) { return (

No academy data found — run the pipeline in Nexus Director first.

); } const free = academy.pricing.find((t) => t.priceUsd === 0); const paid = academy.pricing.filter((t) => t.priceUsd > 0); // H: JSON-LD Course structured data for Google rich results const jsonLd = { "@context": "https://schema.org", "@type": "Course", name: academy.academyName, description: academy.seoMeta.description, provider: { "@type": "Organization", name: "Nexus Director" }, educationalLevel: academy.difficultyLevel, timeRequired: academy.totalEstimatedHours > 0 ? `PT${Math.round(academy.totalEstimatedHours * 60)}M` : undefined, hasCourseInstance: academy.curriculum.flatMap((mod) => mod.lessons.map((l) => ({ "@type": "CourseInstance", name: l.title, courseMode: l.type, duration: `PT${l.durationMinutes}M`, })) ), }; const t = getTheme(academy?.themeVariant); const layout = academy?.layoutVariant ?? "centered"; const ctaText = (siteConfig?.ctaOverride || academy?.landingPage.cta) ?? "Get started"; return (