1
0
Fork 0
VaultUI/src/ui/elements/QRScanner.tsx

51 lines
1.1 KiB
TypeScript
Raw Normal View History

2021-05-24 14:37:37 +01:00
import { Component, JSX, createRef } from "preact";
import { Margin } from "./Margin";
import QrScanner from "qr-scanner";
export type QRScannerProps = {
onScan: (code: string) => void;
};
export class QRScanner extends Component<QRScannerProps, unknown> {
videoElement = createRef<HTMLVideoElement>();
2021-05-25 12:41:02 +01:00
qrScanner: QrScanner;
2021-05-24 14:37:37 +01:00
componentDidMount(): void {
void navigator.mediaDevices
.getUserMedia({
video: {
facingMode: "environment",
},
audio: false,
})
.then((stream) => {
this.videoElement.current.srcObject = stream;
const lastSeenValue = "";
const qrScanner = new QrScanner(this.videoElement.current, (value) => {
if (lastSeenValue == value) return;
this.props.onScan(value);
});
2021-05-25 12:41:02 +01:00
this.qrScanner = qrScanner;
2021-05-24 14:37:37 +01:00
void qrScanner.start();
});
}
componentWillUnmount(): void {
try {
2021-05-25 12:41:02 +01:00
this.qrScanner.destroy();
2021-05-24 14:37:37 +01:00
} catch (_) {
2021-05-25 12:41:02 +01:00
// Do Nothing
2021-05-24 14:37:37 +01:00
}
}
render(): JSX.Element {
return (
<div>
<Margin>
<video ref={this.videoElement}></video>
</Margin>
</div>
);
}
}