/* * 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 dynamicPages = [ "notary", "telegram", "trailer", "moneyorder" ]; var compiledPages = {}; var pagesToCompile = [ "home", "send", "welcome", "notary", "servicearea", "appointment", "dropandsend", "pickup", "shop", "shoppingcart_fragment", "rateresult", // "labelrateresult", "crypto", "crypto_wallet", "account", "trackresult", "settings", "receipts", "trailer", "money", "moneyorder", "postalpoint", "quicksend" ]; console.log("Compiling page templates..."); for (var i = 0; i < pagesToCompile.length; i++) { compiledPages[pagesToCompile[i]] = Template7.compile($.ajax({ type: "GET", url: "./pages/" + pagesToCompile[i] + ".html", async: false }).responseText); } console.log("Compiled page templates."); var routes = [ { path: '/welcome', content: compiledPages.welcome(), name: 'welcome', on: { pageAfterIn: function () { } } }, { path: '/crypto', name: 'crypto', async: function ( {resolve, reject}) { resolve({ content: compiledPages.crypto({ slideshow: [ { image: "assets/images/crypto/slides/intro.svg", text: "Bitcoin and cryptocurrency can be complicated. We've made it simple. Swipe left for more." }, { image: "assets/images/crypto/slides/vault.svg", text: "With your Helena Express paper wallet, you can save..." }, { image: "assets/images/crypto/slides/spend.svg", text: "...or spend, without worrying about hackers..." }, { image: "assets/images/crypto/slides/secure.svg", text: "...because paper can't be hacked." }, { image: "assets/images/crypto/slides/scantostart.svg", text: "Scan your paper wallet to get started, or order one in the shop." } ] }) }, {}); }, on: { pageAfterIn: function () { app.swiper.destroy("#crypto-intro-swiper"); app.swiper.create("#crypto-intro-swiper", { pagination: { el: "#crypto-intro-swiper-pagination", type: "bullets", clickable: true } }); } } }, { path: '/crypto/:walletaddress/:toaddress', async: openWalletBalancePage, name: 'crypto_wallet', on: { pageAfterIn: function () { $("#sendCryptoOpenPopupBtn").click(); setupReceiveFiatConversion(); } } }, { path: '/crypto/:walletaddress/:toaddress/:amount', async: openWalletBalancePage, name: 'crypto_wallet', on: { pageAfterIn: function () { $("#sendCryptoOpenPopupBtn").click(); setupReceiveFiatConversion(); } } }, { path: '/crypto/:walletaddress', async: openWalletBalancePage, name: 'crypto_wallet', on: { pageAfterIn: function () { setupReceiveFiatConversion(); } } }, { path: '/home', name: 'home', alias: ["/"], on: { pageBeforeIn: function () { // make sure it's not shown right after account setup var accountsetup = (inStorage("accountkey") && inStorage("accountnumber")); if (accountsetup) { $("#finishaccountsetupnag").css("display", "none"); } } }, async: function ( { resolve, reject }) { // Show a nag message if no account is set up var accountsetup = (inStorage("accountkey") && inStorage("accountnumber")) || getStorage("hideaccountnag") == "true"; // add escape hatch to regular website if running online var escapehatch = false; if (window.location.hostname == "app.helena.express") { escapehatch = true; } resolve({ content: compiledPages.home({ accountsetup: accountsetup, escapehatch: escapehatch, pages: [ { title: "Send a Package", href: "/send", icon: "fa-duotone fa-box-alt", text: "Find locations or request a pickup." }, { title: "Notarize a Document", href: "/notary", icon: "fa-duotone fa-file-signature", text: "Book a mobile notary visit." }, { title: "My Account", href: "/account", icon: "fa-duotone fa-user-circle", text: "View receipts, get account number, update payment method, and more." }, { title: "Shop for Supplies", href: "/shop", icon: "fa-duotone fa-shopping-cart", text: "Get boxes, labels, and shipping supplies delivered to your door." }, { title: "Write a Telegram", href: "/telegram", icon: "fa-duotone fa-typewriter", text: "Send a hand-delivered telegram anywhere in the Helena area." }, { title: "Money Services", href: "/money", icon: "fa-duotone fa-money-bill-wave", text: "Manage money orders and cryptocurrency." } ] }) }, {}); } }, { path: '/send', name: 'send', async: function ( { resolve, reject }) { resolve({ content: compiledPages.send({ pages: [ // { // title: "From My Phone", // href: "/labelmaker", // icon: "fa-duotone fa-mobile-alt", // text: "Send USPS Flat Rate packages from your phone. Printer optional." // }, { title: "Shipping Kiosk", href: "/postalpoint", icon: "fa-duotone fa-shop", text: "Stop by a PostalPoint kiosk at a local business, put your package on the scale, and print postage." }, { title: "Drop Box", href: "/das", icon: "fa-duotone fa-box-alt", text: "Just drop your package into a Drop and Send drop box. We'll add postage for you and charge your account." }, { title: "Pickup", href: "/pickup", icon: "fa-duotone fa-home", text: "Leave your package on your porch and we'll pick it up and ship it for you. No postage or appointment needed." }, { title: "Mobile Shipping Center", href: "/mobile", icon: "fa-duotone fa-caravan", text: "Our Mobile Shipping Center roams the Helena area like a food truck for mail. Find dates and places here." }, { title: "Appointment", href: "/appointment/shipping", icon: "fa-duotone fa-calendar-alt", text: "A courier will come to you on your schedule. No account required." } ] }) }, {}); } }, { path: '/money', name: 'money', async: function ( { resolve, reject }) { resolve({ content: compiledPages.money({ pages: [ { title: "Money Orders", href: "/moneyorder", icon: "fa-duotone fa-money-check-dollar", text: "Check and verify a Helena Express money order." }, { title: "Crypto Wallet", href: "/crypto", icon: "fa-duotone fa-wallet", text: "Check your crypto wallet balance and pay people with cryptocurrency." } ] }) }, {}); } }, { path: '/moneyorder', content: compiledPages.moneyorder(), name: 'moneyorder', on: { pageBeforeIn: function () { dyncontent = getDynamicPageContent("moneyorder"); if (dyncontent != null) { $("#moneyorder-dyncontent").html(dyncontent); } } } }, { path: '/notary', content: compiledPages.notary(), name: 'notary', on: { pageBeforeIn: function () { dyncontent = getDynamicPageContent("notary"); if (dyncontent != null) { $("#notary-dyncontent").html(dyncontent); } }, pageAfterIn: function () { app.swiper.destroy("#notary-info-swiper"); app.swiper.create("#notary-info-swiper", { pagination: { el: "#notary-info-swiper-pagination", type: "bullets", clickable: true } }); } } }, { path: '/servicearea', content: compiledPages.servicearea(), name: 'servicearea', on: { pageAfterIn: function () { loadServiceAreaMap(); }, pageAfterOut: function () { serviceAreaMap = null; } } }, { path: '/quicksend', name: 'quicksend', async: function ( {resolve}) { resolve({ content: compiledPages.quicksend({ from_name: inStorage("quicksend_name") ? getStorage("quicksend_name") : "", from_company: inStorage("quicksend_company") ? getStorage("quicksend_company") : "", from_street1: inStorage("quicksend_street1") ? getStorage("quicksend_street1") : (inStorage("lastpickupaddress") ? getStorage("lastpickupaddress") : ""), from_street2: inStorage("quicksend_street2") ? getStorage("quicksend_street2") : "", from_zip: inStorage("quicksend_zip") ? getStorage("quicksend_zip") : (inStorage("lastpickupzipcode") ? getStorage("lastpickupzipcode") : ""), from_phone: inStorage("quicksend_phone") ? getStorage("quicksend_phone") : "" }) }, {}); }, }, { path: '/appointment', name: 'appointment', async: function ( { resolve, reject }) { resolve({ content: compiledPages.appointment({ services: [ { title: "Package Pickup", text: "A courier will come to you and ship your mail, packages, etc.", icon: "fa-duotone fa-hand-holding-box", serviceid: "shipping" }, { title: "Mobile Notary", text: "A notary public will come to you and notarize your documents.", icon: "fa-duotone fa-file-signature", serviceid: "notary" } ] }) }, { }); }, routes: [ { path: "/:serviceId", async: function ( { resolve, reject, to }) { var url = SETTINGS.apis.appointmentredirect + "?service=" + to.params.serviceId; if ($("body").hasClass("dark")) { url += "&darkmode=1"; } resolve({ content: compiledPages.appointment({ url: url, serviceid: to.params.serviceId }) }, { }); } } ] }, { path: '/das', name: 'dropandsend', content: compiledPages.dropandsend(), on: { pageBeforeIn: function () { checkIfAccountGoodWithPaymentMethod(function (ok) { if (!ok) { $("#addPaymentMethodNag").css("display", ""); } }, function (error) { $("#addPaymentMethodNag").css("display", ""); }); var dayofweek = formatTimestamp("l"); switch (dayofweek) { case "Saturday": case "Sunday": $("#pickupWeekendWarning").css("display", ""); break; } var hourofday = formatTimestamp("H"); if (hourofday > 12 + 4) { $("#pickupLateInDayWarning").css("display", ""); } }, pageAfterOut: function () { dropboxMap = null; } } }, { path: '/postalpoint', name: 'postalpoint', async: function ( {resolve, reject}) { app.dialog.preloader("Loading..."); apirequest(SETTINGS.apis.postalpoint_locations, [], function (resp) { app.dialog.close(); var locations = []; for (var i = 0; i < resp.features.length; i++) { locations.push({ name: resp.features[i].properties.name, info: resp.features[i].properties.info, hours: resp.features[i].properties.hours, geo: resp.features[i].geometry.coordinates[1] + "," + resp.features[i].geometry.coordinates[0] }); } resolve({ content: compiledPages.postalpoint({ locations: locations }) }, {}); }, function (error) { app.dialog.close(); app.dialog.alert("Couldn't download the list of PostalPoint locations. Try again later.", "Whoops!"); sendErrorReport("PostalPoint", "Loading locations"); resolve({ content: compiledPages.postalpoint({ locations: [] }) }, {}); }, "GET"); }, on: { pageBeforeIn: function () { dyncontent = getDynamicPageContent("postalpoint"); if (dyncontent != null) { $("#postalpoint-dyncontent").html(dyncontent); } } } }, { path: '/pickup', name: 'pickup', async: function ( {resolve}) { resolve({ content: compiledPages.pickup({ streetaddress: inStorage("lastpickupaddress") ? getStorage("lastpickupaddress") : "", zipcode: inStorage("lastpickupzipcode") ? getStorage("lastpickupzipcode") : "" }) }, {}); }, on: { pageBeforeIn: function () { checkIfAccountGoodWithPaymentMethod(function (ok) { if (!ok) { $("#addPaymentMethodNag").css("display", ""); } }, function (error) { $("#addPaymentMethodNag").css("display", ""); }); var dayofweek = formatTimestamp("l"); switch (dayofweek) { case "Saturday": case "Sunday": $("#pickupWeekendWarning").css("display", ""); break; } var hourofday = formatTimestamp("H"); if (hourofday > 12 + 4) { $("#pickupLateInDayWarning").css("display", ""); } } } }, { path: '/shop', name: 'shop', async: loadShopPage, on: { pageBeforeIn: function () { checkIfAccountGoodWithPaymentMethod(function (ok) { if (!ok) { $("#addPaymentMethodNag").css("display", ""); } }, function (error) { $("#addPaymentMethodNag").css("display", ""); }); updateCart(); } } }, { path: '/mobile', name: 'trailer', async: function ( {resolve, reject}) { app.dialog.preloader("Checking the schedule..."); apirequest(SETTINGS.apis.trailerschedule, [], function (resp) { app.dialog.close(); resolve({ content: compiledPages.trailer({ schedule: resp }) }, {}); }, function (error) { app.dialog.close(); app.dialog.alert("Couldn't get the latest schedule. Try again later.", "Whoops!"); sendErrorReport("Trailer", "Loading schedule"); resolve({ content: compiledPages.trailer({ schedule: [] }) }, {}); }, "GET"); }, on: { pageBeforeIn: function () { dyncontent = getDynamicPageContent("trailer"); if (dyncontent != null) { $("#trailer-dyncontent").html(dyncontent); } } } }, { path: '/telegram', name: 'telegram', url: './pages/telegram.html', on: { pageBeforeIn: function () { checkIfAccountGoodWithPaymentMethod(function (ok) { if (!ok) { $("#addPaymentMethodNag").css("display", ""); } }, function (error) { $("#addPaymentMethodNag").css("display", ""); }); dyncontent = getDynamicPageContent("telegram"); if (dyncontent != null) { $("#telegram-dyncontent").html(dyncontent); } } } }, { path: '/track', url: './pages/track.html', name: 'track', on: { pageBeforeIn: function () { addTrackingSuggestions(); $("#trackingcode").val("0"); app.input.validate("#trackingcode"); $("#trackingcode").val(""); } } }, { path: '/rates', url: './pages/rates.html', name: 'rates', on: { pageAfterIn: function () { initRateForm(); } } }, // { // path: '/labelmaker', // url: './pages/labelmaker.html', // name: 'labelmaker', // on: { // pageBeforeIn: function () { // checkIfAccountGoodWithPaymentMethod(function (ok) { // if (!ok) { // $("#addPaymentMethodNag").css("display", ""); // } // }, function (error) { // $("#addPaymentMethodNag").css("display", ""); // }); // }, // pageAfterIn: function () { // initLabelMakerForm(); // } // } // }, { path: '/account', name: 'account', content: compiledPages.account(), on: { pageAfterIn: function () { initAccountPage(); } } }, { path: '/track/:code', name: 'trackresult', async: trackOpenAsync, on: { pageAfterIn: function () { var mapboxel = document.getElementById("mapbox-track"); var trackingMap = new MapControl(mapboxel, false); trackingMap.reloadMap(); var latitude = $(mapboxel).data("latitude"); var longitude = $(mapboxel).data("longitude"); var accurate = $(mapboxel).data("accurate") == true; var geoiscountrylevel = $(mapboxel).data("geoiscountrylevel") == true; trackingMap.clearMarkersAndCenterMapOnNewMarker("package-marker", latitude, longitude, accurate, geoiscountrylevel); } } }, { path: '/receipts', name: 'receipts', async: function ( {resolve, reject}) { app.dialog.preloader("Loading..."); apirequest(SETTINGS.apis.getreceipts, { accountnumber: getStorage("accountnumber"), accountkey: getStorage("accountkey") }, function (success) { app.dialog.close(); if (success.status == "OK") { var receipts = success.receipts; if (receipts.length == 0) { receipts = false; } resolve({ content: compiledPages.receipts({ receipts: receipts }) }); } else { app.dialog.alert(success.msg, "Error"); sendErrorReport("Receipts", "Loading receipt list", success.msg); reject(); } }, function (xhr, status, error) { app.dialog.close(); app.dialog.alert("There's a server or network problem. Check your Internet connection or try again later.", "Error"); sendErrorReport("Receipts", "Couldn't load receipts", "Server/network problem: " + xhr.status + ": " + xhr.statusText); reject(); }, "POST"); } }, { path: '/credits', url: './pages/credits.html', name: 'credits' }, { path: '/settings', name: 'settings', async: function ( {resolve}) { var settings = []; settings.push( { setting: "display", title: "Display and Appearance", text: "", onclick: "router.navigate('/settings/display')", link: true } ); settings.push( { setting: "resetaccount", title: "Forget Account", text: "Log out and disconnect from your Helena Express account.", onclick: "resetAccountPrompt()", link: true }, { setting: "versions", title: "Helena Express app v" + app_version, text: "Copyright © 2019-2023 Helena Express and Netsyms Technologies.", onclick: "" }, { setting: "opensource", title: "Credits and open source info", text: "", onclick: "router.navigate('/credits')", link: true }, { setting: "legal", title: "Terms of Use and Privacy Policy", text: "", onclick: "openBrowser('https://helena.express/appterms?mtm_campaign=HelenaExpressApp')", link: true }, { setting: "analytics", title: "Analytics", text: "If turned on, we'll collect some anonymous information to help improve the app. It is not sent to any third parties.", toggle: true, checked: getStorage("analytics") !== "false", onclick: "" }, ); resolve({ content: compiledPages.settings({ page_title: "Settings", settings: settings }) }); }, routes: [ { path: '/display', name: 'settings', async: function ( {resolve}) { var settings = [ { setting: "apptheme", title: "Color theme", select: true, options: [ { value: "auto", label: "Auto", selected: getStorage("apptheme") == null || getStorage("apptheme") == "auto" }, { value: "dark", label: "Dark", selected: getStorage("apptheme") == "dark" }, { value: "light", label: "Light", selected: getStorage("apptheme") == "light" } ] }, { setting: "animation", title: "Animations", select: true, options: [ { value: "auto", label: "On", selected: getStorage("animation") == null || getStorage("animation") == "auto" || getStorage("animation") == "on" }, // { // value: "on", // label: "On", // selected: getStorage("animation") == "on" // }, { value: "off", label: "Off", selected: getStorage("animation") == "off" } ] }, { setting: "hideaccountnag", title: "Hide \"Finish Account Setup\"", text: "", toggle: true, checked: getStorage("hideaccountnag") == "true", onclick: "" } ]; resolve({ content: compiledPages.settings({ page_title: "Display Settings", settings: settings }) }); } } ] } ];