From 9c965b316f96a0dfc4b466a8666ad61bb27cf605 Mon Sep 17 00:00:00 2001 From: bluestreamlds <85561356+bluestreamlds@users.noreply.github.com> Date: Fri, 21 Jan 2022 12:08:17 +0530 Subject: [PATCH] Feature - Scanner for Bar and QR code (#11) * Added: code reader component * Added: no device detected handler * Update: ID hooking to video element * Update: Defer stream start * Linted * Added: grant permissions * Added: media device scan * Removed loggers and cleanup Co-authored-by: Llewellyn D'souza --- src/components/CodeScanner/index.js | 97 +++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 src/components/CodeScanner/index.js diff --git a/src/components/CodeScanner/index.js b/src/components/CodeScanner/index.js new file mode 100644 index 0000000..b578f26 --- /dev/null +++ b/src/components/CodeScanner/index.js @@ -0,0 +1,97 @@ +import React, { useState, useEffect, useMemo } from 'react'; +import PropTypes from 'prop-types'; +import LOGGER from 'services/Logger'; + +import { BrowserMultiFormatReader, NotFoundException } from '@zxing/library'; + +export default function CodeScanner({ onDetect, width, height }) { + // const [decoded, setDecoded] = useState(null); + const [selectedDeviceId, setSelectedDeviceId] = useState(null); + const [videoInputDevices, setVideoInputDevices] = useState(null); + const getMediaDevices = (reader) => { + reader + .listVideoInputDevices() + .then((videoIPDevices) => { + setVideoInputDevices(videoIPDevices); + if (videoIPDevices && videoIPDevices.length > 0) { + setSelectedDeviceId(videoIPDevices[0].deviceId); + } + }) + .catch(LOGGER.log); + }; + + const codeReader = useMemo(() => { + // LOGGER.log('Initializing code reader'); + const reader = new BrowserMultiFormatReader(); + getMediaDevices(reader); + return reader; + }, []); + + // LOGGER.log('hasNavigator', codeReader.hasNavigator); + // LOGGER.log('isMediaDeviceSupported', codeReader.isMediaDevicesSuported); + + useEffect(() => { + !selectedDeviceId && getMediaDevices(codeReader); + + async function startStream() { + // LOGGER.log('Starting stream'); + if (videoInputDevices) { + codeReader + .decodeFromVideoDevice(selectedDeviceId, '#scan-view', (result, err) => { + if (result) { + LOGGER.log(result); + onDetect(result.text); + // setDecoded(result.text); + } + if (err && !(err instanceof NotFoundException)) { + LOGGER.error(err); + } + }) + .catch(() => { + getMediaDevices(codeReader); + }); + } + } + startStream(); + return () => { + // LOGGER.log('resetting code reader'); + codeReader.reset(); + }; + }, [selectedDeviceId]); + + // Use when debugging + // return videoInputDevices && selectedDeviceId ? ( + //
+ //
+ // ) : ( + //

Not supported

+ // ); + + return codeReader.hasNavigator && codeReader.isMediaDevicesSuported ? ( + videoInputDevices && selectedDeviceId ? ( +