"use client"; import { QrCodeInfo } from "@/app/api/qrcode"; import { Box, Button, Modal, ModalProps } from "@mui/material"; import { useCallback, useEffect, useMemo, useState } from "react"; import BarcodeScanner, { BarcodeStringFormat } from "react-qr-barcode-scanner"; import { BarcodeFormat, Result } from "@zxing/library"; interface Props { scannerConfig: ScannerConfig; } // interface Props extends Omit { // scannerConfig: ScannerConfig; // } const style = { position: "absolute", top: "50%", left: "50%", transform: "translate(-50%, -50%)", bgcolor: "background.paper", pt: 5, px: 5, pb: 10, width: { xs: "80%", sm: "80%", md: "80%" }, }; export var defaultScannerConfig: ScannerConfig = { onUpdate: (err, result) => { if (result) { const data = JSON.parse(result.getText()); console.log(data); } else return; }, width: 500, height: 500, facingMode: "environment", // torch: false }; export interface ScannerConfig { onUpdate: (arg0: unknown, arg1?: Result) => void; onError?: (arg0: string | DOMException) => void; width?: number | string; height?: number | string; facingMode?: "environment" | "user"; // default environment delay?: number; // Delay between scans in milliseconds. Default is 500ms. videoConstraints?: MediaTrackConstraints; // Video constraints to pass to the webcam. If not provided, the default constraints will be used. formats?: BarcodeFormat[] | BarcodeStringFormat[]; // Array of barcode formats to decode. If not provided, all formats will be used. A smaller list may improve the speed of the scan. stopStream?: boolean; } const ReactQrCodeScanner: React.FC = ({ scannerConfig }) => { const [stopStream, setStopStream] = useState( scannerConfig.stopStream || defaultScannerConfig.stopStream || false ); const [torchEnabled, setTorchEnabled] = useState(false); // const _scannerConfig = useMemo(() => ({ // ...defaultScannerConfig, // ...scannerConfig, // }),[]) const [_scannerConfig, setScannerConfig] = useState({ ...defaultScannerConfig }); useEffect(() => { setScannerConfig({ ...defaultScannerConfig, ...scannerConfig, }); }, []); const SwitchOnOffScanner = useCallback(() => { // Stop the QR Reader stream (fixes issue where the browser freezes when closing the modal) and then dismiss the modal one tick later setStopStream((prev) => !prev); }, []); const SwitchOnOffTorch = useCallback(() => { setTorchEnabled((prev) => !prev); }, []); return ( <> {!stopStream ? ( ) : undefined} ); }; export default ReactQrCodeScanner;