"use client"; import { use, useEffect, useState } from "react"; import HeaderLockup from "../../../components/type/HeaderLockup"; import { TemplateReviewCard } from "../../../components/cards/TemplateReviewCard"; import { useTranslation } from "../../../contexts/MessagesContext"; import { useMediaQuery } from "../../../hooks/useMediaQuery"; import { fetchTemplateBySlug, type RuleTemplateDto, } from "../../../../lib/create/fetchTemplates"; import messages from "../../../../messages/en/index"; import Alert from "../../../components/modals/Alert"; interface PageProps { params: Promise<{ slug: string }>; } /** * Template review: same responsive grid and RuleCard chrome as final-review; * copy from Figma 22142-898702 (intro + dynamic card from API). */ export default function ReviewTemplatePage({ params }: PageProps) { const { slug: rawSlug } = use(params); const slug = decodeURIComponent(rawSlug); const t = useTranslation("create.templateReview"); const [template, setTemplate] = useState(null); const [error, setError] = useState(null); const [loading, setLoading] = useState(true); const [isMounted, setIsMounted] = useState(false); const isMdOrLarger = useMediaQuery("(min-width: 640px)"); useEffect(() => { // eslint-disable-next-line react-hooks/set-state-in-effect -- match final-review: defer breakpoint until mount setIsMounted(true); }, []); useEffect(() => { let cancelled = false; void (async () => { if (!cancelled) { setLoading(true); setError(null); } const result = await fetchTemplateBySlug(slug); if (cancelled) return; if (result === null) { setError(messages.create.templateReview.errors.notFound); setTemplate(null); } else if ("error" in result) { setError(result.error); setTemplate(null); } else { setTemplate(result); setError(null); } setLoading(false); })(); return () => { cancelled = true; }; }, [slug]); const showDesktopLayout = !isMounted || isMdOrLarger; if (loading) { return (

{t("loading")}

); } if (error || !template) { return (
); } if (showDesktopLayout) { return (
); } return (
); }