/** * Copyright (c) Microblink Ltd. All rights reserved. */ import { Component, Element, Event, EventEmitter, Host, h, Method, State, Prop } from '@stencil/core'; import { CameraEntry } from '../../../utils/data-structures'; import { setWebComponentParts, classNames } from '../../../utils/generic.helpers'; import { getCameraDevices } from '../../../utils/sdk.service'; @Component({ tag: 'mb-camera-selection', styleUrl: 'mb-camera-selection.scss', shadow: true, }) export class MbCameraSelection { @State() activeCamera: CameraEntry = { prettyName: '-', details: null }; @State() cameraList: Array = []; @State() isListVisible: boolean = false; @Prop() clearIsCameraActive: boolean = false; /** * Emitted when camera stream becomes active. */ @Event() setIsCameraActive: EventEmitter; /** * Emitted when user selects a different camera device. */ @Event() changeCameraDevice: EventEmitter; /** * Change active camera. */ @Method() async setActiveCamera(cameraId: string) { const camera = this.cameraList.find((el: CameraEntry) => el.details.deviceId === cameraId); if (!camera) { return; } this.activeCamera = camera; } /** * Populate list of camera devices. */ @Method() async populateCameraDevices() { try { const devices = await getCameraDevices(); this.cameraList = devices; } catch (error) { // Camera access error is handled by the video recognizer. this.cameraList = []; } } /** * Host element as variable for manipulation */ @Element() hostEl: HTMLElement; private handleListOpen(ev: UIEvent) { ev.preventDefault(); ev.stopPropagation(); this.setListVisibility(!this.isListVisible); } private handleCameraSelection(ev: UIEvent, camera: CameraEntry) { ev.preventDefault(); ev.stopPropagation(); this.changeCameraDevice.emit(camera); this.activeCamera = camera; this.setListVisibility(false); } private setListVisibility(visible: boolean) { this.isListVisible = visible; } componentDidLoad() { setWebComponentParts(this.hostEl); } render() { const cameraListElements = this.cameraList.map((camera: CameraEntry) => { const isActive = !this.clearIsCameraActive && this.activeCamera?.details?.deviceId === camera.details.deviceId; this.setIsCameraActive.emit(isActive); let content = ( ) if (isActive) { content = ( ) } return (
  • ) }); return (
    this.setListVisibility(false) } >
      { cameraListElements }
    ); } }