You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
HelenaExpressApp/www/assets/js/platform.js

441 lines
14 KiB
JavaScript

/*
* 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('<script src="node_modules/@zxing/library/umd/index.min.js"></script>');
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;
});
}