From 413b7f6983287cbcb3abe5f682b63844cef557d1 Mon Sep 17 00:00:00 2001
From: Dominik George <dominik.george@teckids.org>
Date: Fri, 24 Jun 2022 23:19:32 +0200
Subject: [PATCH] Generalise QR scanner code

---
 aleksis/apps/paweljong/forms.py               |  2 +-
 .../static/js/paweljong/checkpoint.js         | 17 ----------------
 .../static/js/paweljong/qrscanner.js          | 20 +++++++++++++++++++
 .../templates/paweljong/event/checkpoint.html |  2 +-
 4 files changed, 22 insertions(+), 19 deletions(-)
 create mode 100644 aleksis/apps/paweljong/static/js/paweljong/qrscanner.js

diff --git a/aleksis/apps/paweljong/forms.py b/aleksis/apps/paweljong/forms.py
index 1189c48..c42d5b8 100644
--- a/aleksis/apps/paweljong/forms.py
+++ b/aleksis/apps/paweljong/forms.py
@@ -505,7 +505,7 @@ class PersonGroupFormPerson(forms.Form):
 
 class EventCheckpointForm(forms.Form):
     class Media:
-        js = ("https://unpkg.com/html5-qrcode", "js/paweljong/checkpoint.js")
+        js = ("https://unpkg.com/html5-qrcode", "js/paweljong/qrscanner.js", "js/paweljong/checkpoint.js")
 
     layout = Layout(
         "comment", "use_latlon",
diff --git a/aleksis/apps/paweljong/static/js/paweljong/checkpoint.js b/aleksis/apps/paweljong/static/js/paweljong/checkpoint.js
index db9a7e5..6ca40ad 100644
--- a/aleksis/apps/paweljong/static/js/paweljong/checkpoint.js
+++ b/aleksis/apps/paweljong/static/js/paweljong/checkpoint.js
@@ -1,5 +1,3 @@
-const scanner = new Html5Qrcode("reader");
-
 function getCheckpointCoords() {
     navigator.geolocation.getCurrentPosition(setCheckpointCoords);
 }
@@ -13,23 +11,8 @@ function setCheckpointCoords(position) {
     }, 3000);
 }
 
-function onScanSuccess(decodedText, decodedResult) {
-    scanner.stop();
-    $("[name='username']").val(decodedText);
-    $("[name='username']").closest("form").submit();
-}
-
-function onScanError(error) {
-    console.warn(`Code scan error: ${error}`);
-}
-
 $(document).ready(function($) {
     if (navigator.geolocation) {
         getCheckpointCoords();
     }
-
-    let cameraConfig = { facingMode: "environment" };
-    let scannerConfig = { fps: 10, qrbox: {width: 250, height: 250} };
-
-    scanner.start(cameraConfig, scannerConfig, onScanSuccess);
 });
diff --git a/aleksis/apps/paweljong/static/js/paweljong/qrscanner.js b/aleksis/apps/paweljong/static/js/paweljong/qrscanner.js
new file mode 100644
index 0000000..85b5e45
--- /dev/null
+++ b/aleksis/apps/paweljong/static/js/paweljong/qrscanner.js
@@ -0,0 +1,20 @@
+const scannerDivId = "qr-reader";
+const scannerDiv = $("div#" + scannerDivId);
+const scanner = new Html5Qrcode(scannerDivId);
+
+function onScanSuccess(decodedText, decodedResult) {
+    let targetId = scannerDiv.data("target-input");
+    let target = $("[name='" + targetId + "']");
+
+    scanner.stop();
+
+    target.val(decodedText);
+    target.closest("form").submit();
+}
+
+$(document).ready(function($) {
+    let cameraConfig = { facingMode: "environment" };
+    let scannerConfig = { fps: 10, qrbox: {width: 250, height: 250} };
+
+    scanner.start(cameraConfig, scannerConfig, onScanSuccess);
+});
diff --git a/aleksis/apps/paweljong/templates/paweljong/event/checkpoint.html b/aleksis/apps/paweljong/templates/paweljong/event/checkpoint.html
index c683717..deef5cc 100644
--- a/aleksis/apps/paweljong/templates/paweljong/event/checkpoint.html
+++ b/aleksis/apps/paweljong/templates/paweljong/event/checkpoint.html
@@ -16,7 +16,7 @@
     {% include "core/partials/save_button.html" %}
   </form>
 
-  <div id="reader"></div>
+  <div id="qr-reader" data-target-input="username"></div>
 
   {{ form.media.js }}
 
-- 
GitLab