import {Html5Qrcode} from "html5-qrcode"; import { ed448 } from "@noble/curves/ed448"; import { Buffer } from "buffer"; function htoa(h) { return Uint8Array.from(Buffer.from(h,"hex")); } var received_items = {}; var scanner = new Html5Qrcode("reader",{}); var scanner_audio = new Audio("/beep.wav"); scanner_audio.load(); function updateItemsView() { var items = document.querySelector("#items"); items.innerHTML = ""; for (var item in received_items) { var li = document.createElement("li"); li.innerHTML = "<button class=\"btn btn-primary\">"+received_items[item].item.uuid+"<span class=\"badge badge-light\">"+received_items[item].num+"</span></button>"; items.appendChild(li); } } export async function addItemTag(form) { if (form.value.length == 6) { var response = await fetch("http://127.0.0.1:8000/tag/"+form.value); if (response.status == 200) { var tracking_item = await response.json(); if (tracking_item.uuid in received_items) { received_items[tracking_item.uuid].num += 1; } else { received_items[tracking_item.uuid] = { "num":1, "item": tracking_item }; } updateItemsView(); scanner_audio.play(); form.value = ""; } } } async function onItemScanSuccess(item_uuid) { scanner_audio.play(); await scanner.stop(); if (item_uuid.length == 36) { if (item_uuid in received_items) { received_items[item_uuid].num += 1; } else { received_items[item_uuid] = { "num":1, "item": null }; //FIXME: add error handling var response = await fetch("http://127.0.0.1:8000/item/"+item_uuid); if (response.status == 200) { var tracking_item = await response.json(); received_items[item_uuid] = { "num":1, "item": tracking_item }; } } updateItemsView(); } } export async function scanItem() { scanner.start({ facingMode: "user" }, { fps: 10, qrbox: { width: 250, height: 250 } }, onItemScanSuccess); } export async function checkinItems() { for (var item in received_items) { console.log(item, received_items[item]); var response = await fetch("http://127.0.0.1:8000/checkin", { method: "POST", headers: { "Content-Type": "application/json", }, body: JSON.stringify({ "item_uuid": received_items[item].item.uuid, "storage_name": document.querySelector("#storage_select").value, "num": received_items[item].num }) }); var tracking_item = await response.json(); console.log(tracking_item); } } export async function loadStorages() { var response = await fetch("http://127.0.0.1:8000/storages"); var storages = await response.json(); var select = document.querySelector("#storage_select"); for (var i in storages) { console.log(storages[i]); var option = document.createElement("option"); option.textContent = storages[i].name; option.value = storages[i].name; select.appendChild(option); } } async function onRecevierScanSuccess(scannedCode) { var [uuid,signature] = scannedCode.split("/"); scanner_audio.play(); await scanner.stop(); var response = await fetch("http://127.0.0.1:8000/item/"+uuid); if (response.status == 200) { var tracking_item = await response.json(); if (ed448.verify(htoa(signature),new TextEncoder().encode(tracking_item.uuid),htoa(tracking_item.verification))) { document.querySelector("#uuid").innerHTML = tracking_item.uuid; document.querySelector("#tag").innerHTML = tracking_item.tag; document.querySelector("#storage").innerHTML = tracking_item.storage; document.querySelector("#addressee").innerHTML = tracking_item.addressee; document.querySelector("#team").innerHTML = tracking_item.team; } } } export async function scanReceiver() { scanner.start({ facingMode: "user" }, { fps: 10, qrbox: { width: 250, height: 250 } }, onRecevierScanSuccess); }