"use client"; import { useCallback, useEffect, useState } from "react"; import { useRouter } from "next/navigation"; import Logo from "../../../components/asset/Logo"; import Button from "../../../components/buttons/Button"; import Alert from "../../../components/modals/Alert"; import CommunityRule from "../../../components/type/CommunityRule"; import { useTranslation } from "../../../contexts/MessagesContext"; import { makeCopyPublishedRule } from "../../../../lib/create/api"; import { communityPossessive } from "../../../../lib/create/ruleInviteCardMeta"; import { CREATE_FLOW_COPIED_QUERY, CREATE_FLOW_COPIED_VALUE } from "../../../../lib/create/invitePaths"; import { formatInviteLastChanged } from "../../../../lib/create/inviteLastChanged"; import { writeLastPublishedRule } from "../../../../lib/create/lastPublishedRule"; import { downloadStoredRuleAsPdf } from "../../../../lib/create/ruleExport"; import { createCompletedPath } from "../../create/utils/createFlowPaths"; import { CreateFlowHeaderLockup } from "../../create/components/CreateFlowHeaderLockup"; import { useCreateFlowMdUp } from "../../create/hooks/useCreateFlowMdUp"; import { CREATE_FLOW_MD_UP_GRID_CELL_CLASS, CREATE_FLOW_PAGE_GUTTER_CLASS, CREATE_FLOW_SCROLL_REGION_CLASS, CREATE_FLOW_TWO_COLUMN_MAX_WIDTH_CLASS, CREATE_FLOW_VIEWPORT_FRAME_CLASS, } from "../../create/components/createFlowLayoutTokens"; import { parsePublishedDocumentForCommunityRuleDisplay } from "../../../../lib/create/publishedDocumentToDisplaySections"; import { MakeACopyDialog } from "./MakeACopyDialog"; import type { CommunityRuleSection } from "../../../components/type/CommunityRule/CommunityRule.types"; const outlineButtonClass = "md:!text-x-small-label !text-xx-small-label !px-[var(--space-150)] md:!px-[var(--space-200)] !py-[6px] md:!py-[8px] !border md:!border-[1.5px]"; const SURFACE = "bg-[var(--color-teal-teal50,#c9fef9)]"; export type InvitedRuleViewProps = { ruleId: string; title: string; summary: string | null; document: Record; updatedAt: string; inviterEmail: string | null; viewerEmail: string; countsSpoken: string; openCopyDialog?: boolean; }; export function InvitedRuleView({ ruleId, title, summary, document, updatedAt, inviterEmail, viewerEmail, countsSpoken, openCopyDialog = false, }: InvitedRuleViewProps) { const t = useTranslation("pages.invite"); const router = useRouter(); const mdUp = useCreateFlowMdUp(); const [copyOpen, setCopyOpen] = useState(openCopyDialog); const [copyBusy, setCopyBusy] = useState(false); const [copyError, setCopyError] = useState(null); const [exportError, setExportError] = useState(false); const sections: CommunityRuleSection[] = parsePublishedDocumentForCommunityRuleDisplay(document); const possessive = communityPossessive(title); const lastChanged = formatInviteLastChanged(updatedAt); const bannerTitle = inviterEmail ? t("bannerTitle").replace("{email}", inviterEmail) : t("bannerTitleNoEmail"); const whoCanEdit = inviterEmail ?? t("whoCanEditUnknown"); useEffect(() => { if (!openCopyDialog) return; router.replace(`/invite/${encodeURIComponent(ruleId)}`); }, [openCopyDialog, ruleId, router]); const handlePdf = useCallback(() => { try { downloadStoredRuleAsPdf({ id: ruleId, title, summary, document, }); setExportError(false); } catch { setExportError(true); } }, [document, ruleId, summary, title]); const handleCopy = useCallback( async (communityName: string) => { setCopyBusy(true); setCopyError(null); const result = await makeCopyPublishedRule(ruleId, communityName); setCopyBusy(false); if (result.ok === false) { setCopyError(t("copyFailed")); return; } writeLastPublishedRule({ id: result.id, title: result.title, summary: result.summary, document: result.document, copiedFromTitle: result.copiedFromTitle, copiedNameHit: result.copiedNameHit, }); router.push( createCompletedPath({ [CREATE_FLOW_COPIED_QUERY]: CREATE_FLOW_COPIED_VALUE, }), ); }, [ruleId, router, t], ); return (
{exportError ? (

{t("exportFailedDescription")}

) : null}

{t("factsHeading")}

{t("copyCardTitle")}

{t("copyCardBody").replace("{counts}", countsSpoken)}

{t("privacy")}

{ if (!copyBusy) setCopyOpen(false); }} possessive={possessive} countsSpoken={countsSpoken} viewerEmail={viewerEmail} busy={copyBusy} error={copyError} onConfirm={(communityName) => { void handleCopy(communityName); }} />
); } function FactRow({ label, value }: { label: string; value: string }) { return (

{label}

{value}

); }