"use client" import { Button } from "@/components/ui/button" import { Card, CardContent, CardHeader, CardTitle } from "@/components/ui/card" import { Check, X, ShieldAlert, AlertTriangle } from "lucide-react" import { useEffect, useState } from "react" import { Tabs, TabsContent, TabsList, TabsTrigger } from "@/components/ui/tabs" import { getApiUrl } from "@/lib/api-config" import { Badge } from "@/components/ui/badge" interface PendingNickname { id: number performance_id: number nickname: string suggested_by: number created_at: string } interface PendingReport { id: number entity_type: string entity_id: number reason: string details?: string user_id: number created_at: string status: string } export default function ModDashboardPage() { const [pendingNicknames, setPendingNicknames] = useState([]) const [pendingReports, setPendingReports] = useState([]) const [loading, setLoading] = useState(true) const [error, setError] = useState("") useEffect(() => { fetchQueue() }, []) const fetchQueue = async () => { const token = localStorage.getItem("token") if (!token) { setError("Not authenticated") setLoading(false) return } try { const [nicknamesRes, reportsRes] = await Promise.all([ fetch(`${getApiUrl()}/moderation/queue/nicknames`, { headers: { Authorization: `Bearer ${token}` } }), fetch(`${getApiUrl()}/moderation/queue/reports`, { headers: { Authorization: `Bearer ${token}` } }) ]) if (nicknamesRes.status === 403 || reportsRes.status === 403) { setError("Access denied: Moderators only") setLoading(false) return } if (!nicknamesRes.ok || !reportsRes.ok) throw new Error("Failed to fetch queue") setPendingNicknames(await nicknamesRes.json()) setPendingReports(await reportsRes.json()) } catch (err) { console.error(err) setError("Failed to load moderation queue") } finally { setLoading(false) } } const handleNicknameAction = async (id: number, action: "approve" | "reject") => { const token = localStorage.getItem("token") if (!token) return try { // Note: Updated backend uses PUT for nicknames const res = await fetch(`${getApiUrl()}/moderation/nicknames/${id}/${action}`, { method: "PUT", headers: { Authorization: `Bearer ${token}` } }) if (!res.ok) throw new Error(`Failed to ${action}`) // Remove from list setPendingNicknames(prev => prev.filter(n => n.id !== id)) } catch (err) { console.error(err) alert(`Error: ${err}`) } } const handleReportAction = async (id: number, action: "resolve" | "dismiss") => { const token = localStorage.getItem("token") if (!token) return try { // Note: Updated backend uses PUT for reports const res = await fetch(`${getApiUrl()}/moderation/reports/${id}/${action}`, { method: "PUT", headers: { Authorization: `Bearer ${token}` } }) if (!res.ok) throw new Error(`Failed to ${action}`) setPendingReports(prev => prev.filter(r => r.id !== id)) } catch (err) { console.error(err) alert(`Error: ${err}`) } } if (loading) return
Loading dashboard...
if (error) return
{error}
return (

Moderator Dashboard

Reports ({pendingReports.length}) Nicknames ({pendingNicknames.length}) User Reports {pendingReports.length === 0 ? (

No pending reports. Community is safe! 🛡️

) : (
{pendingReports.map(report => (
{report.reason} {report.entity_type} #{report.entity_id}
{report.details && (

"{report.details}"

)}

Reported by User #{report.user_id} • {new Date(report.created_at).toLocaleString()}

))}
)}
Pending Nicknames {pendingNicknames.length === 0 ? (

No pending nicknames.

) : (
{pendingNicknames.map((item) => (

"{item.nickname}"

Performance #{item.performance_id} • User #{item.suggested_by}

{new Date(item.created_at).toLocaleDateString()}

))}
)}
) }