true&&(function polyfill() { const relList = document.createElement("link").relList; if (relList && relList.supports && relList.supports("modulepreload")) { return; } for (const link of document.querySelectorAll('link[rel="modulepreload"]')) { processPreload(link); } new MutationObserver((mutations) => { for (const mutation of mutations) { if (mutation.type !== "childList") { continue; } for (const node of mutation.addedNodes) { if (node.tagName === "LINK" && node.rel === "modulepreload") processPreload(node); } } }).observe(document, { childList: true, subtree: true }); function getFetchOpts(link) { const fetchOpts = {}; if (link.integrity) fetchOpts.integrity = link.integrity; if (link.referrerPolicy) fetchOpts.referrerPolicy = link.referrerPolicy; if (link.crossOrigin === "use-credentials") fetchOpts.credentials = "include"; else if (link.crossOrigin === "anonymous") fetchOpts.credentials = "omit"; else fetchOpts.credentials = "same-origin"; return fetchOpts; } function processPreload(link) { if (link.ep) return; link.ep = true; const fetchOpts = getFetchOpts(link); fetch(link.href, fetchOpts); } }()); const scriptRel = 'modulepreload';const assetsURL = function(dep) { return "/"+dep };const seen = {};const __vitePreload = function preload(baseModule, deps, importerUrl) { let promise = Promise.resolve(); if (true && deps && deps.length > 0) { document.getElementsByTagName("link"); const cspNonceMeta = document.querySelector( "meta[property=csp-nonce]" ); const cspNonce = cspNonceMeta?.nonce || cspNonceMeta?.getAttribute("nonce"); promise = Promise.allSettled( deps.map((dep) => { dep = assetsURL(dep); if (dep in seen) return; seen[dep] = true; const isCss = dep.endsWith(".css"); const cssSelector = isCss ? '[rel="stylesheet"]' : ""; if (document.querySelector(`link[href="${dep}"]${cssSelector}`)) { return; } const link = document.createElement("link"); link.rel = isCss ? "stylesheet" : scriptRel; if (!isCss) { link.as = "script"; } link.crossOrigin = ""; link.href = dep; if (cspNonce) { link.setAttribute("nonce", cspNonce); } document.head.appendChild(link); if (isCss) { return new Promise((res, rej) => { link.addEventListener("load", res); link.addEventListener( "error", () => rej(new Error(`Unable to preload CSS for ${dep}`)) ); }); } }) ); } function handlePreloadError(err) { const e = new Event("vite:preloadError", { cancelable: true }); e.payload = err; window.dispatchEvent(e); if (!e.defaultPrevented) { throw err; } } return promise.then((res) => { for (const item of res || []) { if (item.status !== "rejected") continue; handlePreloadError(item.reason); } return baseModule().catch(handlePreloadError); }); }; const modalHtml = "
-${value.previous_value}
+${value.new_value}
Or
\r\n \r\n{const x=parseFloat(r);return r.endsWith("%")?(y?f-l:d-g)*x/100:x});n=this._scanRegion.width||b;q=this._scanRegion.height||c;p=this._scanRegion.x||0;var u=this._scanRegion.y||0;k=this.$overlay.style;k.width= `${n/b*g}px`;k.height=`${q/c*l}px`;k.top=`${m+w+u/c*l}px`;c=/scaleX\(-1\)/.test(a.style.transform);k.left=`${h+(c?d-v-g:v)+(c?b-p-n:p)/b*g}px`;k.transform=a.style.transform;}});}static _convertPoints(a,b){if(!b)return a;let c=b.x||0,d=b.y||0,f=b.width&&b.downScaledWidth?b.width/b.downScaledWidth:1;b=b.height&&b.downScaledHeight?b.height/b.downScaledHeight:1;for(let h of a)h.x=h.x*f+c,h.y=h.y*b+d;return a}_scanFrame(){!this._active||this.$video.paused||this.$video.ended||("requestVideoFrameCallback"in this.$video?this.$video.requestVideoFrameCallback.bind(this.$video):requestAnimationFrame)(async()=>{if(!(1>=this.$video.readyState)){var a=Date.now()-this._lastScanTimestamp,b=1E3/this._maxScansPerSecond;asetTimeout(d,b-a));this._lastScanTimestamp=Date.now();try{var c=await e.scanImage(this.$video,{scanRegion:this._scanRegion,qrEngine:this._qrEnginePromise,canvas:this.$canvas});}catch(d){if(!this._active)return;this._onDecodeError(d);}!e._disableBarcodeDetector||await this._qrEnginePromise instanceof Worker||(this._qrEnginePromise=e.createQrEngine());c?(this._onDecode?this._onDecode(c):this._legacyOnDecode&&this._legacyOnDecode(c.data),this.$codeOutlineHighlight&&(clearTimeout(this._codeOutlineHighlightRemovalTimeout),this._codeOutlineHighlightRemovalTimeout=void 0,this.$codeOutlineHighlight.setAttribute("viewBox",`${this._scanRegion.x||0} `+`${this._scanRegion.y||0} `+`${this._scanRegion.width||this.$video.videoWidth} `+`${this._scanRegion.height||this.$video.videoHeight}`),this.$codeOutlineHighlight.firstElementChild.setAttribute("points", c.cornerPoints.map(({x:d,y:f})=>`${d},${f}`).join(" ")),this.$codeOutlineHighlight.style.display="")):this.$codeOutlineHighlight&&!this._codeOutlineHighlightRemovalTimeout&&(this._codeOutlineHighlightRemovalTimeout=setTimeout(()=>this.$codeOutlineHighlight.style.display="none",100));}this._scanFrame();});}_onDecodeError(a){a!==e.NO_QR_CODE_FOUND&&console.log(a);}async _getCameraStream(){if(!navigator.mediaDevices)throw "Camera not found.";let a=/^(environment|user)$/.test(this._preferredCamera)?"facingMode": "deviceId",b=[{width:{min:1024}},{width:{min:768}},{}],c=b.map(d=>Object.assign({},d,{[a]:{exact:this._preferredCamera}}));for(let d of [...c,...b])try{let f=await navigator.mediaDevices.getUserMedia({video:d,audio:!1}),h=this._getFacingMode(f)||(d.facingMode?this._preferredCamera:"environment"===this._preferredCamera?"user":"environment");return {stream:f,facingMode:h}}catch(f){}throw "Camera not found.";}async _restartVideoStream(){let a=this._paused;await this.pause(!0)&&!a&&this._active&&await this.start();}static _stopVideoStream(a){for(let b of a.getTracks())b.stop(), a.removeTrack(b);}_setVideoMirror(a){this.$video.style.transform="scaleX("+("user"===a?-1:1)+")";}_getFacingMode(a){return (a=a.getVideoTracks()[0])?/rear|back|environment/i.test(a.label)?"environment":/front|user|face/i.test(a.label)?"user":null:null}static _drawToCanvas(a,b,c,d=!1){c=c||document.createElement("canvas");let f=b&&b.x?b.x:0,h=b&&b.y?b.y:0,m=b&&b.width?b.width:a.videoWidth||a.width,n=b&&b.height?b.height:a.videoHeight||a.height;d||(d=b&&b.downScaledWidth?b.downScaledWidth:m,b=b&&b.downScaledHeight? b.downScaledHeight:n,c.width!==d&&(c.width=d),c.height!==b&&(c.height=b));b=c.getContext("2d",{alpha:!1});b.imageSmoothingEnabled=!1;b.drawImage(a,f,h,m,n,0,0,c.width,c.height);return [c,b]}static async _loadImage(a){if(a instanceof Image)return await e._awaitImageLoad(a),a;if(a instanceof HTMLVideoElement||a instanceof HTMLCanvasElement||a instanceof SVGImageElement||"OffscreenCanvas"in window&&a instanceof OffscreenCanvas||"ImageBitmap"in window&&a instanceof ImageBitmap)return a;if(a instanceof File||a instanceof Blob||a instanceof URL||"string"===typeof a){let b=new Image;b.src=a instanceof File||a instanceof Blob?URL.createObjectURL(a):a.toString();try{return await e._awaitImageLoad(b),b}finally{(a instanceof File||a instanceof Blob)&&URL.revokeObjectURL(b.src);}}else throw "Unsupported image type.";}static async _awaitImageLoad(a){a.complete&&0!==a.naturalWidth||await new Promise((b,c)=>{let d=f=>{a.removeEventListener("load",d);a.removeEventListener("error",d);f instanceof ErrorEvent? c("Image load error"):b();};a.addEventListener("load",d);a.addEventListener("error",d);});}static async _postWorkerMessage(a,b,c,d){return e._postWorkerMessageSync(await a,b,c,d)}static _postWorkerMessageSync(a,b,c,d){if(!(a instanceof Worker))return -1;let f=e._workerMessageId++;a.postMessage({id:f,type:b,data:c},d);return f}}e.DEFAULT_CANVAS_SIZE=400;e.NO_QR_CODE_FOUND="No QR code found";e._disableBarcodeDetector=!1;e._workerMessageId=0; async function prepareAndSendPairingTx() { const service = await Services.getInstance(); try { await service.checkConnections([]); } catch (e) { throw e; } try { const relayAddress = service.getAllRelays(); const createPairingProcessReturn = await service.createPairingProcess("", []); if (!createPairingProcessReturn.updated_process) { throw new Error("createPairingProcess returned an empty new process"); } service.setProcessId(createPairingProcessReturn.updated_process.process_id); service.setStateId(createPairingProcessReturn.updated_process.current_process.states[0].state_id); await service.handleApiReturn(createPairingProcessReturn); } catch (err) { console.error(err); } } class QrScannerComponent extends HTMLElement { videoElement; wrapper; qrScanner; constructor() { super(); this.attachShadow({ mode: "open" }); this.wrapper = document.createElement("div"); this.wrapper.style.position = "relative"; this.wrapper.style.width = "150px"; this.wrapper.style.height = "150px"; this.videoElement = document.createElement("video"); this.videoElement.style.width = "100%"; document.body?.append(this.wrapper); this.wrapper.prepend(this.videoElement); } connectedCallback() { this.initializeScanner(); } async initializeScanner() { if (!this.videoElement) { console.error("Video element not found!"); return; } console.log("🚀 ~ QrScannerComponent ~ initializeScanner ~ this.videoElement:", this.videoElement); this.qrScanner = new e(this.videoElement, (result) => this.onQrCodeScanned(result), { highlightScanRegion: true, highlightCodeOutline: true }); try { await e.hasCamera(); this.qrScanner.start(); this.videoElement.style = "height: 200px; width: 200px"; this.shadowRoot?.appendChild(this.wrapper); } catch (e) { console.error("No camera found or error starting the QR scanner", e); } } async onQrCodeScanned(result) { console.log(`QR Code detected:`, result); const data = result.data; const scannedUrl = new URL(data); const spAddress = scannedUrl.searchParams.get("sp_address"); if (spAddress) { try { await prepareAndSendPairingTx(); } catch (e) { console.error("Failed to pair:", e); } } this.qrScanner.stop(); } disconnectedCallback() { if (this.qrScanner) { this.qrScanner.destroy(); } } } customElements.define("qr-scanner", QrScannerComponent); async function initHomePage() { console.log("INIT-HOME"); const container = getCorrectDOM("login-4nk-component"); container.querySelectorAll(".tab").forEach((tab) => { addSubscription(tab, "click", () => { container.querySelectorAll(".tab").forEach((t) => t.classList.remove("active")); tab.classList.add("active"); container.querySelectorAll(".tab-content").forEach((content) => content.classList.remove("active")); container.querySelector(`#${tab.getAttribute("data-tab")}`)?.classList.add("active"); }); }); const service = await Services.getInstance(); const spAddress = await service.getDeviceAddress(); generateCreateBtn(); displayEmojis(spAddress); await populateMemberSelect(); } function scanDevice() { const container = getCorrectDOM("login-4nk-component"); const scannerImg = container.querySelector("#scanner"); if (scannerImg) scannerImg.style.display = "none"; const scannerQrCode = container.querySelector(".qr-code-scanner"); if (scannerQrCode) scannerQrCode.style.display = "block"; const scanButton = container?.querySelector("#scan-btn"); if (scanButton) scanButton.style.display = "none"; const reader = container?.querySelector("#qr-reader"); if (reader) reader.innerHTML = ""; } async function populateMemberSelect() { const container = getCorrectDOM("login-4nk-component"); const memberSelect = container.querySelector("#memberSelect"); if (!memberSelect) { console.error("Could not find memberSelect element"); return; } const service = await Services.getInstance(); const members = await service.getAllMembersSorted(); for (const [processId, member] of Object.entries(members)) { const process = await service.getProcess(processId); let memberPublicName; if (process) { const publicMemberData = service.getPublicData(process); if (publicMemberData) { const extractedName = publicMemberData["memberPublicName"]; if (extractedName !== void 0 && extractedName !== null) { memberPublicName = extractedName; } } } if (!memberPublicName) { memberPublicName = "Unnamed Member"; } const emojis = await addressToEmoji(processId); const option = document.createElement("option"); option.value = processId; option.textContent = `${memberPublicName} (${emojis})`; memberSelect.appendChild(option); } } window.populateMemberSelect = populateMemberSelect; window.scanDevice = scanDevice; class LoginComponent extends HTMLElement { _callback; constructor() { super(); this.attachShadow({ mode: "open" }); } connectedCallback() { console.log("CALLBACK LOGIN PAGE"); this.render(); setTimeout(() => { initHomePage(); }, 500); } set callback(fn) { if (typeof fn === "function") { this._callback = fn; } else { console.error("Callback is not a function"); } } get callback() { return this._callback; } render() { if (this.shadowRoot) this.shadowRoot.innerHTML = ` ${loginHtml}