diff --git a/components/CollectionsPageView.js b/components/CollectionsPageView.js index 98e7319..7ba1d64 100644 --- a/components/CollectionsPageView.js +++ b/components/CollectionsPageView.js @@ -1,4 +1,3 @@ -/* eslint-disable @next/next/no-img-element -- External or generated image URLs; next/image migration is out of scope. */ import Link from 'next/link'; import PermissionIndicator from './PermissionIndicator'; import { VOCAB, collectionDisplayName } from '../lib/collection-vocabulary.js'; diff --git a/lib/use-camera-scanner.js b/lib/use-camera-scanner.js index 7abfcc8..981dfa4 100644 --- a/lib/use-camera-scanner.js +++ b/lib/use-camera-scanner.js @@ -176,6 +176,16 @@ export function useCameraScanner({ setTrackedCards(next); }, []); + const resetTrackedCard = useCallback((cardId) => { + const next = trackedCardsRef.current.map((card) => ( + card.id === cardId + ? { ...card, status: 'detecting', scanAttempts: 0, negativeAt: undefined } + : card + )); + trackedCardsRef.current = next; + setTrackedCards(next); + }, []); + const resetScanTrackers = useCallback(() => { trackedCardsRef.current = []; setTrackedCards([]); @@ -429,6 +439,7 @@ export function useCameraScanner({ startCamera, stopCamera, removeTrackedCard, + resetTrackedCard, resetScanTrackers, triggerManualScan, streamRef, diff --git a/lib/use-scanner-identification.js b/lib/use-scanner-identification.js index 828113d..0609db9 100644 --- a/lib/use-scanner-identification.js +++ b/lib/use-scanner-identification.js @@ -46,6 +46,7 @@ export function useScannerIdentification({ onCardScanned, onError, onTrackerComplete, + onTrackerReset, videoRef, canvasRef, onVerifyCardRef, @@ -118,10 +119,9 @@ export function useScannerIdentification({ }; const cancelDisambiguation = () => { - if (disambiguation?.cardTracker) { - disambiguation.cardTracker.status = 'detecting'; - disambiguation.cardTracker.scanAttempts = 0; - disambiguation.cardTracker.negativeAt = undefined; + const { cardTracker } = disambiguation ?? {}; + if (cardTracker) { + onTrackerReset?.(cardTracker.id); } setDisambiguation(null); disambiguationRefineRef.current = null; diff --git a/pages/scanner.js b/pages/scanner.js index 093164c..9a8e1f9 100644 --- a/pages/scanner.js +++ b/pages/scanner.js @@ -69,6 +69,7 @@ export default function Scanner() { onCardScanned: queue.handleCardScanned, onError: (msg) => console.error('Identification error:', msg), onTrackerComplete: camera.removeTrackedCard, + onTrackerReset: camera.resetTrackedCard, videoRef: camera.videoRef, canvasRef: camera.canvasRef, onVerifyCardRef, diff --git a/test/setup.js b/test/setup.js index eb1d192..52bd3b3 100644 --- a/test/setup.js +++ b/test/setup.js @@ -1,2 +1,10 @@ process.env.JWT_SECRET = 'test-secret-for-vitest-only-do-not-use-in-prod'; process.env.NODE_ENV = 'test'; + +if (!globalThis.ResizeObserver) { + globalThis.ResizeObserver = class ResizeObserver { + observe() {} + unobserve() {} + disconnect() {} + }; +}