46 lines
1 KiB
JavaScript
46 lines
1 KiB
JavaScript
import { Margin } from "./Margin";
|
|
import { makeElement } from "../htmlUtils";
|
|
import QrScanner from 'qr-scanner';
|
|
|
|
/* eslint-disable import/no-unresolved */
|
|
import qrScannerWorkerSource from '!!raw-loader!qr-scanner/qr-scanner-worker.min.js';
|
|
QrScanner.WORKER_PATH = URL.createObjectURL(new Blob([qrScannerWorkerSource]));
|
|
|
|
export async function QRScanner(onScan) {
|
|
let webcamVideo = makeElement({
|
|
tag: "video"
|
|
})
|
|
|
|
let QRInput = makeElement({
|
|
tag: "div",
|
|
children: [
|
|
Margin(webcamVideo),
|
|
]
|
|
});
|
|
|
|
let stream = await navigator.mediaDevices.getUserMedia({
|
|
video: {
|
|
facingMode: 'environment',
|
|
},
|
|
audio: false,
|
|
});
|
|
webcamVideo.srcObject = stream;
|
|
let lastSeenValue = "";
|
|
const qrScanner = new QrScanner(webcamVideo, function (value) {
|
|
if (lastSeenValue == value) return;
|
|
onScan(value);
|
|
});
|
|
qrScanner.start();
|
|
|
|
QRInput.deinit = () => {
|
|
try {
|
|
stream.getTracks().forEach(function (track) {
|
|
track.stop();
|
|
});
|
|
} catch (_) {
|
|
()=>{};
|
|
}
|
|
};
|
|
|
|
return QRInput;
|
|
} |