Просмотр исходного кода

testing qr code scanner

feature/axios_provider
cyril.tsui 5 месяцев назад
Родитель
Сommit
f38d193d50
3 измененных файлов: 149 добавлений и 0 удалений
  1. +99
    -0
      src/components/QrCodeScanner/QrCodeScanner.tsx
  2. +49
    -0
      src/components/QrCodeScanner/QrCodeScannerModal.tsx
  3. +1
    -0
      src/components/QrCodeScanner/index.ts

+ 99
- 0
src/components/QrCodeScanner/QrCodeScanner.tsx Просмотреть файл

@@ -0,0 +1,99 @@
import { Button, Card, CardContent, Modal, ModalProps, SxProps } from "@mui/material";
import { Html5QrcodeResult, Html5QrcodeScanner, QrcodeErrorCallback, QrcodeSuccessCallback } from "html5-qrcode";
import { Html5QrcodeError } from "html5-qrcode/esm/core";
import { Html5QrcodeScannerConfig } from "html5-qrcode/esm/html5-qrcode-scanner";
import React, { useCallback, useEffect, useMemo, useRef, useState } from "react";

const scannerSx: React.CSSProperties = {
position: "absolute",
// top: "50%",
// left: "50%",
// transform: "translate(-50%, -50%)",
width: "90%",
maxHeight: "10%",
maxWidth: 1400,
};

type QrCodeScannerProps = {
onScanSuccess: (result: string) => void,
onScanError?: (error: string) => void
}

const scannerConfig: Html5QrcodeScannerConfig = {
fps: 10,
qrbox: { width: 400, height: 400 },
aspectRatio: 2.5,
}

const QrCodeScanner: React.FC<QrCodeScannerProps> = ({
onScanSuccess,
onScanError
}) => {

const [isScanned, setIsScanned] = useState<boolean>(false)
const [scanner, setScanner] = useState<Html5QrcodeScanner | null>(null)

useEffect(() => {
setScanner(new Html5QrcodeScanner(
"qr-reader",
scannerConfig,
false
))
}, [])

const handleStartScan = useCallback(() => {
setIsScanned(false)
scanner?.resume();
}, [scanner])

useEffect(() => {
if (scanner) {
console.log("Scanner Instance:", scanner);
const success: QrcodeSuccessCallback = (decodedText, result) => {
console.log(`Decoded text: ${decodedText}`);
// Handle the decoded text as needed
setIsScanned(true)
scanner.pause();
onScanSuccess(decodedText)
};

const error: QrcodeErrorCallback = (errorMessage, error) => {
console.log(`Error: ${errorMessage}`);

if (onScanError) {
onScanError(errorMessage)
}
};

try {
scanner.render(success, error);
console.log("Scanner render called");
} catch (err) {
console.error("Failed to render scanner:", err);
}
return () => {
console.log("Cleaning up scanner...");
scanner.clear().catch((error) => {
console.error("Failed to clear html5QrcodeScanner. ", error);
});
};
}
}, [scanner]);


return (
<>
<div id="qr-reader" hidden={isScanned} />
<Button
size="small"
onClick={handleStartScan}
variant="contained"
>
{isScanned ? "Re-Scan" : "Stop-Scanning"}
</Button>
</>
)
}

export default QrCodeScanner

+ 49
- 0
src/components/QrCodeScanner/QrCodeScannerModal.tsx Просмотреть файл

@@ -0,0 +1,49 @@
import { Button, CardContent, Card, Modal, SxProps, ModalProps } from "@mui/material";
import QrCodeScanner from "./QrCodeScanner";
import { useCallback } from "react";

const modalSx: SxProps = {
position: "absolute",
top: "50%",
left: "50%",
transform: "translate(-50%, -50%)",
width: { xs: "calc(100% - 2rem)", sm: "90%" },
maxHeight: "90%",
maxWidth: 1400,
};

type QrCodeScannerModalProps = {
isOpen: boolean,
onClose: () => void,
onScanSuccess: (result: string) => void,
onScanError?: (error: string) => void
}

const QrCodeScannerModal: React.FC<QrCodeScannerModalProps> = ({
isOpen,
onClose,
onScanSuccess,
onScanError,
}) => {

const onModalClose = useCallback<NonNullable<ModalProps["onClose"]>>(
(_, reason) => {
if (reason !== "backdropClick") {
onClose();
}
},
[onClose],
);

return (
<Modal open={isOpen} onClose={onModalClose}>
<Card sx={modalSx}>
<CardContent>
<QrCodeScanner onScanSuccess={onScanSuccess} onScanError={onScanError}/>
</CardContent>
</Card>
</Modal>
)
}

export default QrCodeScannerModal

+ 1
- 0
src/components/QrCodeScanner/index.ts Просмотреть файл

@@ -0,0 +1 @@
export { default } from "./QrCodeScannerModal"

Загрузка…
Отмена
Сохранить