import { useEffect, useRef } from "react"; import { Html5Qrcode } from "html5-qrcode"; const Scanner = ({ onScan, onClose }) => { const scannerRef = useRef(null); // Используем ref для хранения статуса инициализации, чтобы избежать повторного запуска const isStarted = useRef(false); useEffect(() => { const scannerId = "reader"; const html5QrCode = new Html5Qrcode(scannerId); scannerRef.current = html5QrCode; const start = async () => { // Если уже запущен или компонент размонтирован — ничего не делаем if (isStarted.current) return; try { await html5QrCode.start( { facingMode: "environment" }, { fps: 10, qrbox: 250 }, (text) => { if (isStarted.current) { isStarted.current = false; html5QrCode.stop().then(() => onScan(text)); } }, ); isStarted.current = true; } catch (e) { console.error("Ошибка старта камеры:", e); } }; start(); return () => { // Очистка при размонтировании isStarted.current = false; if (scannerRef.current) { if (scannerRef.current.isScanning) { scannerRef.current .stop() .then(() => scannerRef.current.clear()) .catch((e) => console.warn("Cleanup error:", e)); } else { // На случай если камера еще не успела стартовать, а компонент уже закрыли scannerRef.current.clear(); } } }; }, [onScan]); // Зависимость от onScan если она меняется return (

Сканер штрих-кодов

); }; export default Scanner;