2021-05-08 00:38:02 +01:00
|
|
|
import { Margin } from "./Margin";
|
2021-05-07 22:23:52 +01:00
|
|
|
import { makeElement } from "../htmlUtils";
|
2021-04-29 12:52:00 +01:00
|
|
|
import QrScanner from 'qr-scanner';
|
|
|
|
|
2021-05-08 00:54:50 +01:00
|
|
|
/* eslint-disable import/no-unresolved */
|
|
|
|
// @ts-ignore
|
2021-04-29 12:52:00 +01:00
|
|
|
import qrScannerWorkerSource from '!!raw-loader!qr-scanner/qr-scanner-worker.min.js';
|
|
|
|
QrScanner.WORKER_PATH = URL.createObjectURL(new Blob([qrScannerWorkerSource]));
|
|
|
|
|
2021-05-08 00:54:50 +01:00
|
|
|
interface QRScannerType extends HTMLElement {
|
|
|
|
deinit(): void;
|
|
|
|
}
|
|
|
|
|
|
|
|
export async function QRScanner(onScan: (code: string) => void): Promise<QRScannerType> {
|
|
|
|
const webcamVideo = makeElement({
|
2021-04-29 12:52:00 +01:00
|
|
|
tag: "video"
|
2021-05-08 00:54:50 +01:00
|
|
|
}) as HTMLVideoElement;
|
2021-04-29 12:52:00 +01:00
|
|
|
|
2021-05-08 00:54:50 +01:00
|
|
|
const QRInput = makeElement({
|
2021-04-29 12:52:00 +01:00
|
|
|
tag: "div",
|
|
|
|
children: [
|
|
|
|
Margin(webcamVideo),
|
|
|
|
]
|
2021-05-08 00:54:50 +01:00
|
|
|
}) as QRScannerType;
|
2021-04-29 12:52:00 +01:00
|
|
|
|
2021-05-08 00:54:50 +01:00
|
|
|
const stream = await navigator.mediaDevices.getUserMedia({
|
2021-04-29 12:52:00 +01:00
|
|
|
video: {
|
|
|
|
facingMode: 'environment',
|
|
|
|
},
|
|
|
|
audio: false,
|
|
|
|
});
|
|
|
|
webcamVideo.srcObject = stream;
|
2021-05-08 00:54:50 +01:00
|
|
|
const lastSeenValue = "";
|
2021-04-29 12:52:00 +01:00
|
|
|
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 (_) {
|
|
|
|
()=>{};
|
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2021-05-03 09:07:47 +01:00
|
|
|
return QRInput;
|
2021-04-29 12:52:00 +01:00
|
|
|
}
|