import { useMemo } from 'react'; import { Button } from '../ui'; import ReviewCardItem from './ReviewCardItem'; export default function ScannerReview({ queue, collections, decks, deckMode, onContinueScanning, onNewSession, sessionDestination, }) { const { scannedCards } = queue; const unprocessedCards = useMemo( () => scannedCards.filter((c) => !c.processed), [scannedCards] ); const processedCards = useMemo( () => scannedCards.filter((c) => c.processed), [scannedCards] ); const deckProgress = deckMode ? { current: scannedCards.length, target: deckMode.targetSize } : null; const handleConfirmAll = () => { if (unprocessedCards.length === 0) return; const unprocessedIds = unprocessedCards.map((c) => c.id); unprocessedIds.forEach((id) => queue.toggleCardSelection(id)); setTimeout(() => queue.handleBulkAction('owned'), 0); }; if (scannedCards.length === 0) { return (

No cards to review

Scan some cards first, then come back to review and confirm them.

); } return (
{/* Header */}

Review{' '} ({scannedCards.length} {scannedCards.length === 1 ? 'card' : 'cards'})

{/* Deck progress (if applicable) */} {deckProgress && (
Deck progress {deckProgress.current} / {deckProgress.target}
)} {/* Scrollable card list */}
{/* Unprocessed cards first */} {unprocessedCards.length > 0 && (

Pending ({unprocessedCards.length})

{unprocessedCards.map((card) => ( queue.incrementCardQuantity(card.id)} onDecrement={() => queue.decrementCardQuantity(card.id)} onUpdateMetadata={(patch) => queue.updateCardMetadata(card.id, patch)} onRemove={() => queue.removeScannedCard(card.id)} isAdding={false} sessionDestination={sessionDestination} /> ))}
)} {/* Processed cards */} {processedCards.length > 0 && (
0 ? 'mt-4' : ''}>

Confirmed ({processedCards.length})

{processedCards.map((card) => ( {}} onDecrement={() => {}} onUpdateMetadata={() => {}} onRemove={() => {}} onUndo={() => queue.updateCardMetadata(card.id, { processed: false, processedAction: null })} isAdding={false} sessionDestination={sessionDestination} /> ))}
)}
{/* Sticky bottom action bar */}
); }