diff --git a/lib/use-scanner-queue.js b/lib/use-scanner-queue.js index 173aea2..4128bcb 100644 --- a/lib/use-scanner-queue.js +++ b/lib/use-scanner-queue.js @@ -45,6 +45,11 @@ export function useScannerQueue({ user, sessionDestination, scanDefaults, deckMo const addingInFlightRef = useRef(new Set()); const [addingCardIds, setAddingCardIds] = useState(() => new Set()); const cartPersistTimerRef = useRef(null); + const scannedCardsRef = useRef(scannedCards); + + useEffect(() => { + scannedCardsRef.current = scannedCards; + }, [scannedCards]); const persistCart = (cards, selection) => { saveScannerCart({ @@ -162,22 +167,25 @@ export function useScannerQueue({ user, sessionDestination, scanDefaults, deckMo setUndoStack((prev) => prev.filter((u) => u.cardId !== cardId)); }, []); - const handleCardScanned = (cardData) => { + const handleCardScanned = useCallback((cardData) => { setAutoRouteError(null); const { cardEntry, scannedCards: nextQueue } = mergeScannedCardEntry( - scannedCards, + scannedCardsRef.current, cardData, scanDefaults ); - setScannedCards(nextQueue); - setSelectedCards((prev) => { - const next = new Set([...prev, cardEntry.id]); - persistCart(nextQueue, next); - return next; + setScannedCards((prev) => { + const { cardEntry: ce, scannedCards: nq } = mergeScannedCardEntry(prev, cardData, scanDefaults); + setSelectedCards((ps) => { + const n = new Set([...ps, ce.id]); + persistCart(nq, n); + return n; + }); + return nq; }); return cardEntry.id; - }; + }, [scanDefaults]); const incrementCardQuantity = (cardId) => { setScannedCards((prev) => diff --git a/pages/my-cards.js b/pages/my-cards.js index 3815e77..7c3a7cd 100644 --- a/pages/my-cards.js +++ b/pages/my-cards.js @@ -437,11 +437,16 @@ export default function MyCards() { {/* Cards Grid */}
+ {cards.length === 0 && !loading && ( +
+

No cards loaded from /api/cards/owned (summary shows {collectionSummary?.totalCards ?? 'N/A'} via /api/user/stats).

+
+ )} {cards.map((card) => ( +