diff --git a/src/components/general/CardAssignment.svelte b/src/components/general/CardAssignment.svelte
index e3b94b52..501b82e4 100644
--- a/src/components/general/CardAssignment.svelte
+++ b/src/components/general/CardAssignment.svelte
@@ -4,86 +4,157 @@
let state = "scan_runner";
let runnerinfo = { id: 0, firstname: "", lastname: "" };
let cardCode = "";
- $: scannerActive = state.includes("scan");
+ let scannerActive = true;
+ function resetAll() {
+ state = "scan_runner";
+ runnerinfo = { id: 0, firstname: "", lastname: "" };
+ cardCode = "";
+ scannerActive = true;
+ }
Card Assignment for Mobile
-
- {#if state.includes("scan_")}
-
- {#if state === "scan_runner"}
-
Scan Runner (Selfservice QR)
- {/if}
- {#if state === "scan_card"}
-
Runner Scanned
-
{runnerinfo.firstname} {runnerinfo.lastname} [#{runnerinfo.id}]
-
Scan Card (Code 128 Barcode)
- {/if}
-
{
- console.log({ type: "DETECT", code: e.detail.decodedText });
- if (state === "scan_runner") {
- if (
- e.detail.decodedText.includes(
- "https://portal.lauf-fuer-kaya.de/profile/"
- )
- ) {
- const runnerID = JSON.parse(
- atob(
- e.detail.decodedText
- .replace("https://portal.lauf-fuer-kaya.de/profile/", "")
- .split(".")[1]
- )
- ).id;
- new Audio("/beep.mp3").play();
- RunnerService.runnerControllerGetOne(runnerID).then((runner) => {
- console.log(runner);
- runnerinfo = runner;
- });
- state = "scan_card";
- }
- }
- if (state === "scan_card") {
- if (
- !e.detail.decodedText.includes(
- "https://portal.lauf-fuer-kaya.de/profile/"
- )
- ) {
- cardCode = e.detail.decodedText;
- new Audio("/beep.mp3").play();
- state = "assigning";
- RunnerCardService.runnerCardControllerGetAll().then((cards) => {
- console.log(cards);
- const card = cards.find((c) => c.code === cardCode);
- if (card) {
- console.log("card found", card);
- RunnerCardService.runnerCardControllerPut(card.id, {
- enabled: true,
- id: card.id,
- runner: runnerinfo.id,
- }).then(() => {
- state = "done";
- });
- } else {
- state = "error_card_404";
- }
- });
- }
- }
+
+ {#if state === "done"}
+ ✅ Done
+
+ Assigned Card {cardCode} to {runnerinfo.firstname}
+ {runnerinfo.lastname} [#{runnerinfo.id}]
+
+
+ {:else if state === "assigning"}
+ Assigning Card {cardCode} ⌛
+ Please wait a moment while we assign the card...
+ {:else}
+
+ {#if runnerinfo.id === 0}
+ Scan Runner
+
+ Selfservice QR/ Registration Barcode
+
+ {:else}
+
+ {runnerinfo.firstname}
+ {runnerinfo.lastname}
+
+
+ ID: #{runnerinfo.id}
created_via: {runnerinfo.created_via}
{runnerinfo.group.name}
+
+ {/if}
+
+ {/if}
+ {#if state === "scan_card"}
+ Scan Card
+ Code 128 Barcode
+ {/if}
+ {#if state.includes("scan_")}
+ {#if scannerActive}
+ {
+ if (scannerActive) {
+ scannerActive = false;
+ console.log({ type: "DETECT", code: e.detail.decodedText });
+ if (runnerinfo.id === 0) {
+ new Audio("/beep.mp3").play();
+ if (
+ e.detail.decodedText.includes(
+ "https://portal.lauf-fuer-kaya.de/profile/"
+ )
+ ) {
+ const runnerID = JSON.parse(
+ atob(
+ e.detail.decodedText
+ .replace("https://portal.lauf-fuer-kaya.de/profile/", "")
+ .split(".")[1]
+ )
+ ).id;
+ RunnerService.runnerControllerGetOne(runnerID)
+ .then((runner) => {
+ runnerinfo = runner;
+ })
+ .catch((e) => {
+ console.error(e);
+ state = "scan_error_runner_404";
+ resetAll();
+ });
+ } else {
+ const runnerID = parseInt(e.detail.decodedText);
+ RunnerService.runnerControllerGetOne(runnerID)
+ .then((runner) => {
+ runnerinfo = runner;
+ })
+ .catch((e) => {
+ console.error(e);
+ state = "scan_error_runner_404";
+ resetAll();
+ });
+ }
+ } else {
+ if (`${e.detail.decodedText}`.length > 10) {
+ cardCode = e.detail.decodedText;
+ new Audio("/beep.mp3").play();
+ state = "assigning";
+ RunnerCardService.runnerCardControllerGetAll()
+ .then((cards) => {
+ console.log(cards);
+ const card = cards.find((c) => c.code === cardCode);
+ if (card) {
+ console.log("card found", card);
+ RunnerCardService.runnerCardControllerPut(card.id, {
+ enabled: true,
+ id: card.id,
+ runner: runnerinfo.id,
+ })
+ .then(() => {
+ state = "done";
+ })
+ .catch(() => {
+ scannerActive = true;
+ });
+ } else {
+ scannerActive = true;
+ }
+ })
+ .catch(() => {
+ scannerActive = true;
+ });
+ }
+ }
+ }
+ }}
+ width={320}
+ height={320}
+ class="w-full max-w-sm bg-neutral-300 rounded-lg overflow-hidden"
+ />
+ {/if}
+ {#if runnerinfo.id !== 0 && state !== "scan_card"}
+
+ {/if}
+ {#if state === "scan_card" || runnerinfo.id !== 0}
{/if}
- {:else}
-
- {#if state === "assigning"}
- Assigning Card {cardCode} ⌛
- Please wait a moment while we assign the card...
- {/if}
- {#if state === "done"}
-
- Assigned Card {cardCode} to {runnerinfo.firstname}
- {runnerinfo.lastname} [#{runnerinfo.id}] ✅
-
-
- {/if}
-
{/if}
diff --git a/src/components/general/QrCodeScanner.svelte b/src/components/general/QrCodeScanner.svelte
index 0bdc726b..d4671b07 100644
--- a/src/components/general/QrCodeScanner.svelte
+++ b/src/components/general/QrCodeScanner.svelte
@@ -13,9 +13,25 @@
const dispatch = createEventDispatcher();
+ const debounceFunc = (func, delay) => {
+ let timer;
+ return function (...args) {
+ const context = this;
+ clearTimeout(timer);
+ timer = setTimeout(() => {
+ func.apply(context, args);
+ }, delay);
+ };
+ };
+
+ const debouncedDispatch = debounceFunc(function (decodedText) {
+ console.log("dispatchEvent");
+ dispatch("detect", { decodedText });
+ }, 500);
+
function onScanSuccess(decodedText, decodedResult) {
if (!paused) {
- dispatch("detect", { decodedText });
+ debouncedDispatch(decodedText);
}
}
@@ -32,6 +48,7 @@
"qr-scanner",
{
fps: 10,
+ showTorchButtonIfSupported: true,
rememberLastUsedCamera: true,
qrbox: { width, height },
aspectRatio: 1,
@@ -48,16 +65,6 @@
);
scanner.render(onScanSuccess, onScanFailure);
});
-
- // pause/resume scanner to avoid unintended scans
- $: togglePause(paused);
- function togglePause(paused) {
- if (paused && scanner?.getState() === Html5QrcodeScannerState.SCANNING) {
- scanner?.pause();
- } else if (scanner?.getState() === Html5QrcodeScannerState.PAUSED) {
- scanner?.resume();
- }
- }