"use client"; import { useEffect, useRef, useState } from "react"; import { api } from "./StartGame"; import { reportCategories } from "@/shared/moderation"; export function ReportContent({ datasetId, sessionId, round, }: { datasetId?: string; sessionId?: string; round?: number; }) { const [open, setOpen] = useState(false); const [target, setTarget] = useState("map"); const [category, setCategory] = useState("broken"); const [reason, setReason] = useState(""); const [evidenceUrl, setEvidenceUrl] = useState(""); const [busy, setBusy] = useState(false); const [error, setError] = useState(""); const [message, setMessage] = useState(""); const dialog = useRef(null); useEffect(() => { if (!open) return; const element = dialog.current; const previousFocus = document.activeElement instanceof HTMLElement ? document.activeElement : null; element?.showModal(); return () => { element?.close(); previousFocus?.focus(); }; }, [open]); async function submit(event: React.FormEvent) { event.preventDefault(); setBusy(true); setError(""); try { await api("reports", { datasetId, sessionId, round, target, category, reason, evidenceUrl: evidenceUrl.trim() || undefined, }); setMessage( "Report sent for moderator review. Only confirmed reports count toward the three-report map ban.", ); setOpen(false); setReason(""); setEvidenceUrl(""); } catch (e) { setError((e as Error).message); } finally { setBusy(false); } } return ( <> {message && (

{message}

)} {open && ( setOpen(false)} >

Report content

Sign in to send a report. A moderator reviews the content and your explanation. Three confirmed reports unpublish the map until an owner appeal is approved.