1
0
Fork 0
VaultUI/src/elements/QRScanner.ts

51 lines
1.2 KiB
TypeScript
Raw Normal View History

import { Margin } from "./Margin";
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 02:09:08 +01:00
export interface QRScannerType extends HTMLElement {
2021-05-08 00:54:50 +01:00
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);
});
2021-05-10 11:35:14 +01:00
void qrScanner.start();
2021-04-29 12:52:00 +01:00
QRInput.deinit = () => {
try {
stream.getTracks().forEach(function (track) {
track.stop();
});
} catch (_) {
()=>{};
}
};
return QRInput;
2021-04-29 12:52:00 +01:00
}