import { useRef } from 'react'; import { useCameraScanner } from '../lib/use-camera-scanner.js'; import { useScannerIdentification } from '../lib/use-scanner-identification.js'; import ScanDisambiguationDialog from './ScanDisambiguationDialog.js'; export default function CameraScanner({ onCardScanned, onError }) { const verificationPausedRef = useRef(false); const onVerifyCardRef = useRef(() => {}); const { videoRef, canvasRef, detectionCanvasRef, isStreaming, isDetecting, trackedCards, videoMetrics, startCamera, stopCamera, } = useCameraScanner({ onError, verificationPausedRef, onVerifyCard: (card) => onVerifyCardRef.current(card), }); const { disambiguation, scanNotice, submittingReview, handleDisambiguationPick, handleNotInCatalog, cancelDisambiguation, } = useScannerIdentification({ onCardScanned, onError, videoRef, canvasRef, onVerifyCardRef, verificationPausedRef, }); const foundCardCount = trackedCards.filter( (card) => card.status === 'confirmed' || card.status === 'scanned' ).length; return (
{scanNotice && (
{scanNotice}
)} {/* Camera Feed Container */}
{/* Video Element - Always rendered but visibility controlled */}
{/* Hidden canvases for image processing */} {/* Detection Info Panel - Only show when streaming */} {isStreaming && (
🎯

Smart Detection Active

Shape recognition
Server identification
Position tracking
Database lookup
)}
); }