|
|
|
/*
|
|
|
|
* 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 compiledPages = {};
|
|
|
|
var pagesToCompile = [
|
|
|
|
"home",
|
|
|
|
"send",
|
|
|
|
"welcome",
|
|
|
|
"notary",
|
|
|
|
"servicearea",
|
|
|
|
"appointment",
|
|
|
|
"dropandsend",
|
|
|
|
"pickup",
|
|
|
|
"shop",
|
|
|
|
"shoppingcart_fragment",
|
|
|
|
"rateresult",
|
|
|
|
"crypto",
|
|
|
|
"crypto_wallet",
|
|
|
|
"account",
|
|
|
|
"trackresult",
|
|
|
|
"settings",
|
|
|
|
"receipts"
|
|
|
|
];
|
|
|
|
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."
|
|
|
|
},
|
|
|
|
{
|
|
|
|
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',
|
|
|
|
async: openWalletBalancePage,
|
|
|
|
name: 'crypto_wallet'
|
|
|
|
},
|
|
|
|
{
|
|
|
|
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 a drop box or schedule a pickup."
|
|
|
|
},
|
|
|
|
{
|
|
|
|
title: "Notarize a Document",
|
|
|
|
href: "/notary",
|
|
|
|
icon: "fa-duotone fa-file-signature",
|
|
|
|
text: "Book a mobile notary visit."
|
|
|
|
},
|
|
|
|
{
|
|
|
|
title: "Write a Telegram",
|
|
|
|
href: "/telegram",
|
|
|
|
icon: "fa-duotone fa-typewriter",
|
|
|
|
text: "Send a hand-delivered telegram anywhere in the Helena area."
|
|
|
|
},
|
|
|
|
{
|
|
|
|
title: "Shop for Supplies",
|
|
|
|
href: "/shop",
|
|
|
|
icon: "fa-duotone fa-shopping-cart",
|
|
|
|
text: "Get boxes, labels, and shipping supplies delivered to your door."
|
|
|
|
},
|
|
|
|
{
|
|
|
|
title: "Crypto Wallet",
|
|
|
|
href: "/crypto",
|
|
|
|
icon: "fa-duotone fa-wallet",
|
|
|
|
text: "Check your crypto wallet balance and pay people with cryptocurrency."
|
|
|
|
},
|
|
|
|
{
|
|
|
|
title: "My Account",
|
|
|
|
href: "/account",
|
|
|
|
icon: "fa-duotone fa-user-circle",
|
|
|
|
text: "Get account number, check rewards points, update payment method, and more."
|
|
|
|
},
|
|
|
|
]
|
|
|
|
})
|
|
|
|
}, {});
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
path: '/send',
|
|
|
|
name: 'send',
|
|
|
|
async: function ( { resolve, reject }) {
|
|
|
|
resolve({
|
|
|
|
content: compiledPages.send({
|
|
|
|
pages: [
|
|
|
|
{
|
|
|
|
title: "Use a Drop Box",
|
|
|
|
href: "/dropandsend",
|
|
|
|
icon: "fa-duotone fa-box-alt",
|
|
|
|
text: "Bring your package to a Drop and Send location and we'll ship it for you. No postage or appointment needed."
|
|
|
|
},
|
|
|
|
{
|
|
|
|
title: "Request a 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: "Book an Appointment",
|
|
|
|
href: "/appointment/shipping",
|
|
|
|
icon: "fa-duotone fa-calendar-alt",
|
|
|
|
text: "A courier will come to you on your schedule. No account required."
|
|
|
|
}
|
|
|
|
]
|
|
|
|
})
|
|
|
|
}, {});
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
path: '/notary',
|
|
|
|
content: compiledPages.notary(),
|
|
|
|
name: 'notary',
|
|
|
|
on: {
|
|
|
|
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: '/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: '/dropandsend',
|
|
|
|
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: '/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: '/telegram',
|
|
|
|
name: 'telegram',
|
|
|
|
url: './pages/telegram.html',
|
|
|
|
on: {
|
|
|
|
pageBeforeIn: function () {
|
|
|
|
checkIfAccountGoodWithPaymentMethod(function (ok) {
|
|
|
|
if (!ok) {
|
|
|
|
$("#addPaymentMethodNag").css("display", "");
|
|
|
|
}
|
|
|
|
}, function (error) {
|
|
|
|
$("#addPaymentMethodNag").css("display", "");
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
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: '/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;
|
|
|
|
trackingMap.clearMarkersAndCenterMapOnNewMarker("package-marker", latitude, longitude, accurate);
|
|
|
|
}
|
|
|
|
}
|
|
|
|
},
|
|
|
|
{
|
|
|
|
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-2022 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
|
|
|
|
})
|
|
|
|
});
|
|
|
|
}
|
|
|
|
}
|
|
|
|
]
|
|
|
|
}
|
|
|
|
];
|