import { FC, useEffect, useRef, useState } from "react"; import QrScanner from "qr-scanner"; import { QrReaderType } from "./typings"; export const QrReader: FC<{ onSuccess: (result: QrReaderType) => {} }> = ({ onSuccess }) => { const scanner = useRef(); const videoEl = useRef(null); const qrBoxEl = useRef(null); const [qrOn, setQrOn] = useState(true); const [scannedResult, setScannedResult] = useState(""); const [hasScanned, setHasScanned] = useState(false); // Success const onScanSuccess = (result: QrScanner.ScanResult) => { if (!hasScanned) { console.log(result); setScannedResult(result?.data); setHasScanned(true); scanner.current?.stop(); setTimeout(() => { onSuccess(result); }, 1000); } }; // Fail const onScanFail = (err: string | Error) => { console.log(err); }; useEffect(() => { if (videoEl?.current && !scanner.current) { scanner.current = new QrScanner(videoEl?.current, onScanSuccess, { onDecodeError: onScanFail, preferredCamera: "environment", highlightScanRegion: true, highlightCodeOutline: true, overlay: qrBoxEl?.current || undefined, }); scanner?.current ?.start() .then(() => setQrOn(true)) .catch((err) => { if (err) setQrOn(false); }); } return () => { if (!videoEl?.current) { scanner?.current?.stop(); } }; }, []); useEffect(() => { if (!qrOn) alert( "Kamera tidak bisa diakses. Tolong beri izin untuk akses kamera dan silahkan reload." ); }, [qrOn]); return (
{scannedResult && (

Scanned Result: {scannedResult}

)}
); };