/* * This Source Code Form is subject to the terms of the Mozilla Public * License, v. 2.0. If a copy of the MPL was not distributed with this * file, You can obtain one at http://mozilla.org/MPL/2.0/. */ var platform_type = ""; var platform_theme = "md"; var app_version = "unknown"; var nw_tray = null; /** * If true and animations are set to "auto", animations should be disabled. * @type Boolean */ var auto_disable_animations = false; var cordovaInAppBrowserRef = null; var openBrowser = function (url) { window.open(url); } var closeBrowser = function () { // stub } var openExternalBrowser = function (url) { window.open(url); } var scanBarcode = function (success, error) { app.dialog.alert("You can't scan barcodes with this device.", "Sorry!"); } var doHapticFeedback = function () { console.log("Haptics not enabled."); } var appTheme = "light"; var scanningBarcode = false; var getLocation = function (success, error) { if ("geolocation" in navigator) { navigator.geolocation.getCurrentPosition(function (position) { success(position); }, function (err) { if (typeof error == "function") { error(err.message); } }, { enableHighAccuracy: true, timeout: 5000, maximumAge: 0 }); } else { if (typeof error == "function") { error("Location is unavailable."); } } } function setupHTML5BarcodeScanner() { $("body").append(''); scanBarcode = function (success, error) { scanningBarcode = true; $("#web-barcode-ui").removeClass("hidden"); // Stolen from https://zxing-js.github.io/library/examples/multi-camera/ const codeReader = new ZXing.BrowserMultiFormatReader(); console.log("Info", 'ZXing code reader initialized'); codeReader.getVideoInputDevices() .then((videoInputDevices) => { if (videoInputDevices.length == 0) { codeReader.reset(); $("#web-barcode-ui").addClass("hidden"); error("A camera is required to scan barcodes."); return; } selectedDeviceId = videoInputDevices[0].deviceId; codeReader.decodeFromInputVideoDeviceContinuously(selectedDeviceId, 'barcode-viewer', (result, err) => { scanningBarcode = false; if (result) { codeReader.reset(); $("#web-barcode-ui").addClass("hidden"); success(result.text); return; } if (err && !(err instanceof ZXing.NotFoundException)) { console.error(err); codeReader.reset(); $("#web-barcode-ui").addClass("hidden"); error(err); return; } }); }) .catch((err) => { scanningBarcode = false; console.error(err); }); $("#web-barcode-ui").on("click", function () { codeReader.reset(); scanningBarcode = false; $("#web-barcode-ui").addClass("hidden"); }); }; } function setupCordovaBarcodeScanner() { scanBarcode = function (success, error) { scanningBarcode = true; cordova.plugins.barcodeScanner.scan( function (result) { scanningBarcode = false; if (!result.cancelled) { success(result.text); } }, function (err) { scanningBarcode = false; if (typeof error == "function") { error(err); } }, { showTorchButton: true, showFlipCameraButton: true, prompt: "Scan barcode", resultDisplayDuration: 0, disableSuccessBeep: true, formats: "QR_CODE,DATA_MATRIX,CODE_39,CODE_93,CODE_128,CODABAR,PDF_417" } ); }; } /** * Handle a deep link. * @param {string} href the link * @returns {boolean} true if handled, false if rejected. */ function handleDeepLink(href) { var link = new URL(href); if (link.host != "helena.express") { return false; } if (link.hash) { link.fragment = link.hash.substr(1); } switch (link.pathname) { case "/": break; case "/app": case "/app/get": app.dialog.alert("You already have the Helena Express app. You're using it right now!", "Hi there!"); break; case "/das": router.navigate("/das"); break; case "/das/map": router.navigate("/das"); break; case "/das/pickup": if (link.fragment) { sendPickupCode(link.fragment); } else { router.navigate("/das"); } break; case "/das/account": router.navigate("/account"); break; case "/fast": router.navigate("/quicksend"); break; case "/kiosk": router.navigate("/kiosk"); break; case "/manifest": openExternalBrowser(link.href); break; case "/mobile": case "/mobile/": router.navigate("/mobile"); break; case "/notary": router.navigate("/notary"); break; case "/pickup": router.navigate("/pickup"); break; case "/locations": router.navigate("/locations"); break; case "/rates": router.navigate("/rates"); break; case "/review": openExternalBrowser("https://helena.express/review"); break; case "/schedule": router.navigate("/appointment"); break; case "/send": router.navigate("/send"); break; case "/shop": router.navigate("/shop"); break; case "/telegram": case "/telegram/": router.navigate("/telegram"); break; case "/track": if (link.fragment) { router.navigate("/track/" + link.fragment); } else { router.navigate("/track"); } break; default: openBrowser(link.href); } return true; } function initCordova() { platform_type = "cordova"; // Handle back button to close things document.addEventListener("backbutton", handleBackButton, false); document.addEventListener("deviceready", function () { // Make sure the status bar color is set properly applyColorTheme(); if (typeof device != "undefined" && device.platform == "Android") { doHapticFeedback = function () { window.plugins.deviceFeedback.acoustic(); } } if (typeof device != "undefined" && device.platform != "browser") { setupCordovaBarcodeScanner(); } else { setupHTML5BarcodeScanner(); } cordova.plugins.ThemeDetection.isAvailable(function (resp) { if (resp.value == true) { cordova.plugins.ThemeDetection.isDarkModeEnabled(function (resp) { if (resp.value == true) { appTheme = "dark"; } else { appTheme = "light"; } applyColorTheme(); }, function (err) {}); } }, function (err) {}); window.htmlopen = window.open; if (typeof device != "undefined" && device.platform != "browser") { window.open = cordova.InAppBrowser.open; openBrowser = function (url, options, onclose, onmessage) { if (typeof options == "undefined") { options = "location=yes,fullscreen=no,zoom=no"; } cordovaInAppBrowserRef = cordova.InAppBrowser.open(url, "_blank", options); if (typeof onclose == "function") { try { cordovaInAppBrowserRef.removeEventListener("exit"); } catch (ex) { } cordovaInAppBrowserRef.addEventListener("exit", onclose); } if (typeof onmessage == "function") { try { cordovaInAppBrowserRef.removeEventListener("message"); } catch (ex) { } cordovaInAppBrowserRef.addEventListener("message", onmessage); } } closeBrowser = function () { if (typeof cordovaInAppBrowserRef != null) { cordovaInAppBrowserRef.close(); } } openExternalBrowser = function (url) { window.open(url, '_system', ''); } } else { // Running in browser, use a "real" window instead of an IAB one openBrowser = function (url) { window.open(url); } openExternalBrowser = function (url) { window.open(url); } } IonicDeeplink.onDeepLink(function (link) { // Wait a bit so the home page has time to load first. setTimeout(function () { handleDeepLink(link.url); }, 1000); }); }, false); // Handle geo: urls $("body").on("click", "a[href^='geo:']", function (evt) { if (cordova.platformId == "ios") { window.open($(this).attr("href").replace("geo:", "http://maps.apple.com/?q="), "_system"); } else if (cordova.platformId == "android") { window.open($(this).attr("href").replace("geo:", "geo:0,0?q="), "_system"); } else { window.open($(this).attr("href"), "_system"); } evt.preventDefault(); }); $("body").on("click", "a[href^='tel:'],a[href^='sms:'],a[href^='mailto:']", function (evt) { window.open($(this).attr("href"), "_system"); evt.preventDefault(); }); } function initNW() { platform_type = "nw"; platform_theme = "md"; openBrowser = function (url) { nw.Window.open(url, { id: url }, function (browserwin) { // Add menubar so the user can navigate around if they click a link var browsermenu = new nw.Menu({type: 'menubar'}); browsermenu.append(new nw.MenuItem({ label: "Back", click: function () { browserwin.window.history.back(); } })); browsermenu.append(new nw.MenuItem({ label: "Forward", click: function () { browserwin.window.history.forward(); } })); browsermenu.append(new nw.MenuItem({ label: "Home", click: function () { browserwin.window.location.href = url; } })); browserwin.menu = browsermenu; }); } openExternalBrowser = function (url) { require('nw.gui').Shell.openExternal(url); } setupHTML5BarcodeScanner(); // Handle geo: urls $("body").on("click", "a[href^='geo:']", function (evt) { require('nw.gui').Shell.openExternal($(this).attr("href")); evt.preventDefault(); }); $("body").on("click", "a[href^='tel:'],a[href^='sms:'],a[href^='mailto:']", function (evt) { require('nw.gui').Shell.openExternal($(this).attr("href")); evt.preventDefault(); }); // automatic theme, default light if (typeof Framework7.device.prefersColorScheme() !== 'undefined' && Framework7.device.prefersColorScheme() == "dark") { appTheme = "dark"; } else { appTheme = "light"; } applyColorTheme(); } function initBrowser() { platform_type = "browser"; platform_theme = "md"; openBrowser = function (url) { window.open(url); } openExternalBrowser = function (url) { window.open(url); } setupHTML5BarcodeScanner(); $("body").on("click", "a[href^='geo:']", function (evt) { window.open($(this).attr("href"), "_blank"); evt.preventDefault(); }); $("body").on("click", "a[href^='tel:'],a[href^='sms:'],a[href^='mailto:']", function (evt) { window.open($(this).attr("href"), "_blank"); evt.preventDefault(); }); // automatic theme, default light if (typeof Framework7.device.prefersColorScheme() !== 'undefined' && Framework7.device.prefersColorScheme() == "dark") { appTheme = "dark"; } else { appTheme = "light"; } applyColorTheme(); } function initPlatform() { if (typeof cordova !== 'undefined') { initCordova(); } else if (typeof nw !== 'undefined') { initNW(); } else { initBrowser(); } $.getJSON("package.json", function (data) { app_version = data.version; }); }