"use client"; import { useEffect, useState } from "react"; import { api } from "@/lib/api"; import { shortenPubkey } from "@/lib/nostr"; import { formatDate } from "@/lib/utils"; import { Clock, CheckCircle, XCircle, Inbox, } from "lucide-react"; interface Submission { id: string; eventId?: string; naddr?: string; title: string; authorPubkey: string; status: string; reviewedBy?: string; reviewNote?: string; createdAt: string; } type FilterStatus = "ALL" | "PENDING" | "APPROVED" | "REJECTED"; const TABS: { value: FilterStatus; label: string }[] = [ { value: "ALL", label: "All" }, { value: "PENDING", label: "Pending" }, { value: "APPROVED", label: "Approved" }, { value: "REJECTED", label: "Rejected" }, ]; export default function AdminSubmissionsPage() { const [submissions, setSubmissions] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(""); const [filter, setFilter] = useState("PENDING"); const [reviewingId, setReviewingId] = useState(null); const [reviewNote, setReviewNote] = useState(""); const [processing, setProcessing] = useState(false); const loadSubmissions = async () => { try { const status = filter === "ALL" ? undefined : filter; const data = await api.getSubmissions(status); setSubmissions(data); } catch (err: any) { setError(err.message); } finally { setLoading(false); } }; useEffect(() => { setLoading(true); loadSubmissions(); }, [filter]); const handleReview = async (id: string, status: "APPROVED" | "REJECTED") => { setProcessing(true); setError(""); try { await api.reviewSubmission(id, { status, reviewNote: reviewNote.trim() || undefined }); setReviewingId(null); setReviewNote(""); await loadSubmissions(); } catch (err: any) { setError(err.message); } finally { setProcessing(false); } }; const pendingCount = submissions.filter((s) => s.status === "PENDING").length; return (

User Submissions

{pendingCount > 0 && filter !== "PENDING" && ( {pendingCount} pending )}
{error &&

{error}

}
{TABS.map((tab) => ( ))}
{loading ? (
{[1, 2, 3].map((i) => (
))}
) : submissions.length === 0 ? (

No {filter !== "ALL" ? filter.toLowerCase() : ""} submissions.

) : (
{submissions.map((sub) => (

{sub.title}

by {shortenPubkey(sub.authorPubkey)} {formatDate(sub.createdAt)} {sub.eventId && ( {sub.eventId.slice(0, 16)}... )} {sub.naddr && ( {sub.naddr.slice(0, 20)}... )}
{sub.reviewNote && (

{sub.reviewNote}

)} {sub.status === "PENDING" && (
{reviewingId === sub.id ? (