// components/ScanModal.tsx 'use client'; import { useEffect, useRef, useState } from 'react'; import Modal from '@/components/ui/Modal'; import { CameraIcon } from '@heroicons/react/24/outline'; import { BrowserMultiFormatReader, IScannerControls } from '@zxing/browser'; type ScanModalProps = { open: boolean; onClose: () => void; onResult: (code: string) => void; }; export default function ScanModal({ open, onClose, onResult }: ScanModalProps) { const videoRef = useRef(null); const [error, setError] = useState(null); useEffect(() => { if (!open) return; setError(null); // Browser / Secure-Context Check if ( typeof navigator === 'undefined' || !navigator.mediaDevices || typeof navigator.mediaDevices.getUserMedia !== 'function' ) { setError( 'Kamera wird in diesem Kontext nicht unterstützt. Bitte die Seite über HTTPS oder localhost aufrufen.', ); return; } const codeReader = new BrowserMultiFormatReader(); let controls: IScannerControls | null = null; let stopped = false; let rafId: number | null = null; const startScanner = () => { // warten, bis das