"use client"; import { useState } from "react"; import { toast } from "sonner"; import { Flag } from "lucide-react"; import { Button } from "@/components/ui/button"; import { Dialog, DialogContent, DialogHeader, DialogTitle } from "@/components/ui/dialog"; import { Textarea } from "@/components/ui/textarea"; import { Label } from "@/components/ui/label"; export function ReportButton({ targetType, targetId, variant = "icon", }: { targetType: "recipe" | "comment" | "user"; targetId: string; variant?: "icon" | "text"; }) { const [open, setOpen] = useState(false); const [reason, setReason] = useState(""); const [submitting, setSubmitting] = useState(false); const [submitted, setSubmitted] = useState(false); async function handleSubmit() { if (!reason.trim()) return; setSubmitting(true); try { const res = await fetch("/api/v1/reports", { method: "POST", headers: { "Content-Type": "application/json" }, body: JSON.stringify({ targetType, targetId, reason: reason.trim() }), }); if (!res.ok) { const err = await res.json().catch(() => ({})) as { error?: string }; toast.error(err.error ?? "Failed to submit report"); return; } setSubmitted(true); toast.success("Report submitted — thanks for flagging this"); setTimeout(() => setOpen(false), 800); } finally { setSubmitting(false); } } return ( <> {variant === "icon" ? ( setOpen(true)} className="text-xs text-muted-foreground hover:text-destructive flex items-center gap-1" > Report ) : ( setOpen(true)} aria-label="Report"> )} { setOpen(next); if (!next) { setReason(""); setSubmitted(false); } }}> Report {targetType} {submitted ? ( Thanks — an admin will review this. ) : ( What's wrong with this? setReason(e.target.value)} placeholder="Spam, harassment, off-topic…" rows={3} /> { void handleSubmit(); }} disabled={!reason.trim() || submitting} > {submitting ? "Submitting…" : "Submit report"} )} > ); }
Thanks — an admin will review this.