import { useState, useEffect } from 'react'; import Layout from '../../components/Layout'; import AdminProtected from '../../components/AdminProtected'; function CardSubmissionsAdmin() { const [submissions, setSubmissions] = useState([]); const [loading, setLoading] = useState(true); const [error, setError] = useState(null); const [processingId, setProcessingId] = useState(null); const loadSubmissions = async () => { setLoading(true); setError(null); try { const response = await fetch('/api/admin/card-submissions?status=pending', { headers: { Authorization: `Bearer ${localStorage.getItem('auth_token')}`, }, }); if (!response.ok) { throw new Error('Failed to load submissions'); } const data = await response.json(); setSubmissions(data.submissions || []); } catch (err) { setError(err.message); } finally { setLoading(false); } }; useEffect(() => { // eslint-disable-next-line react-hooks/set-state-in-effect -- mount fetch; setLoading runs inside async loader loadSubmissions(); }, []); const reviewSubmission = async (submissionId, action) => { setProcessingId(submissionId); try { const response = await fetch('/api/admin/card-submissions', { method: 'POST', headers: { 'Content-Type': 'application/json', Authorization: `Bearer ${localStorage.getItem('auth_token')}`, }, body: JSON.stringify({ submissionId, action }), }); const data = await response.json(); if (!response.ok) { throw new Error(data.error || 'Review failed'); } await loadSubmissions(); } catch (err) { setError(err.message); } finally { setProcessingId(null); } }; return (
Review cards identified by the scanner that are not yet in the global catalog.
{error && (Loading…
) : submissions.length === 0 ? (No pending submissions.
) : ({sub.ocr_text}
)}