fix(scanner): resolve stale closure in handleCardScanned

- Add scannedCardsRef to track latest queue state
- Use functional updater in setScannedCards to avoid stale mergeScannedCardEntry input
- Return cardEntry.id synchronously from handleCardScanned so onScanImageUploaded fires

This fixes the scanner queue stopping after 1 card (required page refresh to see more).
This commit is contained in:
Randall Stillwell 2026-09-11 13:07:30 -05:00
parent 4c1d22b935
commit 3dc9b5852f

View file

@ -45,6 +45,11 @@ export function useScannerQueue({ user, sessionDestination, scanDefaults, deckMo
const addingInFlightRef = useRef(new Set()); const addingInFlightRef = useRef(new Set());
const [addingCardIds, setAddingCardIds] = useState(() => new Set()); const [addingCardIds, setAddingCardIds] = useState(() => new Set());
const cartPersistTimerRef = useRef(null); const cartPersistTimerRef = useRef(null);
const scannedCardsRef = useRef(scannedCards);
useEffect(() => {
scannedCardsRef.current = scannedCards;
}, [scannedCards]);
const persistCart = (cards, selection) => { const persistCart = (cards, selection) => {
saveScannerCart({ saveScannerCart({
@ -162,22 +167,25 @@ export function useScannerQueue({ user, sessionDestination, scanDefaults, deckMo
setUndoStack((prev) => prev.filter((u) => u.cardId !== cardId)); setUndoStack((prev) => prev.filter((u) => u.cardId !== cardId));
}, []); }, []);
const handleCardScanned = (cardData) => { const handleCardScanned = useCallback((cardData) => {
setAutoRouteError(null); setAutoRouteError(null);
const { cardEntry, scannedCards: nextQueue } = mergeScannedCardEntry( const { cardEntry, scannedCards: nextQueue } = mergeScannedCardEntry(
scannedCards, scannedCardsRef.current,
cardData, cardData,
scanDefaults scanDefaults
); );
setScannedCards(nextQueue); setScannedCards((prev) => {
setSelectedCards((prev) => { const { cardEntry: ce, scannedCards: nq } = mergeScannedCardEntry(prev, cardData, scanDefaults);
const next = new Set([...prev, cardEntry.id]); setSelectedCards((ps) => {
persistCart(nextQueue, next); const n = new Set([...ps, ce.id]);
return next; persistCart(nq, n);
return n;
});
return nq;
}); });
return cardEntry.id; return cardEntry.id;
}; }, [scanDefaults]);
const incrementCardQuantity = (cardId) => { const incrementCardQuantity = (cardId) => {
setScannedCards((prev) => setScannedCards((prev) =>