import { FC, useEffect, useRef, useState } from "react"; import QrScanner from "qr-scanner"; export const QrReader: FC<{ url: string }> = ({ url }) => { 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) => { // console.log(result); // navigate("/hasil/scan"); // setScannedResult(result?.data); if (!hasScanned) { console.log(result); setScannedResult(result?.data); setHasScanned(true); scanner.current?.stop(); setTimeout(() => { // console.log("Mencoba trigger hasil scan"); // navigate(`/hasil/scan?id_asset=${result?.data}`); navigate(url + result?.data); }, 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}

)}
); };