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-05-12 16:01:04 +01:00
|
|
|
import QrScanner from "qr-scanner";
|
2021-04-29 12:52:00 +01:00
|
|
|
|
2021-05-08 00:54:50 +01:00
|
|
|
/* eslint-disable import/no-unresolved */
|
|
|
|
// @ts-ignore
|
2021-05-12 16:01:04 +01:00
|
|
|
import qrScannerWorkerSource from "!!raw-loader!qr-scanner/qr-scanner-worker.min.js";
|
2021-04-29 12:52:00 +01:00
|
|
|
QrScanner.WORKER_PATH = URL.createObjectURL(new Blob([qrScannerWorkerSource]));
|
|
|
|
|
2021-05-08 02:09:08 +01:00
|
|
|
export interface QRScannerType extends HTMLElement {
|
2021-05-08 00:54:50 +01:00
|
|
|
deinit(): void;
|
|
|
|
}
|
|
|
|
|
2021-05-12 16:01:04 +01:00
|
|
|
export async function QRScanner(onScan: (code: string) => void): Promise<QRScannerType> {
|
2021-05-08 00:54:50 +01:00
|
|
|
const webcamVideo = makeElement({
|
2021-05-12 16:01:04 +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",
|
2021-05-12 16:01:04 +01:00
|
|
|
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: {
|
2021-05-12 16:01:04 +01:00
|
|
|
facingMode: "environment",
|
2021-04-29 12:52:00 +01:00
|
|
|
},
|
|
|
|
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);
|
|
|
|
});
|
2021-05-10 11:35:14 +01:00
|
|
|
void qrScanner.start();
|
2021-05-12 16:01:04 +01:00
|
|
|
|
2021-04-29 12:52:00 +01:00
|
|
|
QRInput.deinit = () => {
|
|
|
|
try {
|
|
|
|
stream.getTracks().forEach(function (track) {
|
|
|
|
track.stop();
|
|
|
|
});
|
|
|
|
} catch (_) {
|
2021-05-12 16:01:04 +01:00
|
|
|
() => {};
|
2021-04-29 12:52:00 +01:00
|
|
|
}
|
|
|
|
};
|
|
|
|
|
2021-05-03 09:07:47 +01:00
|
|
|
return QRInput;
|
2021-05-12 16:01:04 +01:00
|
|
|
}
|