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>();

  qrScanner: QrScanner;

  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);
        });
        this.qrScanner = qrScanner;
        void qrScanner.start();
      });
  }
  componentWillUnmount(): void {
    try {
      this.qrScanner.destroy();
    } catch (_) {
      // Do Nothing
    }
  }

  render(): JSX.Element {
    return (
      <div>
        <Margin>
          <video ref={this.videoElement}></video>
        </Margin>
      </div>
    );
  }
}