"use client"; import { useState, useEffect, useMemo } from "react"; import { useMediaQuery } from "../../hooks/useMediaQuery"; import HeaderLockup from "../../components/type/HeaderLockup"; import RuleCard from "../../components/cards/RuleCard"; import type { Category } from "../../components/cards/RuleCard/RuleCard.types"; import { useCreateFlow } from "../context/CreateFlowContext"; const TITLE = "Review your CommunityRule"; const DESCRIPTION = "Here's what other people will see. Make sure everything looks good before you finalize everything. Once the rule is finalized, you must use one of your decision-making mechanisms to edit it again."; const RULE_CARD_TITLE_FALLBACK = "Your community"; const RULE_CARD_DESCRIPTION_FALLBACK = "Add a short description of your community on earlier steps when that field is available. For now, this card shows your community name."; /** Static categories for final review (read-only display). */ const FINAL_REVIEW_CATEGORIES: Category[] = [ { name: "Values", chipOptions: [ { id: "v1", label: "Consciousness", state: "unselected" }, { id: "v2", label: "Ecology", state: "unselected" }, { id: "v3", label: "Abundance", state: "unselected" }, { id: "v4", label: "Art", state: "unselected" }, { id: "v5", label: "Decisiveness", state: "unselected" }, ], }, { name: "Communication", chipOptions: [{ id: "c1", label: "Signal", state: "unselected" }], }, { name: "Membership", chipOptions: [{ id: "m1", label: "Open Admission", state: "unselected" }], }, { name: "Decision-making", chipOptions: [ { id: "d1", label: "Lazy Consensus", state: "unselected" }, { id: "d2", label: "Modified Consensus", state: "unselected" }, ], }, { name: "Conflict management", chipOptions: [ { id: "cf1", label: "Code of Conduct", state: "unselected" }, { id: "cf2", label: "Restorative Justice", state: "unselected" }, ], }, ]; /** * Final review step (right before completed). * Figma: 20907-212767 (full-size), 20976-220705 (small breakpoint). */ export default function FinalReviewPage() { const { state } = useCreateFlow(); const [isMounted, setIsMounted] = useState(false); const isMdOrLarger = useMediaQuery("(min-width: 640px)"); const ruleCardTitle = useMemo(() => { const t = typeof state.title === "string" ? state.title.trim() : ""; return t.length > 0 ? t : RULE_CARD_TITLE_FALLBACK; }, [state.title]); const ruleCardDescription = useMemo(() => { const s = typeof state.summary === "string" ? state.summary.trim() : ""; return s.length > 0 ? s : RULE_CARD_DESCRIPTION_FALLBACK; }, [state.summary]); // Avoid flash: only use breakpoint after mount so SSR and first paint use same layout (desktop). useEffect(() => { // eslint-disable-next-line react-hooks/set-state-in-effect -- intentional: defer layout breakpoint until after mount to prevent flash setIsMounted(true); }, []); const showDesktopLayout = !isMounted || isMdOrLarger; if (showDesktopLayout) { return (
{}} />
); } return (
{}} />
); }