modern-react-qr-reader
Version:
A react component for reading QR codes from the webcam. This is a modernized version of the JodusNodus package
49 lines (41 loc) • 1.56 kB
JavaScript
const { NoVideoInputDevicesError } = require('./errors')
function defaultDeviceIdChooser(filteredDevices, videoDevices, facingMode) {
if(filteredDevices.length > 0){
return filteredDevices[0].deviceId
}
if(videoDevices.length == 1 || facingMode == 'user'){
return videoDevices[0].deviceId
}
return videoDevices[1].deviceId
}
const getFacingModePattern = (facingMode) => facingMode == 'environment'
? /rear|back|environment/i
: /front|user|face/i
function getDeviceId(facingMode, chooseDeviceId = defaultDeviceIdChooser, cameraId='camera2 0') {
// Get manual deviceId from available devices.
return new Promise((resolve, reject) => {
let enumerateDevices
try{
enumerateDevices = navigator.mediaDevices.enumerateDevices();
}catch(err){
reject(new NoVideoInputDevicesError());
}
enumerateDevices.then(devices => {
// Filter out non-videoinputs
const videoDevices = devices.filter(
device => device.kind == 'videoinput'
)
if (videoDevices.length < 1) {
reject(new NoVideoInputDevicesError());
return
}
const pattern = getFacingModePattern(facingMode);
// Filter out video devices without the pattern
const filteredDevices = videoDevices.filter(({ label }) =>{
return pattern.test(label) && label.includes(cameraId);
})
resolve(chooseDeviceId(filteredDevices, videoDevices, facingMode))
})
})
}
module.exports = { getDeviceId, getFacingModePattern }