From 5104420157eea2bc8c59e40f5ff08b21e6a3fbd5 Mon Sep 17 00:00:00 2001
From: Christoph Reiter <reiter.christoph@gmail.com>
Date: Tue, 20 Oct 2020 15:14:18 +0200
Subject: [PATCH] Move device detection into functions

so they can be reused
---
 .../qr-code-scanner/src/qr-code-scanner.js    | 119 ++++++++++--------
 1 file changed, 67 insertions(+), 52 deletions(-)

diff --git a/packages/qr-code-scanner/src/qr-code-scanner.js b/packages/qr-code-scanner/src/qr-code-scanner.js
index dae42964..0ef51473 100644
--- a/packages/qr-code-scanner/src/qr-code-scanner.js
+++ b/packages/qr-code-scanner/src/qr-code-scanner.js
@@ -9,6 +9,62 @@ import {classMap} from 'lit-html/directives/class-map.js';
 import jsQR from "jsqr";
 
 
+/**
+ * Returns the ID for the most important device
+ *
+ * @param {Map} devices
+ * @return string|null
+ */
+function getPrimaryDevice(devices) {
+    if (/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)) {
+        if (devices.has('environment'))
+            return 'environment';
+    }
+    if (devices.size) {
+        return Array.from(devices)[0][0];
+    }
+    return null;
+}
+
+/**
+ * Returns a map of device IDs and translated names.
+ *
+ * Moreimportant devices first.
+ *
+ * @return Map<string,string>
+ */
+async function getVideoDevices() {
+    let devices_map = new Map();
+    if (navigator.mediaDevices
+        && navigator.mediaDevices.enumerateDevices
+        && navigator.mediaDevices.getUserMedia) {
+
+        let devices;
+        try {
+            devices = await navigator.mediaDevices.enumerateDevices()
+        } catch (err) {
+            console.log(err.name + ": " + err.message);
+            return devices_map;
+        }
+
+        for (let device of devices) {
+            if (device.kind === 'videoinput') {
+                let id = device.deviceId;
+                if (/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)) {
+                    devices_map.set('environment', i18n.t('back-camera'));
+                    devices_map.set('user', i18n.t('front-camera'));
+                } else {
+                    devices_map.set(id ? id : true, device.label || i18n.t('camera') + (devices_map.size + 1));
+                }
+            }
+        }
+        return devices_map;
+    } else {
+        return devices_map;
+    }
+}
+
+
 /**
  * Notification web component
  */
@@ -65,7 +121,17 @@ export class QrCodeScanner extends ScopedElementsMixin(DBPLitElement) {
         i18n.changeLanguage(this.lang);
 
         this.updateComplete.then(async ()=>{
-            this.notSupported = (!await this.checkSupport());
+            let devices = await getVideoDevices();
+            this.notSupported = !devices.size;
+            this.activeCamera = getPrimaryDevice(devices) || '';
+
+            for (let [id, label] of devices) {
+                let opt = document.createElement("option");
+                opt.value = id;
+                opt.text = label;
+                this._('#videoSource').appendChild(opt);
+            }
+
             if (!this.stopScan) {
                 this.qrCodeScannerInit();
             }
@@ -83,57 +149,6 @@ export class QrCodeScanner extends ScopedElementsMixin(DBPLitElement) {
         }
     };
 
-    /**
-     * Ckecks if browser support video recording
-     * Gets video devices of device
-     *
-     */
-    async checkSupport() {
-        let devices_map = new Map();
-        if (navigator.mediaDevices
-            && navigator.mediaDevices.enumerateDevices
-            && navigator.mediaDevices.getUserMedia) {
-
-            let devices;
-            try {
-                devices = await navigator.mediaDevices.enumerateDevices()
-            } catch (err) {
-                console.log(err.name + ": " + err.message);
-                return false;
-            }
-
-            for (let device of devices) {
-                if (device.kind === 'videoinput') {
-                    let id = device.deviceId;
-                    if (/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)) {
-                        devices_map.set('environment', i18n.t('back-camera'));
-                        devices_map.set('user', i18n.t('front-camera'));
-                    } else {
-                        devices_map.set(id ? id : true, device.label || i18n.t('camera') + (devices_map.size + 1));
-                    }
-                }
-            }
-            for (let [id, label] of devices_map) {
-                let opt = document.createElement("option");
-                opt.value = id;
-                opt.text = label;
-                this._('#videoSource').appendChild(opt);
-            }
-            if (/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent)) {
-                this.activeCamera = 'environment';
-            } else {
-                this.activeCamera = devices_map.size ? Array.from(devices_map)[0][0] : '';
-            }
-
-            if (devices_map.size < 1) {
-                return false;
-            }
-            return true;
-        } else {
-            return false;
-        }
-    }
-
     /**
      * Get a loading message
      *
-- 
GitLab