react-qr-reader
Version:
A React Component for reading QR codes from the webcam
52 lines (43 loc) • 1.52 kB
text/typescript
import { MutableRefObject, useEffect, useRef } from 'react';
import { BrowserQRCodeReader, IScannerControls } from '@zxing/browser';
import { UseQrReaderHook } from '../types';
import { isMediaDevicesSupported, isValidType } from './utils';
// TODO: add support for debug logs
export const useQrReader: UseQrReaderHook = ({
scanDelay: delayBetweenScanAttempts,
constraints: video,
onResult,
videoId,
}) => {
const controlsRef: MutableRefObject<IScannerControls> = useRef(null);
useEffect(() => {
const codeReader = new BrowserQRCodeReader(null, {
delayBetweenScanAttempts,
});
if (
!isMediaDevicesSupported() &&
isValidType(onResult, 'onResult', 'function')
) {
const message =
'MediaDevices API has no support for your browser. You can fix this by running "npm i webrtc-adapter"';
onResult(null, new Error(message), codeReader);
}
if (isValidType(video, 'constraints', 'object')) {
codeReader
.decodeFromConstraints({ video }, videoId, (result, error) => {
if (isValidType(onResult, 'onResult', 'function')) {
onResult(result, error, codeReader);
}
})
.then((controls: IScannerControls) => (controlsRef.current = controls))
.catch((error: Error) => {
if (isValidType(onResult, 'onResult', 'function')) {
onResult(null, error, codeReader);
}
});
}
return () => {
controlsRef.current?.stop();
};
}, []);
};