'use client'; import { useCallback, useEffect, useState } from 'react'; import { ForwardTargetDialog } from '../ForwardTargetDialog'; interface PendingMessage { id: string; content: string; senderJid: string; senderName: string | null; tags: string[]; createdAt: string; sourceGroupId: string; sourceGroupName: string; sourceGroupPlatformId: string; } export default function PendingMessagesPage() { const [messages, setMessages] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const load = useCallback(() => { setLoading(true); fetch('/api/messages/pending') .then(async (res) => { if (!res.ok) throw new Error(`API ${res.status}`); return res.json() as Promise; }) .then((data) => { setMessages(data); setError(null); }) .catch((err: Error) => setError(err.message)) .finally(() => setLoading(false)); }, []); useEffect(() => { load(); }, [load]); return (

Pending messages

Messages waiting for admin approval. Click "Approve & Forward" to choose which groups to send to.

{error && (
Failed to load: {error}
)} {!loading && !error && messages.length === 0 && (
No pending messages right now.
)}
    {messages.map((m) => ( setMessages((prev) => prev.filter((x) => x.id !== m.id))} /> ))}
); } function PendingMessageRow({ message, onApproved, }: { message: PendingMessage; onApproved: () => void; }) { const [dialogOpen, setDialogOpen] = useState(false); return (
  • {message.sourceGroupName}
    {new Date(message.createdAt).toLocaleString()}
    From {message.senderName ?? message.senderJid} {message.tags.length > 0 && ( {message.tags.map((t) => ( {t} ))} )}
    {message.content}
    {dialogOpen && ( setDialogOpen(false)} /> )}
  • ); }