Compare commits

...

7 Commits

@ -1,5 +1,5 @@
<?xml version='1.0' encoding='utf-8'?>
<widget id="com.netsyms.helenaexpress.app" version="2.0.4" xmlns="http://www.w3.org/ns/widgets" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:cdv="http://cordova.apache.org/ns/1.0">
<widget id="com.netsyms.helenaexpress.app" version="2.1.0" xmlns="http://www.w3.org/ns/widgets" xmlns:android="http://schemas.android.com/apk/res/android" xmlns:cdv="http://cordova.apache.org/ns/1.0">
<name short="Helena Express">Helena Express</name>
<description>
</description>
@ -52,7 +52,7 @@
<preference name="SplashMaintainAspectRatio" value="true" />
<preference name="AndroidXEnabled" value="true" />
<!-- Don't exclude devices with very cheap cameras like Kindle Fire tablets -->
<config-file target="AndroidManifest.xml" parent="/manifest/application">
<config-file target="AndroidManifest.xml" parent="/manifest">
<uses-feature android:name="android.hardware.camera.autofocus" android:required="false"/>
<uses-feature android:name="android.hardware.camera.flash" android:required="false"/>
<uses-feature android:name="android.hardware.location.gps" android:required="false" />
@ -72,6 +72,9 @@
<edit-config file="*-Info.plist" mode="merge" target="NSLocationWhenInUseUsageDescription">
<string>Your location is used to show your position on maps. It does not leave your device.</string>
</edit-config>
<edit-config file="*-Info.plist" mode="merge" target="NSLocationAlwaysAndWhenInUseUsageDescription">
<string>Your location is used to show your position on maps. It does not leave your device.</string>
</edit-config>
<config-file target="*-Info.plist" parent="ITSAppUsesNonExemptEncryption" mode="add">
<false/>
</config-file>

2
package-lock.json generated

@ -1,6 +1,6 @@
{
"name": "com.netsyms.helenaexpress.app",
"version": "2.0.3",
"version": "2.1.0",
"lockfileVersion": 2,
"requires": true,
"packages": {

@ -1,7 +1,7 @@
{
"name": "com.netsyms.helenaexpress.app",
"displayName": "Helena Express",
"version": "2.0.4",
"version": "2.1.0",
"description": "App to request and track shipping services",
"product_string": "Helena Express",
"main": "www/index.html",

@ -63,6 +63,18 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/.
background-color: rgba(0,0,0,0.95);
}
.hidden-light {
display: none;
}
.dark .hidden-dark {
display: none;
}
.dark .hidden-light {
display: initial;
}
.navbar, .navbar-bg, .subnavbar, .subnavbar *, .subnavbar .searchbar-inner .searchbar-input-wrap * {
background-color: var(--solid-translucent-color);
}

@ -57,6 +57,10 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
:root {
--location-map-height: calc(100vh - calc(var(--f7-navbar-height) + var(--f7-toolbar-height)));
}
.md, .aurora {
--service-area-map-height: calc(100vh - calc(var(--f7-navbar-height) + var(--f7-toolbar-height)));
}
@ -70,6 +74,22 @@ file, You can obtain one at http://mozilla.org/MPL/2.0/.
height: var(--service-area-map-height);
}
#mapbox-locations {
width: 100%;
height: var(--location-map-height);
}
#locationInfoModal .sheet-modal-inner {
overflow-y: auto;
}
#locationInfoModalContainer {
margin-top: 1em;
}
#mapbox-locations.sheet-open {
height: calc(var(--location-map-height) - var(--f7-sheet-height));
}
/*

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.5 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 896 B

@ -0,0 +1,90 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="81.953mm" height="17.496mm" version="1.1" viewBox="0 0 81.953 17.496" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<defs>
<clipPath id="clipPath965">
<rect x="73.099" y="121.75" width="66.791" height=".70158" fill="#2196f3" style="paint-order:normal"/>
</clipPath>
</defs>
<metadata>
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
<dc:title/>
</cc:Work>
</rdf:RDF>
</metadata>
<g transform="translate(-49.738 -106.82)">
<g transform="translate(-7.3027 -5.9991)">
<g stroke-width=".26458px">
<g aria-label="PostalPoint">
<path d="m78.763 117.96q0.71118 0 1.2756 0.15804 0.57572 0.14675 0.97082 0.44026 0.3951 0.28221 0.60958 0.69989 0.21448 0.41768 0.21448 0.93696 0 0.84664-0.32737 1.4336-0.32737 0.58701-0.90309 0.94824-0.57572 0.36124-1.3546 0.51928t-1.6933 0.15804h-0.44026l-0.63216 2.619h-1.7497l1.84-7.7101q0.60958-0.11289 1.1514-0.15804 0.55314-0.0452 1.0386-0.0452zm-0.14675 1.4788q-0.19191 0-0.32737 0.0113-0.13546 0.0113-0.27093 0.0226l-0.54185 2.3029h0.44026q0.47412 0 0.85794-0.0677 0.3951-0.079 0.66603-0.24835 0.28222-0.16933 0.42897-0.42897 0.15804-0.27092 0.15804-0.65474 0-0.50798-0.37252-0.72247-0.36124-0.21448-1.0386-0.21448z"/>
<path d="m84.728 126.03q-0.5983 0-1.0386-0.18062-0.44026-0.18062-0.73376-0.50799-0.28222-0.32737-0.42897-0.76762-0.14675-0.45155-0.14675-0.9934 0-0.67732 0.21448-1.3546 0.22577-0.67732 0.65474-1.2192 0.42897-0.54186 1.0498-0.88052 0.62087-0.34994 1.4224-0.34994 0.58701 0 1.0273 0.18062 0.45154 0.18061 0.73376 0.50798 0.2935 0.32737 0.44026 0.77892 0.14675 0.44025 0.14675 0.98211 0 0.67731-0.21448 1.3546-0.21448 0.67732-0.63216 1.2192-0.41768 0.54185-1.0498 0.8918-0.62087 0.33866-1.4449 0.33866zm0.83536-4.8315q-0.37252 0-0.65474 0.21449-0.28222 0.21448-0.47412 0.54185-0.19191 0.32737-0.2935 0.72247-0.09031 0.38381-0.09031 0.73376 0 0.57572 0.18062 0.8918 0.18062 0.30479 0.65474 0.30479 0.37252 0 0.65474-0.21448t0.47412-0.54185q0.19191-0.32737 0.28222-0.71119 0.1016-0.3951 0.1016-0.74504 0-0.57572-0.18062-0.88052-0.18062-0.31608-0.65474-0.31608z"/>
<path d="m90.718 124.67q0.57572 0 0.7902-0.15804 0.21448-0.16933 0.21448-0.36123 0-0.12418-0.04515-0.21449-0.03387-0.0903-0.12417-0.16932-0.09031-0.079-0.24835-0.15805-0.15804-0.0903-0.40639-0.20319-0.28222-0.12417-0.53056-0.25964-0.24835-0.14675-0.44026-0.33866-0.18062-0.20319-0.2935-0.45154-0.1016-0.25964-0.1016-0.60959 0-0.91437 0.66603-1.4449 0.67732-0.53056 1.9642-0.53056 0.60958 0 1.0837 0.13546 0.47412 0.13546 0.76762 0.29351l-0.57572 1.253q-0.23706-0.12417-0.60958-0.23706t-0.73376-0.11289q-0.15804 0-0.31608 0.0226-0.14675 0.0113-0.28222 0.0677-0.12418 0.0564-0.2032 0.15804-0.07902 0.1016-0.07902 0.27093 0 0.22577 0.16933 0.33866 0.18062 0.11288 0.4967 0.27092 0.44026 0.21449 0.73376 0.39511 0.2935 0.18061 0.46283 0.38381 0.18062 0.20319 0.25964 0.46283 0.07902 0.25964 0.07902 0.60959 0 0.36123-0.15804 0.71118-0.14675 0.34995-0.47412 0.62087-0.32737 0.27093-0.83536 0.44026-0.50799 0.16933-1.2192 0.16933-0.44026 0-0.80149-0.0564-0.34995-0.0564-0.62087-0.13546-0.27093-0.0903-0.46283-0.18062-0.18062-0.0903-0.28222-0.14675l0.57572-1.2869q0.19191 0.11289 0.5983 0.28221 0.40639 0.16933 0.98211 0.16933z"/>
<path d="m96.112 118.45 1.7497-0.27093-0.42897 1.7497h1.8739l-0.33866 1.3772h-1.8626l-0.4967 2.0771q-0.06773 0.25964-0.09031 0.48541-0.01129 0.22577 0.05644 0.3951 0.07902 0.15804 0.25964 0.24835 0.18062 0.0903 0.4967 0.0903 0.27093 0 0.51928-0.0451 0.25964-0.0564 0.51928-0.14675l0.12418 1.2869q-0.33866 0.12417-0.73376 0.21448-0.3951 0.0903-0.93696 0.0903-0.77891 0-1.2079-0.22577-0.42897-0.23706-0.60958-0.63216-0.18062-0.40639-0.15804-0.92567 0.02258-0.51928 0.15804-1.095z"/>
<path d="m104.8 123.31q-0.15804 0.64345-0.0903 1.2982 0.0677 0.64345 0.25963 1.1514l-1.5014 0.21448q-0.0677-0.13546-0.12418-0.25963-0.0564-0.12418-0.11288-0.28222-0.31608 0.25964-0.6999 0.42897-0.38381 0.16933-0.85793 0.16933-0.56443 0-0.97082-0.19191-0.3951-0.20319-0.65474-0.53056-0.24835-0.33866-0.36124-0.77892-0.11289-0.45154-0.11289-0.95953 0-0.77891 0.27093-1.4675 0.28222-0.6886 0.76762-1.1966 0.4967-0.51928 1.1627-0.81278t1.4449-0.2935q0.1016 0 0.34995 0.0113 0.25963 0.0113 0.587 0.0564 0.32737 0.0339 0.68861 0.12417 0.36123 0.0903 0.6886 0.24835zm-1.174-2.0771q-0.14675-0.0226-0.27093-0.0339-0.11288-0.0113-0.28221-0.0113-0.38382 0-0.72247 0.19191-0.32737 0.19191-0.57572 0.50799-0.24835 0.30479-0.3951 0.71118-0.13547 0.40639-0.13547 0.84665 0 0.54185 0.18062 0.85793t0.66603 0.31608q0.25964 0 0.46283-0.1016 0.21448-0.10159 0.45155-0.33865 0.0226-0.28222 0.0677-0.58701 0.0564-0.31608 0.11288-0.57572z"/>
<path d="m108.6 125.98q-0.80149 0-1.2643-0.20319-0.45155-0.21449-0.65474-0.57572-0.19191-0.36124-0.19191-0.82407 0.0113-0.47412 0.13546-1.0047l1.4337-5.9942 1.7497-0.27092-1.5691 6.5022q-0.0451 0.2032-0.0564 0.37253 0 0.16933 0.0677 0.30479 0.0677 0.12418 0.22578 0.2032 0.16932 0.079 0.46283 0.10159z"/>
<path d="m114.04 117.96q0.71119 0 1.2756 0.15804 0.57571 0.14675 0.97082 0.44026 0.3951 0.28221 0.60958 0.69989t0.21448 0.93696q0 0.84664-0.32737 1.4336-0.32736 0.58701-0.90308 0.94824-0.57572 0.36124-1.3546 0.51928-0.77891 0.15804-1.6933 0.15804h-0.44025l-0.63217 2.619h-1.7497l1.84-7.7101q0.60959-0.11289 1.1514-0.15804 0.55314-0.0452 1.0386-0.0452zm-0.14675 1.4788q-0.1919 0-0.32737 0.0113-0.13546 0.0113-0.27092 0.0226l-0.54186 2.3029h0.44026q0.47412 0 0.85793-0.0677 0.3951-0.079 0.66603-0.24835 0.28221-0.16933 0.42897-0.42897 0.15804-0.27092 0.15804-0.65474 0-0.50798-0.37253-0.72247-0.36123-0.21448-1.0386-0.21448z"/>
<path d="m120 126.03q-0.59829 0-1.0386-0.18062t-0.73376-0.50799q-0.28221-0.32737-0.42897-0.76762-0.14675-0.45155-0.14675-0.9934 0-0.67732 0.21448-1.3546 0.22578-0.67732 0.65474-1.2192 0.42897-0.54186 1.0498-0.88052 0.62088-0.34994 1.4224-0.34994 0.58701 0 1.0273 0.18062 0.45155 0.18061 0.73376 0.50798 0.29351 0.32737 0.44026 0.77892 0.14675 0.44025 0.14675 0.98211 0 0.67731-0.21448 1.3546-0.21449 0.67732-0.63217 1.2192-0.41767 0.54185-1.0498 0.8918-0.62087 0.33866-1.4449 0.33866zm0.83536-4.8315q-0.37253 0-0.65474 0.21449-0.28222 0.21448-0.47412 0.54185-0.19191 0.32737-0.29351 0.72247-0.0903 0.38381-0.0903 0.73376 0 0.57572 0.18061 0.8918 0.18062 0.30479 0.65474 0.30479 0.37253 0 0.65474-0.21448 0.28222-0.21448 0.47412-0.54185 0.19191-0.32737 0.28222-0.71119 0.1016-0.3951 0.1016-0.74504 0-0.57572-0.18062-0.88052-0.18062-0.31608-0.65474-0.31608z"/>
<path d="m125.74 125.87h-1.6707l1.4111-5.9378h1.682zm0.81278-6.6603q-0.34995 0-0.63216-0.2032-0.28222-0.21448-0.28222-0.64345 0-0.23706 0.0903-0.44025 0.1016-0.21449 0.25964-0.36124 0.15804-0.15804 0.36124-0.24835 0.21448-0.0903 0.45154-0.0903 0.34995 0 0.63216 0.21449 0.28222 0.20319 0.28222 0.63216 0 0.23706-0.1016 0.45154-0.0903 0.2032-0.24835 0.36124-0.15804 0.14675-0.37252 0.23706-0.2032 0.0903-0.44026 0.0903z"/>
<path d="m128.89 120.2q0.1919-0.0564 0.41767-0.12418 0.23707-0.079 0.51928-0.13546 0.2935-0.0677 0.64345-0.1016 0.36124-0.0451 0.81278-0.0451 1.3321 0 1.8288 0.76762 0.49669 0.76763 0.16932 2.0997l-0.76762 3.206h-1.682l0.74505-3.1382q0.0677-0.2935 0.10159-0.56443 0.0452-0.28221 0-0.48541-0.0451-0.21448-0.21448-0.33866-0.15804-0.13546-0.4967-0.13546-0.32737 0-0.66603 0.0677l-1.095 4.5945h-1.682z"/>
<path d="m135.8 118.45 1.7497-0.27093-0.42896 1.7497h1.8739l-0.33865 1.3772h-1.8626l-0.4967 2.0771q-0.0677 0.25964-0.0903 0.48541-0.0113 0.22577 0.0564 0.3951 0.079 0.15804 0.25964 0.24835 0.18062 0.0903 0.4967 0.0903 0.27092 0 0.51927-0.0451 0.25964-0.0564 0.51928-0.14675l0.12417 1.2869q-0.33865 0.12417-0.73376 0.21448-0.3951 0.0903-0.93695 0.0903-0.77891 0-1.2079-0.22577-0.42897-0.23706-0.60959-0.63216-0.18061-0.40639-0.15804-0.92567 0.0226-0.51928 0.15804-1.095z"/>
</g>
<g clip-path="url(#clipPath965)" fill="#fff" aria-label="PostalPoint">
<path d="m78.763 117.96q0.71118 0 1.2756 0.15804 0.57572 0.14675 0.97082 0.44026 0.3951 0.28221 0.60958 0.69989 0.21448 0.41768 0.21448 0.93696 0 0.84664-0.32737 1.4336-0.32737 0.58701-0.90309 0.94824-0.57572 0.36124-1.3546 0.51928t-1.6933 0.15804h-0.44026l-0.63216 2.619h-1.7497l1.84-7.7101q0.60958-0.11289 1.1514-0.15804 0.55314-0.0452 1.0386-0.0452zm-0.14675 1.4788q-0.19191 0-0.32737 0.0113-0.13546 0.0113-0.27093 0.0226l-0.54185 2.3029h0.44026q0.47412 0 0.85794-0.0677 0.3951-0.079 0.66603-0.24835 0.28222-0.16933 0.42897-0.42897 0.15804-0.27092 0.15804-0.65474 0-0.50798-0.37252-0.72247-0.36124-0.21448-1.0386-0.21448z"/>
<path d="m84.728 126.03q-0.5983 0-1.0386-0.18062-0.44026-0.18062-0.73376-0.50799-0.28222-0.32737-0.42897-0.76762-0.14675-0.45155-0.14675-0.9934 0-0.67732 0.21448-1.3546 0.22577-0.67732 0.65474-1.2192 0.42897-0.54186 1.0498-0.88052 0.62087-0.34994 1.4224-0.34994 0.58701 0 1.0273 0.18062 0.45154 0.18061 0.73376 0.50798 0.2935 0.32737 0.44026 0.77892 0.14675 0.44025 0.14675 0.98211 0 0.67731-0.21448 1.3546-0.21448 0.67732-0.63216 1.2192-0.41768 0.54185-1.0498 0.8918-0.62087 0.33866-1.4449 0.33866zm0.83536-4.8315q-0.37252 0-0.65474 0.21449-0.28222 0.21448-0.47412 0.54185-0.19191 0.32737-0.2935 0.72247-0.09031 0.38381-0.09031 0.73376 0 0.57572 0.18062 0.8918 0.18062 0.30479 0.65474 0.30479 0.37252 0 0.65474-0.21448t0.47412-0.54185q0.19191-0.32737 0.28222-0.71119 0.1016-0.3951 0.1016-0.74504 0-0.57572-0.18062-0.88052-0.18062-0.31608-0.65474-0.31608z"/>
<path d="m90.718 124.67q0.57572 0 0.7902-0.15804 0.21448-0.16933 0.21448-0.36123 0-0.12418-0.04515-0.21449-0.03387-0.0903-0.12417-0.16932-0.09031-0.079-0.24835-0.15805-0.15804-0.0903-0.40639-0.20319-0.28222-0.12417-0.53056-0.25964-0.24835-0.14675-0.44026-0.33866-0.18062-0.20319-0.2935-0.45154-0.1016-0.25964-0.1016-0.60959 0-0.91437 0.66603-1.4449 0.67732-0.53056 1.9642-0.53056 0.60958 0 1.0837 0.13546 0.47412 0.13546 0.76762 0.29351l-0.57572 1.253q-0.23706-0.12417-0.60958-0.23706t-0.73376-0.11289q-0.15804 0-0.31608 0.0226-0.14675 0.0113-0.28222 0.0677-0.12418 0.0564-0.2032 0.15804-0.07902 0.1016-0.07902 0.27093 0 0.22577 0.16933 0.33866 0.18062 0.11288 0.4967 0.27092 0.44026 0.21449 0.73376 0.39511 0.2935 0.18061 0.46283 0.38381 0.18062 0.20319 0.25964 0.46283 0.07902 0.25964 0.07902 0.60959 0 0.36123-0.15804 0.71118-0.14675 0.34995-0.47412 0.62087-0.32737 0.27093-0.83536 0.44026-0.50799 0.16933-1.2192 0.16933-0.44026 0-0.80149-0.0564-0.34995-0.0564-0.62087-0.13546-0.27093-0.0903-0.46283-0.18062-0.18062-0.0903-0.28222-0.14675l0.57572-1.2869q0.19191 0.11289 0.5983 0.28221 0.40639 0.16933 0.98211 0.16933z"/>
<path d="m96.112 118.45 1.7497-0.27093-0.42897 1.7497h1.8739l-0.33866 1.3772h-1.8626l-0.4967 2.0771q-0.06773 0.25964-0.09031 0.48541-0.01129 0.22577 0.05644 0.3951 0.07902 0.15804 0.25964 0.24835 0.18062 0.0903 0.4967 0.0903 0.27093 0 0.51928-0.0451 0.25964-0.0564 0.51928-0.14675l0.12418 1.2869q-0.33866 0.12417-0.73376 0.21448-0.3951 0.0903-0.93696 0.0903-0.77891 0-1.2079-0.22577-0.42897-0.23706-0.60958-0.63216-0.18062-0.40639-0.15804-0.92567 0.02258-0.51928 0.15804-1.095z"/>
<path d="m104.8 123.31q-0.15804 0.64345-0.0903 1.2982 0.0677 0.64345 0.25963 1.1514l-1.5014 0.21448q-0.0677-0.13546-0.12418-0.25963-0.0564-0.12418-0.11288-0.28222-0.31608 0.25964-0.6999 0.42897-0.38381 0.16933-0.85793 0.16933-0.56443 0-0.97082-0.19191-0.3951-0.20319-0.65474-0.53056-0.24835-0.33866-0.36124-0.77892-0.11288-0.45154-0.11288-0.95953 0-0.77891 0.27092-1.4675 0.28222-0.6886 0.76763-1.1966 0.4967-0.51928 1.1627-0.81278t1.4449-0.2935q0.1016 0 0.34995 0.0113 0.25963 0.0113 0.587 0.0564 0.32737 0.0339 0.68861 0.12417 0.36123 0.0903 0.6886 0.24835zm-1.174-2.0771q-0.14675-0.0226-0.27093-0.0339-0.11288-0.0113-0.28221-0.0113-0.38382 0-0.72247 0.19191-0.32737 0.19191-0.57572 0.50799-0.24835 0.30479-0.3951 0.71118-0.13547 0.40639-0.13547 0.84665 0 0.54185 0.18062 0.85793t0.66603 0.31608q0.25964 0 0.46283-0.1016 0.21448-0.10159 0.45155-0.33865 0.0226-0.28222 0.0677-0.58701 0.0564-0.31608 0.11288-0.57572z"/>
<path d="m108.6 125.98q-0.80149 0-1.2643-0.20319-0.45155-0.21449-0.65474-0.57572-0.19191-0.36124-0.19191-0.82407 0.0113-0.47412 0.13546-1.0047l1.4337-5.9942 1.7497-0.27092-1.5691 6.5022q-0.0451 0.2032-0.0564 0.37253 0 0.16933 0.0677 0.30479 0.0677 0.12418 0.22578 0.2032 0.16932 0.079 0.46283 0.10159z"/>
<path d="m114.04 117.96q0.71119 0 1.2756 0.15804 0.57571 0.14675 0.97082 0.44026 0.3951 0.28221 0.60958 0.69989t0.21448 0.93696q0 0.84664-0.32737 1.4336-0.32736 0.58701-0.90308 0.94824-0.57572 0.36124-1.3546 0.51928-0.77891 0.15804-1.6933 0.15804h-0.44025l-0.63217 2.619h-1.7497l1.84-7.7101q0.60959-0.11289 1.1514-0.15804 0.55314-0.0452 1.0386-0.0452zm-0.14675 1.4788q-0.1919 0-0.32737 0.0113-0.13546 0.0113-0.27092 0.0226l-0.54186 2.3029h0.44026q0.47412 0 0.85793-0.0677 0.3951-0.079 0.66603-0.24835 0.28221-0.16933 0.42897-0.42897 0.15804-0.27092 0.15804-0.65474 0-0.50798-0.37253-0.72247-0.36123-0.21448-1.0386-0.21448z"/>
<path d="m120 126.03q-0.59829 0-1.0386-0.18062t-0.73376-0.50799q-0.28221-0.32737-0.42897-0.76762-0.14675-0.45155-0.14675-0.9934 0-0.67732 0.21448-1.3546 0.22578-0.67732 0.65474-1.2192 0.42897-0.54186 1.0498-0.88052 0.62088-0.34994 1.4224-0.34994 0.58701 0 1.0273 0.18062 0.45155 0.18061 0.73376 0.50798 0.29351 0.32737 0.44026 0.77892 0.14675 0.44025 0.14675 0.98211 0 0.67731-0.21448 1.3546-0.21449 0.67732-0.63217 1.2192-0.41767 0.54185-1.0498 0.8918-0.62087 0.33866-1.4449 0.33866zm0.83536-4.8315q-0.37253 0-0.65474 0.21449-0.28222 0.21448-0.47412 0.54185-0.19191 0.32737-0.29351 0.72247-0.0903 0.38381-0.0903 0.73376 0 0.57572 0.18061 0.8918 0.18062 0.30479 0.65474 0.30479 0.37253 0 0.65474-0.21448 0.28222-0.21448 0.47412-0.54185 0.19191-0.32737 0.28222-0.71119 0.1016-0.3951 0.1016-0.74504 0-0.57572-0.18062-0.88052-0.18062-0.31608-0.65474-0.31608z"/>
<path d="m125.74 125.87h-1.6707l1.4111-5.9378h1.682zm0.81278-6.6603q-0.34995 0-0.63216-0.2032-0.28222-0.21448-0.28222-0.64345 0-0.23706 0.0903-0.44025 0.1016-0.21449 0.25964-0.36124 0.15804-0.15804 0.36124-0.24835 0.21448-0.0903 0.45154-0.0903 0.34995 0 0.63216 0.21449 0.28222 0.20319 0.28222 0.63216 0 0.23706-0.1016 0.45154-0.0903 0.2032-0.24835 0.36124-0.15804 0.14675-0.37252 0.23706-0.2032 0.0903-0.44026 0.0903z"/>
<path d="m128.89 120.2q0.1919-0.0564 0.41767-0.12418 0.23707-0.079 0.51928-0.13546 0.2935-0.0677 0.64345-0.1016 0.36124-0.0451 0.81278-0.0451 1.3321 0 1.8288 0.76762 0.49669 0.76763 0.16932 2.0997l-0.76762 3.206h-1.682l0.74505-3.1382q0.0677-0.2935 0.10159-0.56443 0.0452-0.28221 0-0.48541-0.0451-0.21448-0.21448-0.33866-0.15804-0.13546-0.4967-0.13546-0.32737 0-0.66603 0.0677l-1.095 4.5945h-1.682z"/>
<path d="m135.8 118.45 1.7497-0.27093-0.42896 1.7497h1.8739l-0.33865 1.3772h-1.8626l-0.4967 2.0771q-0.0677 0.25964-0.0903 0.48541-0.0113 0.22577 0.0564 0.3951 0.079 0.15804 0.25964 0.24835 0.18062 0.0903 0.4967 0.0903 0.27092 0 0.51927-0.0451 0.25964-0.0564 0.51928-0.14675l0.12417 1.2869q-0.33865 0.12417-0.73376 0.21448-0.3951 0.0903-0.93695 0.0903-0.77891 0-1.2079-0.22577-0.42897-0.23706-0.60959-0.63216-0.18061-0.40639-0.15804-0.92567 0.0226-0.51928 0.15804-1.095z"/>
</g>
</g>
<g transform="translate(1.3993 2.6002)">
<path d="m61.891 114.86 1.25 0.53541v1.5177l-1.25-0.53541z" fill="#00b0ff" style="paint-order:normal"/>
<path d="m64.391 114.86-1.25 0.53541v1.5177l1.25-0.53541z" fill="#00b0ff" style="paint-order:normal"/>
<path d="m64.391 114.86-1.25 0.53541-1.25-0.53541 1.25-0.53541z" fill="#fff" style="paint-order:normal"/>
<path d="m63.141 116.92 1.25 0.53541v1.5177l-1.25-0.53542z" fill="#00b0ff" style="paint-order:normal"/>
<path d="m65.641 116.92-1.25 0.53541v1.5177l1.25-0.53542z" fill="#bdbdbd" style="paint-order:normal"/>
<path d="m65.641 116.92-1.25 0.53541-1.25-0.53541 1.25-0.53541z" fill="#006e9f" style="paint-order:normal"/>
<path d="m60.641 116.92 1.25 0.53541v1.5177l-1.25-0.53541z" fill="#eee" style="paint-order:normal"/>
<path d="m63.141 116.92-1.25 0.53541v1.5177l1.25-0.53541z" fill="#00b0ff" style="paint-order:normal"/>
<path d="m63.141 116.92-1.25 0.53541-1.25-0.53541 1.25-0.53541z" fill="#006e9f" style="paint-order:normal"/>
<path d="m60.641 115.4 1.25 0.53541v1.5177l-1.25-0.53541z" fill="#eee" style="paint-order:normal"/>
<path d="m63.141 115.4-1.25 0.53541v1.5177l1.25-0.53541z" fill="#bdbdbd" style="paint-order:normal"/>
<path d="m63.141 115.4-1.25 0.53541-1.25-0.53541 1.25-0.53541z" fill="#fff" style="paint-order:normal"/>
<path d="m63.141 115.4 1.25 0.53541v1.5177l-1.25-0.53541z" fill="#eee" style="paint-order:normal"/>
<path d="m65.641 115.4-1.25 0.53541v1.5177l1.25-0.53541z" fill="#bdbdbd" style="paint-order:normal"/>
<path d="m65.641 115.4-1.25 0.53541-1.25-0.53541 1.25-0.53541z" fill="#fff" style="paint-order:normal"/>
<path d="m60.641 123.61 2.5 1.0708v3.0354l-2.5-1.0708z" fill="#40c4ff" style="paint-order:normal"/>
<path d="m65.641 123.61-2.5 1.0708v3.0354l2.5-1.0708z" fill="#0091ea" style="paint-order:normal"/>
<path d="m65.641 123.61-2.5 1.0708-2.5-1.0708 2.5-1.0708z" fill="#03a9f4" style="paint-order:normal"/>
<path d="m58.141 111.29 2.5 1.0708v3.0354l-2.5-1.0708z" fill="#40c4ff" style="paint-order:normal"/>
<path d="m63.141 111.29-2.5 1.0708v3.0354l2.5-1.0708z" fill="#0091ea" style="paint-order:normal"/>
<path d="m63.141 111.29-2.5 1.0708-2.5-1.0708 2.5-1.0708z" fill="#03a9f4" style="paint-order:normal"/>
<path d="m63.141 119.51 2.5 1.0708v3.0354l-2.5-1.0708z" fill="#40c4ff" style="paint-order:normal"/>
<path d="m68.141 119.51-2.5 1.0708v3.0354l2.5-1.0708z" fill="#0091ea" style="paint-order:normal"/>
<path d="m68.141 119.51-2.5 1.0708-2.5-1.0708 2.5-1.0708z" fill="#03a9f4" style="paint-order:normal"/>
<path d="m58.141 119.51 2.5 1.0708v3.0354l-2.5-1.0708z" fill="#40c4ff" style="paint-order:normal"/>
<path d="m63.141 119.51-2.5 1.0708v3.0354l2.5-1.0708z" fill="#0091ea" style="paint-order:normal"/>
<path d="m63.141 119.51-2.5 1.0708-2.5-1.0708 2.5-1.0708z" fill="#03a9f4" style="paint-order:normal"/>
<path d="m65.641 115.4 2.5 1.0708v3.0354l-2.5-1.0708z" fill="#40c4ff" style="paint-order:normal"/>
<path d="m70.641 115.4-2.5 1.0708v3.0354l2.5-1.0708z" fill="#0091ea" style="paint-order:normal"/>
<path d="m70.641 115.4-2.5 1.0708-2.5-1.0708 2.5-1.0708z" fill="#03a9f4" style="paint-order:normal"/>
<path d="m55.641 115.4 2.5 1.0708v3.0354l-2.5-1.0708z" fill="#40c4ff" style="paint-order:normal"/>
<path d="m60.641 115.4-2.5 1.0708v3.0354l2.5-1.0708z" fill="#0091ea" style="paint-order:normal"/>
<path d="m60.641 115.4-2.5 1.0708-2.5-1.0708 2.5-1.0708z" fill="#03a9f4" style="paint-order:normal"/>
<path d="m63.141 111.29 2.5 1.0708v3.0354l-2.5-1.0708z" fill="#40c4ff" style="paint-order:normal"/>
<path d="m68.141 111.29-2.5 1.0708v3.0354l2.5-1.0708z" fill="#0091ea" style="paint-order:normal"/>
<path d="m68.141 111.29-2.5 1.0708-2.5-1.0708 2.5-1.0708z" fill="#03a9f4" style="paint-order:normal"/>
<path d="m61.891 117.45 1.25 0.53541v1.5177l-1.25-0.53541z" fill="#eee" style="paint-order:normal"/>
<path d="m64.391 117.45-1.25 0.53541v1.5177l1.25-0.53541z" fill="#bdbdbd" style="paint-order:normal"/>
<path d="m64.391 117.45-1.25 0.53541-1.25-0.53541 1.25-0.53541z" fill="#fff" style="paint-order:normal"/>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 19 KiB

@ -0,0 +1,79 @@
<?xml version="1.0" encoding="UTF-8"?>
<svg width="82.453mm" height="18.496mm" version="1.1" viewBox="0 0 82.453 18.496" xmlns="http://www.w3.org/2000/svg" xmlns:cc="http://creativecommons.org/ns#" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#">
<defs>
<clipPath id="clipPath907">
<rect x="73.099" y="121.75" width="66.791" height=".70158" display="none" fill="#2196f3" style="paint-order:normal"/>
<path class="powerclip" d="m69.733 112.11h74.26v18.918h-74.26zm3.3652 9.6352v0.70159h66.791v-0.70159z" fill="#2196f3" style="paint-order:normal"/>
</clipPath>
</defs>
<metadata>
<rdf:RDF>
<cc:Work rdf:about="">
<dc:format>image/svg+xml</dc:format>
<dc:type rdf:resource="http://purl.org/dc/dcmitype/StillImage"/>
<dc:title/>
</cc:Work>
</rdf:RDF>
</metadata>
<g transform="translate(-49.238 -106.32)">
<g transform="translate(-27.882 -9.2062)" style="paint-order:normal">
<path d="m82.619 116.03-2.5001 1.0707v3.0355l-2.4996 1.0707v3.0355l2.4996 1.0713v3.035l2.5001 1.0713v3.035l2.5001 1.0713 2.5001-1.0713v-3.035l2.5001-1.0713v-3.035l2.4996-1.0713v-3.0355l-2.4996-1.0707v-3.0355l-2.5001-1.0707-2.5001 1.0707z" fill="#00b0ff" stroke="#fff" stroke-linecap="round" stroke-linejoin="round" style="paint-order:normal"/>
</g>
<g transform="translate(-7.3027 -5.9991)">
<g transform="translate(1.3993 2.6002)">
<path d="m61.891 114.86 1.25 0.53541v1.5177l-1.25-0.53541z" fill="#00b0ff" style="paint-order:normal"/>
<path d="m64.391 114.86-1.25 0.53541v1.5177l1.25-0.53541z" fill="#00b0ff" style="paint-order:normal"/>
<path d="m64.391 114.86-1.25 0.53541-1.25-0.53541 1.25-0.53541z" fill="#fff" style="paint-order:normal"/>
<path d="m63.141 116.92 1.25 0.53541v1.5177l-1.25-0.53542z" fill="#00b0ff" style="paint-order:normal"/>
<path d="m65.641 116.92-1.25 0.53541v1.5177l1.25-0.53542z" fill="#bdbdbd" style="paint-order:normal"/>
<path d="m65.641 116.92-1.25 0.53541-1.25-0.53541 1.25-0.53541z" fill="#006e9f" style="paint-order:normal"/>
<path d="m60.641 116.92 1.25 0.53541v1.5177l-1.25-0.53541z" fill="#eee" style="paint-order:normal"/>
<path d="m63.141 116.92-1.25 0.53541v1.5177l1.25-0.53541z" fill="#00b0ff" style="paint-order:normal"/>
<path d="m63.141 116.92-1.25 0.53541-1.25-0.53541 1.25-0.53541z" fill="#006e9f" style="paint-order:normal"/>
<path d="m60.641 115.4 1.25 0.53541v1.5177l-1.25-0.53541z" fill="#eee" style="paint-order:normal"/>
<path d="m63.141 115.4-1.25 0.53541v1.5177l1.25-0.53541z" fill="#bdbdbd" style="paint-order:normal"/>
<path d="m63.141 115.4-1.25 0.53541-1.25-0.53541 1.25-0.53541z" fill="#fff" style="paint-order:normal"/>
<path d="m63.141 115.4 1.25 0.53541v1.5177l-1.25-0.53541z" fill="#eee" style="paint-order:normal"/>
<path d="m65.641 115.4-1.25 0.53541v1.5177l1.25-0.53541z" fill="#bdbdbd" style="paint-order:normal"/>
<path d="m65.641 115.4-1.25 0.53541-1.25-0.53541 1.25-0.53541z" fill="#fff" style="paint-order:normal"/>
<path d="m60.641 123.61 2.5 1.0708v3.0354l-2.5-1.0708z" fill="#40c4ff" style="paint-order:normal"/>
<path d="m65.641 123.61-2.5 1.0708v3.0354l2.5-1.0708z" fill="#0091ea" style="paint-order:normal"/>
<path d="m65.641 123.61-2.5 1.0708-2.5-1.0708 2.5-1.0708z" fill="#03a9f4" style="paint-order:normal"/>
<path d="m58.141 111.29 2.5 1.0708v3.0354l-2.5-1.0708z" fill="#40c4ff" style="paint-order:normal"/>
<path d="m63.141 111.29-2.5 1.0708v3.0354l2.5-1.0708z" fill="#0091ea" style="paint-order:normal"/>
<path d="m63.141 111.29-2.5 1.0708-2.5-1.0708 2.5-1.0708z" fill="#03a9f4" style="paint-order:normal"/>
<path d="m63.141 119.51 2.5 1.0708v3.0354l-2.5-1.0708z" fill="#40c4ff" style="paint-order:normal"/>
<path d="m68.141 119.51-2.5 1.0708v3.0354l2.5-1.0708z" fill="#0091ea" style="paint-order:normal"/>
<path d="m68.141 119.51-2.5 1.0708-2.5-1.0708 2.5-1.0708z" fill="#03a9f4" style="paint-order:normal"/>
<path d="m58.141 119.51 2.5 1.0708v3.0354l-2.5-1.0708z" fill="#40c4ff" style="paint-order:normal"/>
<path d="m63.141 119.51-2.5 1.0708v3.0354l2.5-1.0708z" fill="#0091ea" style="paint-order:normal"/>
<path d="m63.141 119.51-2.5 1.0708-2.5-1.0708 2.5-1.0708z" fill="#03a9f4" style="paint-order:normal"/>
<path d="m65.641 115.4 2.5 1.0708v3.0354l-2.5-1.0708z" fill="#40c4ff" style="paint-order:normal"/>
<path d="m70.641 115.4-2.5 1.0708v3.0354l2.5-1.0708z" fill="#0091ea" style="paint-order:normal"/>
<path d="m70.641 115.4-2.5 1.0708-2.5-1.0708 2.5-1.0708z" fill="#03a9f4" style="paint-order:normal"/>
<path d="m55.641 115.4 2.5 1.0708v3.0354l-2.5-1.0708z" fill="#40c4ff" style="paint-order:normal"/>
<path d="m60.641 115.4-2.5 1.0708v3.0354l2.5-1.0708z" fill="#0091ea" style="paint-order:normal"/>
<path d="m60.641 115.4-2.5 1.0708-2.5-1.0708 2.5-1.0708z" fill="#03a9f4" style="paint-order:normal"/>
<path d="m63.141 111.29 2.5 1.0708v3.0354l-2.5-1.0708z" fill="#40c4ff" style="paint-order:normal"/>
<path d="m68.141 111.29-2.5 1.0708v3.0354l2.5-1.0708z" fill="#0091ea" style="paint-order:normal"/>
<path d="m68.141 111.29-2.5 1.0708-2.5-1.0708 2.5-1.0708z" fill="#03a9f4" style="paint-order:normal"/>
<path d="m61.891 117.45 1.25 0.53541v1.5177l-1.25-0.53541z" fill="#eee" style="paint-order:normal"/>
<path d="m64.391 117.45-1.25 0.53541v1.5177l1.25-0.53541z" fill="#bdbdbd" style="paint-order:normal"/>
<path d="m64.391 117.45-1.25 0.53541-1.25-0.53541 1.25-0.53541z" fill="#fff" style="paint-order:normal"/>
</g>
<g clip-path="url(#clipPath907)" fill="#fff" stroke-width=".26458px" aria-label="PostalPoint">
<path d="m78.763 117.96q0.71118 0 1.2756 0.15804 0.57572 0.14675 0.97082 0.44026 0.3951 0.28221 0.60958 0.69989 0.21448 0.41768 0.21448 0.93696 0 0.84664-0.32737 1.4336-0.32737 0.58701-0.90309 0.94824-0.57572 0.36124-1.3546 0.51928t-1.6933 0.15804h-0.44026l-0.63216 2.619h-1.7497l1.84-7.7101q0.60958-0.11289 1.1514-0.15804 0.55314-0.0452 1.0386-0.0452zm-0.14675 1.4788q-0.19191 0-0.32737 0.0113-0.13546 0.0113-0.27093 0.0226l-0.54185 2.3029h0.44026q0.47412 0 0.85794-0.0677 0.3951-0.079 0.66603-0.24835 0.28222-0.16933 0.42897-0.42897 0.15804-0.27092 0.15804-0.65474 0-0.50798-0.37252-0.72247-0.36124-0.21448-1.0386-0.21448z"/>
<path d="m84.728 126.03q-0.5983 0-1.0386-0.18062-0.44026-0.18062-0.73376-0.50799-0.28222-0.32737-0.42897-0.76762-0.14675-0.45155-0.14675-0.9934 0-0.67732 0.21448-1.3546 0.22577-0.67732 0.65474-1.2192 0.42897-0.54186 1.0498-0.88052 0.62087-0.34994 1.4224-0.34994 0.58701 0 1.0273 0.18062 0.45154 0.18061 0.73376 0.50798 0.2935 0.32737 0.44026 0.77892 0.14675 0.44025 0.14675 0.98211 0 0.67731-0.21448 1.3546-0.21448 0.67732-0.63216 1.2192-0.41768 0.54185-1.0498 0.8918-0.62087 0.33866-1.4449 0.33866zm0.83536-4.8315q-0.37252 0-0.65474 0.21449-0.28222 0.21448-0.47412 0.54185-0.19191 0.32737-0.2935 0.72247-0.09031 0.38381-0.09031 0.73376 0 0.57572 0.18062 0.8918 0.18062 0.30479 0.65474 0.30479 0.37252 0 0.65474-0.21448t0.47412-0.54185q0.19191-0.32737 0.28222-0.71119 0.1016-0.3951 0.1016-0.74504 0-0.57572-0.18062-0.88052-0.18062-0.31608-0.65474-0.31608z"/>
<path d="m90.718 124.67q0.57572 0 0.7902-0.15804 0.21448-0.16933 0.21448-0.36123 0-0.12418-0.04515-0.21449-0.03387-0.0903-0.12417-0.16932-0.09031-0.079-0.24835-0.15805-0.15804-0.0903-0.40639-0.20319-0.28222-0.12417-0.53056-0.25964-0.24835-0.14675-0.44026-0.33866-0.18062-0.20319-0.2935-0.45154-0.1016-0.25964-0.1016-0.60959 0-0.91437 0.66603-1.4449 0.67732-0.53056 1.9642-0.53056 0.60958 0 1.0837 0.13546 0.47412 0.13546 0.76762 0.29351l-0.57572 1.253q-0.23706-0.12417-0.60958-0.23706t-0.73376-0.11289q-0.15804 0-0.31608 0.0226-0.14675 0.0113-0.28222 0.0677-0.12418 0.0564-0.2032 0.15804-0.07902 0.1016-0.07902 0.27093 0 0.22577 0.16933 0.33866 0.18062 0.11288 0.4967 0.27092 0.44026 0.21449 0.73376 0.39511 0.2935 0.18061 0.46283 0.38381 0.18062 0.20319 0.25964 0.46283 0.07902 0.25964 0.07902 0.60959 0 0.36123-0.15804 0.71118-0.14675 0.34995-0.47412 0.62087-0.32737 0.27093-0.83536 0.44026-0.50799 0.16933-1.2192 0.16933-0.44026 0-0.80149-0.0564-0.34995-0.0564-0.62087-0.13546-0.27093-0.0903-0.46283-0.18062-0.18062-0.0903-0.28222-0.14675l0.57572-1.2869q0.19191 0.11289 0.5983 0.28221 0.40639 0.16933 0.98211 0.16933z"/>
<path d="m96.112 118.45 1.7497-0.27093-0.42897 1.7497h1.8739l-0.33866 1.3772h-1.8626l-0.4967 2.0771q-0.06773 0.25964-0.09031 0.48541-0.01129 0.22577 0.05644 0.3951 0.07902 0.15804 0.25964 0.24835 0.18062 0.0903 0.4967 0.0903 0.27093 0 0.51928-0.0451 0.25964-0.0564 0.51928-0.14675l0.12418 1.2869q-0.33866 0.12417-0.73376 0.21448-0.3951 0.0903-0.93696 0.0903-0.77891 0-1.2079-0.22577-0.42897-0.23706-0.60958-0.63216-0.18062-0.40639-0.15804-0.92567 0.02258-0.51928 0.15804-1.095z"/>
<path d="m104.8 123.31q-0.15804 0.64345-0.0903 1.2982 0.0677 0.64345 0.25963 1.1514l-1.5014 0.21448q-0.0677-0.13546-0.12418-0.25963-0.0564-0.12418-0.11288-0.28222-0.31608 0.25964-0.6999 0.42897-0.38381 0.16933-0.85793 0.16933-0.56443 0-0.97082-0.19191-0.3951-0.20319-0.65474-0.53056-0.24835-0.33866-0.36124-0.77892-0.11288-0.45154-0.11288-0.95953 0-0.77891 0.27092-1.4675 0.28222-0.6886 0.76763-1.1966 0.4967-0.51928 1.1627-0.81278t1.4449-0.2935q0.1016 0 0.34995 0.0113 0.25963 0.0113 0.587 0.0564 0.32737 0.0339 0.68861 0.12417 0.36123 0.0903 0.6886 0.24835zm-1.174-2.0771q-0.14675-0.0226-0.27093-0.0339-0.11288-0.0113-0.28221-0.0113-0.38382 0-0.72247 0.19191-0.32737 0.19191-0.57572 0.50799-0.24835 0.30479-0.3951 0.71118-0.13547 0.40639-0.13547 0.84665 0 0.54185 0.18062 0.85793t0.66603 0.31608q0.25964 0 0.46283-0.1016 0.21448-0.10159 0.45155-0.33865 0.0226-0.28222 0.0677-0.58701 0.0564-0.31608 0.11288-0.57572z"/>
<path d="m108.6 125.98q-0.80149 0-1.2643-0.20319-0.45155-0.21449-0.65474-0.57572-0.19191-0.36124-0.19191-0.82407 0.0113-0.47412 0.13546-1.0047l1.4337-5.9942 1.7497-0.27092-1.5691 6.5022q-0.0451 0.2032-0.0564 0.37253 0 0.16933 0.0677 0.30479 0.0677 0.12418 0.22578 0.2032 0.16932 0.079 0.46283 0.10159z"/>
<path d="m114.04 117.96q0.71119 0 1.2756 0.15804 0.57571 0.14675 0.97082 0.44026 0.3951 0.28221 0.60958 0.69989t0.21448 0.93696q0 0.84664-0.32737 1.4336-0.32736 0.58701-0.90308 0.94824-0.57572 0.36124-1.3546 0.51928-0.77891 0.15804-1.6933 0.15804h-0.44025l-0.63217 2.619h-1.7497l1.84-7.7101q0.60959-0.11289 1.1514-0.15804 0.55314-0.0452 1.0386-0.0452zm-0.14675 1.4788q-0.1919 0-0.32737 0.0113-0.13546 0.0113-0.27092 0.0226l-0.54186 2.3029h0.44026q0.47412 0 0.85793-0.0677 0.3951-0.079 0.66603-0.24835 0.28221-0.16933 0.42897-0.42897 0.15804-0.27092 0.15804-0.65474 0-0.50798-0.37253-0.72247-0.36123-0.21448-1.0386-0.21448z"/>
<path d="m120 126.03q-0.59829 0-1.0386-0.18062t-0.73376-0.50799q-0.28221-0.32737-0.42897-0.76762-0.14675-0.45155-0.14675-0.9934 0-0.67732 0.21448-1.3546 0.22578-0.67732 0.65474-1.2192 0.42897-0.54186 1.0498-0.88052 0.62088-0.34994 1.4224-0.34994 0.58701 0 1.0273 0.18062 0.45155 0.18061 0.73376 0.50798 0.29351 0.32737 0.44026 0.77892 0.14675 0.44025 0.14675 0.98211 0 0.67731-0.21448 1.3546-0.21449 0.67732-0.63217 1.2192-0.41767 0.54185-1.0498 0.8918-0.62087 0.33866-1.4449 0.33866zm0.83536-4.8315q-0.37253 0-0.65474 0.21449-0.28222 0.21448-0.47412 0.54185-0.19191 0.32737-0.29351 0.72247-0.0903 0.38381-0.0903 0.73376 0 0.57572 0.18061 0.8918 0.18062 0.30479 0.65474 0.30479 0.37253 0 0.65474-0.21448 0.28222-0.21448 0.47412-0.54185 0.19191-0.32737 0.28222-0.71119 0.1016-0.3951 0.1016-0.74504 0-0.57572-0.18062-0.88052-0.18062-0.31608-0.65474-0.31608z"/>
<path d="m125.74 125.87h-1.6707l1.4111-5.9378h1.682zm0.81278-6.6603q-0.34995 0-0.63216-0.2032-0.28222-0.21448-0.28222-0.64345 0-0.23706 0.0903-0.44025 0.1016-0.21449 0.25964-0.36124 0.15804-0.15804 0.36124-0.24835 0.21448-0.0903 0.45154-0.0903 0.34995 0 0.63216 0.21449 0.28222 0.20319 0.28222 0.63216 0 0.23706-0.1016 0.45154-0.0903 0.2032-0.24835 0.36124-0.15804 0.14675-0.37252 0.23706-0.2032 0.0903-0.44026 0.0903z"/>
<path d="m128.89 120.2q0.1919-0.0564 0.41767-0.12418 0.23707-0.079 0.51928-0.13546 0.2935-0.0677 0.64345-0.1016 0.36124-0.0451 0.81278-0.0451 1.3321 0 1.8288 0.76762 0.49669 0.76763 0.16932 2.0997l-0.76762 3.206h-1.682l0.74505-3.1382q0.0677-0.2935 0.10159-0.56443 0.0452-0.28221 0-0.48541-0.0451-0.21448-0.21448-0.33866-0.15804-0.13546-0.4967-0.13546-0.32737 0-0.66603 0.0677l-1.095 4.5945h-1.682z"/>
<path d="m135.8 118.45 1.7497-0.27093-0.42896 1.7497h1.8739l-0.33865 1.3772h-1.8626l-0.4967 2.0771q-0.0677 0.25964-0.0903 0.48541-0.0113 0.22577 0.0564 0.3951 0.079 0.15804 0.25964 0.24835 0.18062 0.0903 0.4967 0.0903 0.27092 0 0.51927-0.0451 0.25964-0.0564 0.51928-0.14675l0.12417 1.2869q-0.33865 0.12417-0.73376 0.21448-0.3951 0.0903-0.93695 0.0903-0.77891 0-1.2079-0.22577-0.42897-0.23706-0.60959-0.63216-0.18061-0.40639-0.15804-0.92567 0.0226-0.51928 0.15804-1.095z"/>
</g>
</g>
</g>
</svg>

After

Width:  |  Height:  |  Size: 12 KiB

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

@ -1,523 +0,0 @@
/*
* 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 walletPubKeyRegex = /^(bc1|[13]|D)[a-zA-HJ-NP-Z0-9]{25,}$/;
var paymentRequestRegex = /^(?:bitcoin|dogecoin):([a-zA-Z0-9]{20,40})(?:\?(.*))?$/;
var walletPrivateKeyRegex = /^[0-9A-Za-z]+$/;
/**
* Parse a crypto URI and extract the info in it.
* Copyright (c) 2019 Robin Linus, MIT license, https://github.com/coins/bitcoin-uri-js
* @param {type} uri
* @returns {parsePaymentURI.parsed}
*/
function parsePaymentURI(uri) {
const legalKeys = ['address', 'amount', 'value', 'message', 'send', 'tx'];
const match = paymentRequestRegex.exec(uri);
if (!match) {
return null;
}
const parsed = {uri: uri}
if (match[2]) {
const queries = match[2].split('&');
for (let i = 0; i < queries.length; i++) {
const query = queries[i].split('=');
const key = query[0];
if (query.length === 2 && legalKeys.includes(key)) {
parsed[key] = decodeURIComponent(query[1].replace(/\+/g, '%20'));
}
}
}
parsed.address = match[1];
return parsed;
}
function openWalletPage(walletaddress) {
var navuri = '/crypto/' + walletaddress;
if (typeof router.currentRoute.query.paymenturi != 'undefined') {
var parsed = parsePaymentURI(router.currentRoute.query.paymenturi);
if (parsed != null) {
navuri += '/' + parsed.address;
if (typeof parsed['amount'] != 'undefined') {
navuri += '/' + parsed.amount;
}
}
}
router.navigate(navuri);
}
function scanWalletQrCode(callback) {
scanBarcode(function (result) {
if (walletPubKeyRegex.test(result)) {
callback(result);
} else {
app.dialog.alert("That doesn't look like a valid wallet address.", "Error");
return;
}
}, function () {
app.dialog.alert("Something went wrong and we can't scan right now.", "Error");
});
}
function scanPrivateKeyQrCode(callback) {
scanBarcode(function (result) {
if (walletPrivateKeyRegex.test(result)) {
callback(result);
} else {
app.dialog.alert("That doesn't look like a valid wallet address.", "Error");
return;
}
}, function () {
app.dialog.alert("Something went wrong and we can't scan right now.", "Error");
});
}
/**
* Create and sign a crypto transaction.
*
* @param {type} bitcoreLib Bitcore, Litecore, Dogecore, etc.
* @param {type} privateKeyString Private key from wallet QR code
* @param {type} sourceAddress Sender's wallet address
* @param {type} destinationAddress Recipient's wallet address
* @param {Array} utxos Unspent transaction inputs, as array. See createUtxo()
* @param {type} outputSatoshis Amount to send to recipient's wallet
* @returns {string} Hex of serialized transaction, suitable for broadcast via Bitcoin Core or an API.
*/
function createSignedTransaction(bitcoreLib, privateKeyString, sourceAddress, destinationAddress, utxos, outputSatoshis, feePerByte) {
if (typeof feePerByte == "undefined") {
feePerByte = -1;
}
try {
var privateKey = new bitcoreLib.PrivateKey(privateKeyString);
var transaction = new bitcoreLib.Transaction()
.from(utxos)
.to(destinationAddress, outputSatoshis)
.change(sourceAddress);
var size = transaction._estimateSize();
var fee = size * feePerByte;
if (feePerByte > -1) {
// use our fee
transaction = transaction.fee(fee);
} else {
// use lib's fee
fee = transaction.getFee();
}
transaction = transaction.sign(privateKey);
var inputTotal = transaction._getInputAmount();
var outputTotal = fee + outputSatoshis;
} catch (ex) {
throw new Error("There was an internal error while creating the transaction. Details: " + ex.message);
}
console.log(inputTotal, outputTotal);
if (outputTotal > inputTotal) {
throw new Error("You have insufficient funds to cover the payment and transaction fees.");
}
try {
return {serialized: transaction.serialize(), fee: fee, sendamount: outputSatoshis, totalspent: outputTotal};
} catch (ex) {
throw new Error("Couldn't create the transaction. It's likely you typed something wrong. Check that you have enough funds.");
}
}
/**
* Create a UTXO.
*
* @param {type} sourceAddress Sender's wallet address
* @param {type} txHash From UTXO (unspent output)
* @param {type} txOutputIndex From UTXO (unspent output)
* @param {type} script From UTXO (unspent output)
* @param {type} inputSatoshis From UTXO (unspent output)
* @returns {createUtxo.utxo}
*/
function createUtxo(sourceAddress, txHash, txOutputIndex, script, inputSatoshis) {
var utxo = {
"txId": txHash,
"outputIndex": txOutputIndex,
"address": sourceAddress,
"script": script,
"satoshis": inputSatoshis
};
return utxo;
}
/**
* Get unspent outputs for a wallet address.
* @param {string} walletaddress
* @param {function} successCallback Passes object with {utxos: [{txHash,txOutputIndex,script,value}], currency: "DOGE", label: "Dogecoin"}
* @param {function} errorCallback Passes string error message suitable for display
* @returns {undefined}
*/
function getUTXOData(walletaddress, successCallback, errorCallback) {
apirequest(SETTINGS.apis.getutxo, {
walletaddress: walletaddress
}, function (resp) {
if (resp.status == "OK") {
successCallback({
utxos: resp.unspent_outputs,
currency: resp.currency,
label: resp.label
});
} else {
errorCallback(resp.msg);
}
}, function (errorData) {
try {
var error = $.parseJSON(errorData.responseText);
if (error && typeof error.msg != 'undefined') {
errorCallback(resp.msg);
sendErrorReport("Crypto", "Couldn't get UTXO data", error.msg);
} else {
errorCallback("There's a server or network problem. Check your Internet connection or try again later. Your funds are safe.");
sendErrorReport("Crypto", "Couldn't get UTXO data", "Server/network problem: " + errorData.status + ": " + errorData.statusText);
}
} catch (ex) {
errorCallback("There's a server or network problem. Check your Internet connection or try again later. Your funds are safe.");
sendErrorReport("Crypto", "Couldn't get UTXO data", "Server/network problem: " + errorData.status + ": " + errorData.statusText);
}
});
}
function sendCoins(privatekey, fromaddress, toaddress, amount) {
var progressdialog = app.dialog.progress("Querying blockchain...", 20);
getUTXOData(fromaddress, function (success) {
progressdialog.setProgress(40);
progressdialog.setText("Creating transaction...");
if (success.utxos.length == 0) {
app.dialog.close();
app.dialog.alert("Your wallet has no available funds (ZERO_LENGTH_UTXO).", "Error");
return;
}
var utxos = [];
for (var i = 0; i < success.utxos.length; i++) {
utxos.push(createUtxo(fromaddress, success.utxos[i].txHash, success.utxos[i].txOutputIndex, success.utxos[i].script, success.utxos[i].value));
}
var bitcore = null;
var satoshis = parseInt((amount * 100000000).toFixed(0)); // Make sure it's an int and not something like 10.0000000001 or 9.532999999999
switch (success.currency) {
case "DOGE":
bitcore = require("bitcore-lib-doge");
break;
case "BTC":
bitcore = require("bitcore-lib");
break;
default:
app.dialog.close();
app.dialog.alert("This app version doesn't support " + success.currency + ".", "Error");
return;
}
progressdialog.setProgress(60);
progressdialog.setText("Calculating fees...");
apirequest(SETTINGS.apis.cryptofees, {
currency: success.currency
}, function (resp) {
if (resp.status == "OK") {
try {
var txdata = createSignedTransaction(bitcore, privatekey, fromaddress, toaddress, utxos, satoshis, resp.feePerByte);
} catch (ex) {
console.error(ex);
app.dialog.close();
app.dialog.alert(ex.message, "Error");
return;
}
progressdialog.close();
app.dialog.confirm("Sending " + (txdata.sendamount / 100000000) + " " + success.currency
+ " with a fee of " + (txdata.fee / 100000000) + " " + success.currency
+ " for a total spend of " + (txdata.totalspent / 100000000) + " " + success.currency + ".",
"Confirm Transaction",
function (ok) {
progressdialog = app.dialog.progress("Sending payment...", 80);
apirequest(SETTINGS.apis.broadcasttransaction, {
transactiondata: txdata.serialized,
currency: success.currency
}, function (resp) {
if (resp.status == "OK") {
app.dialog.close();
app.dialog.alert("Sent " + amount + " " + success.currency + " to " + toaddress.substring(0, 5) + "..." + toaddress.substring(toaddress.length - 5, 999), "Success!");
$('#walletPrivateKey').val(""); // clear private key input box
app.popup.close();
return;
} else {
app.dialog.close();
app.dialog.alert(resp.msg, "Error");
}
}, function (errorData) {
app.dialog.close();
try {
var error = $.parseJSON(errorData.responseText);
if (error && typeof error.msg != 'undefined') {
app.dialog.alert(error.msg, "Error");
sendErrorReport("Crypto", "Couldn't broadcast transaction", error.msg);
} else {
app.dialog.alert("There's a server or network problem. Check your Internet connection or try again later. Your funds are safe.", "Error");
sendErrorReport("Crypto", "Couldn't broadcast transaction", "Server/network problem: " + errorData.status + ": " + errorData.statusText);
}
} catch (ex) {
app.dialog.alert("There's a server or network problem. Check your Internet connection or try again later. Your funds are safe.", "Error");
sendErrorReport("Crypto", "Couldn't broadcast transaction", "Server/network problem: " + errorData.status + ": " + errorData.statusText);
}
});
});
} else {
app.dialog.close();
app.dialog.alert(resp.msg, "Error");
}
}, function (errorData) {
app.dialog.close();
try {
var error = $.parseJSON(errorData.responseText);
if (error && typeof error.msg != 'undefined') {
app.dialog.alert(error.msg, "Error");
sendErrorReport("Crypto", "Couldn't get transaction fees", error.msg);
} else {
app.dialog.alert("There's a server or network problem. Check your Internet connection or try again later. Your funds are safe.", "Error");
sendErrorReport("Crypto", "Couldn't get transaction fees", "Server/network problem: " + errorData.status + ": " + errorData.statusText);
}
} catch (ex) {
app.dialog.alert("There's a server or network problem. Check your Internet connection or try again later. Your funds are safe.", "Error");
sendErrorReport("Crypto", "Couldn't get transaction fees", "Server/network problem: " + errorData.status + ": " + errorData.statusText);
}
});
}, function (error) {
app.dialog.close();
app.dialog.alert(error, "Error");
});
}
function walletGUISendCoins() {
if (!walletPubKeyRegex.test($('#walletAddress').text())) {
app.dialog.alert("Your wallet address doesn't look right. Check it and try again.", "Error");
return;
}
if (isNaN($('#transactionAmount').val()) || $('#transactionAmount').val() < 0.00000001) {
app.dialog.alert("The amount to send doesn't look right. Check it and try again.", "Error");
return;
}
// Remove payment request URL stuff
if ($('#walletToAddress').val().startsWith("bitcoin:")) {
$('#walletToAddress').val($('#walletToAddress').val().replace("bitcoin:", ""));
}
if ($('#walletToAddress').val().startsWith("dogecoin:")) {
$('#walletToAddress').val($('#walletToAddress').val().replace("dogecoin:", ""));
}
if (!walletPubKeyRegex.test($('#walletToAddress').val())) {
app.dialog.alert("The recipient's wallet address doesn't look right. Check it and try again.", "Error");
return;
}
sendCoins($('#walletPrivateKey').val(), $('#walletAddress').text(), $('#walletToAddress').val(), parseFloat($('#transactionAmount').val()));
}
function openWalletBalancePage( {to, resolve, reject}) {
var address = to.params.walletaddress;
if (!walletPubKeyRegex.test(address)) {
app.dialog.alert("That doesn't look like a valid wallet address.", "Error");
reject();
return;
}
app.dialog.preloader("Loading...");
apirequest(SETTINGS.apis.walletbalance, {
walletaddress: address
}, function (resp) {
app.dialog.close();
if (resp.status == "OK") {
var context = {
balance: resp.balance,
currencyunit: resp.currency,
fiatvalue: resp.usdvalue,
currencyname: resp.label,
attribution: resp.attribution,
exchangerate: resp.exchangerates.usd,
logo: "./assets/images/crypto/" + resp.currency + ".svg",
walletaddress: to.params.walletaddress,
sendtoaddress: (typeof to.params.toaddress != "undefined" ? to.params.toaddress : ""),
sendtoamount: (typeof to.params.amount != "undefined" ? to.params.amount : "")
};
resolve({
content: compiledPages.crypto_wallet(context)
});
} else {
reject();
app.dialog.alert(resp.msg, "Error");
}
}, function (error) {
reject();
app.dialog.close();
try {
var error = $.parseJSON(error.responseText);
if (error && typeof error.msg != 'undefined') {
app.dialog.alert(error.msg, "Error");
sendErrorReport("Crypto", "Couldn't get wallet balance", error.msg);
} else {
app.dialog.alert("There's a server or network problem. Check your Internet connection or try again later. Your funds are safe.", "Error");
sendErrorReport("Crypto", "Couldn't get wallet balance", "Server/network problem: " + error.status + ": " + error.statusText);
}
} catch (ex) {
app.dialog.alert("There's a server or network problem. Check your Internet connection or try again later. Your funds are safe.", "Error");
sendErrorReport("Crypto", "Couldn't get wallet balance", "Server/network problem: " + error.status + ": " + error.statusText);
}
});
}
/**
* Setup an input for specifying amount to send in USD, with conversion to crypto.
* @param {string} walletAddress Detects cryptocurrency from wallet address
* @returns {undefined}
*/
function setupFiatConversion(walletAddress) {
apirequest(SETTINGS.apis.walletbalance, {
walletaddress: walletAddress
}, function (resp) {
if (resp.status != "OK") {
return;
}
if (resp.exchangerates.usd == -1) {
return;
}
$("#cryptoFiatInputItem").css("display", "");
$("#cryptoAmountSendCurrencyLabel").text(resp.currency);
$("#cryptoAmountSendFiatLabel").text("$");
$("#transactionAmountFiat").data("exchange-rate", resp.exchangerates.usd);
$("#transactionAmountFiat").data("cryptocurrency", resp.currency);
$("#transactionAmount").off("input change paste keyup");
$("#transactionAmountFiat").off("input change paste keyup");
$("#transactionAmount").on("input change paste keyup", function () {
if ($("#cryptoFiatInputItem").css("display") == "none") {
return;
}
var amount = parseFloat($("#transactionAmount").val());
var exchangerate = parseFloat($("#transactionAmountFiat").data("exchange-rate"));
$("#transactionAmountFiat").val((amount * exchangerate).toFixed(2));
//$("#transactionAmount").val(amount.toFixed(8));
});
$("#transactionAmountFiat").on("input change paste keyup", function () {
if ($("#cryptoFiatInputItem").css("display") == "none") {
return;
}
var fiatamount = parseFloat($("#transactionAmountFiat").val());
var exchangerate = parseFloat($("#transactionAmountFiat").data("exchange-rate"));
$("#transactionAmount").val((fiatamount / exchangerate).toFixed(8));
});
if ($("#transactionAmount").val() != "") {
// Update the fiat conversion calculation if there's an amount prefilled
$("#transactionAmount").trigger("input");
}
});
}
function setupReceiveFiatConversion() {
var exchangerate = $("#receiveAmountFiat").data("exchangerate");
var fiatlabel = $("#receiveAmountFiat").data("currencylabel");
if (exchangerate == -1) {
return;
}
$("#cryptoAmountReceiveFiatLI").css("display", "");
$("#cryptoAmountReceiveFiatLabel").text(fiatlabel);
$("#receiveAmount").off("input change paste keyup");
$("#receiveAmountFiat").off("input change paste keyup");
$("#receiveAmount").on("input change paste keyup", function () {
if ($("#cryptoAmountReceiveFiatLI").css("display") == "none") {
return;
}
var amount = parseFloat($("#receiveAmount").val());
var exchangerate = parseFloat($("#receiveAmountFiat").data("exchangerate"));
$("#receiveAmountFiat").val((amount * exchangerate).toFixed(2));
});
$("#receiveAmountFiat").on("input change paste keyup", function () {
var fiatamount = parseFloat($("#receiveAmountFiat").val());
var exchangerate = parseFloat($("#receiveAmountFiat").data("exchangerate"));
$("#receiveAmount").val((fiatamount / exchangerate).toFixed(8));
});
if ($("#receiveAmount").val() != "") {
// Update the fiat conversion calculation if there's an amount prefilled
$("#receiveAmount").trigger("input");
}
}
/**
* Hides the fiat conversion input box.
* @returns {undefined}
*/
function unsetupFiatConversion() {
$("#cryptoFiatInputItem").css("display", "none");
$("#cryptoAmountSendCurrencyLabel").text("");
$("#transactionAmountFiat").removeData("exchange-rate");
$("#transactionAmountFiat").removeData("cryptocurrency");
$("#transactionAmount").off("input change paste keyup");
$("#transactionAmountFiat").off("input change paste keyup");
}
function showPaymentRequestQRCode() {
var paymenturi = "";
switch ($("#receiveAmount").data("currency")) {
case "DOGE":
paymenturi = "dogecoin:";
break;
case "BTC":
paymenturi = "bitcoin:";
break;
}
paymenturi += $('#walletAddress').text();
if ($("#receiveAmount").val() > 0) {
paymenturi += "?amount=" + $("#receiveAmount").val();
}
$("#paymentRequestQRCodeContainer").html("");
new QRCode(document.getElementById("paymentRequestQRCodeContainer"), paymenturi);
}
$("#app").on("click", "#sendCryptoOpenPopupBtn", function () {
if (platform_type == "cordova") {
if (cordova.platformId == "ios") {
app.dialog.create({
title: "Switch to Web Version",
text: "Apple doesn't allow this feature on the App Store. Tap Continue to launch the web version of this app instead, which is allowed to send crypto. We're sorry for the inconvenience.",
verticalButtons: true,
buttons: [
{
text: "Continue",
bold: true,
keyCodes: [13],
onClick: function () {
openExternalBrowser("https://app.helena.express/?startpage=crypto");
}
},
{
text: "Cancel",
color: "red"
}
]
}).open();
return;
}
}
app.popup.open("#sendCryptoPopup");
if (walletPubKeyRegex.test($("#walletAddress").text())) {
setupFiatConversion($("#walletAddress").text());
} else {
unsetupFiatConversion();
}
});

@ -78,7 +78,7 @@ $("body").on("popup:open", "#dasLocationMapPopup", function () {
dropboxMap.reloadMap();
dropboxMap.mapObj.on('load', function () {
dropboxMap.mapObj.jumpTo({center: [-112.005, 46.589], zoom: 8});
dropboxMap.loadIcon("./assets/images/dropbox-icon.png", "dropbox", function () {
dropboxMap.loadIcon("./assets/images/DAS_marker.png", "dropbox", function () {
apirequest(SETTINGS.apis.dropandsendlocations, {}, function (data) {
dropboxMap.loadMarkersFromGeoJson(data, "dropbox", "dropbox");
dropboxMap.mapObj.on('click', 'marker-layer-dropbox', function (e) {

@ -0,0 +1,128 @@
/*
* 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/.
*/
/**
* Open a location on the map.
* @param {type} e
* @returns {undefined}
*/
var openMapLocationInfo = function (e) {
var coordinates = e.geometry.coordinates.slice();
showLocationDetails(e);
locationMap.mapObj.resize();
locationMap.mapObj.easeTo({
center: [coordinates[0], coordinates[1]],
zoom: 15,
bearing: 0,
pitch: 0
});
};
var showLocationDetails = function (e) {
var coordinates = e.geometry.coordinates.slice();
var name = e.properties.name;
var info = e.properties.info;
var hours = e.properties.hours;
var geolink = "geo:" + (Math.round(coordinates[1] * 1000000) / 1000000) + "," + (Math.round(coordinates[0] * 1000000) / 1000000);
var typeinfo = "";
if (e.properties.branding == "DAS") {
typeinfo = "<b>Drop and Send&#8480; Drop Box</b><br />Use this app to send packages from this box, no postage necessary. Just put your package inside and scan the QR code with this app.";
} else if (e.properties.branding == "PP") {
typeinfo = "<b>PostalPoint&trade; Kiosk</b><br />Purchase postage, send USPS packages, and get free boxes here.";
}
$("#locationInfoName").text(name);
$("#locationInfoModalContainer").html(
"<div class='row'><div class='col-50'>"
+ "<a class=\"button button-small\" href=\"" + geolink + "\"><i class=\"fas fa-location-circle\"></i>&nbsp; Directions</a>"
+ "</div>"
+ "<div class='col-50'>"
+ (e.properties.branding == "DAS" ? "<a class=\"button button-small sheet-close\" href=\"\" onclick=\"router.navigate('/das');\"><i class=\"fas fa-info-circle\"></i>&nbsp; More Info</a>" : "")
+ (e.properties.branding == "PP" ? "<a class=\"button button-small sheet-close\" href=\"\" onclick=\"router.navigate('/kiosk');\"><i class=\"fas fa-info-circle\"></i>&nbsp; More info</a>" : "")
+ "</div></div>"
+ typeinfo + "<br />"
+ (hours == "" ? "" : "<b>Hours:</b> " + hours)
+ "<br /><b>Info:</b> " + info
);
app.sheet.open("#locationInfoModal");
};
function loadLocationMap() {
if (MapControl.supported()) {
if (locationMap == null) {
app.preloader.show();
var mapboxel = document.getElementById("mapbox-locations");
locationMap = new MapControl(mapboxel, true);
locationMap.reloadMap();
var locationMapLoaded = false;
locationMap.mapObj.on('load', function () {
locationMapLoaded = true;
});
apirequest(SETTINGS.apis.locations, {}, function (resp) {
var loadWhenMapReady = function () {
if (locationMapLoaded) {
setupLocationMap(resp);
} else {
setTimeout(function () {
loadWhenMapReady();
}, 100);
}
}
loadWhenMapReady();
}, function (xhr) {
app.preloader.hide();
try {
var error = $.parseJSON(xhr.responseText);
if (error && typeof error.msg != 'undefined') {
app.dialog.alert(error.msg, "Error");
sendErrorReport("Location Map", "Couldn't get locations GeoJSON", error.msg);
} else {
app.dialog.alert("There's a server or network problem. Check your Internet connection or try again later.", "Error");
sendErrorReport("Location Map", "Couldn't get locations GeoJSON", "Server/network problem: " + xhr.status + ": " + xhr.statusText);
}
} catch (ex) {
app.dialog.alert("There's a server or network problem. Check your Internet connection or try again later.", "Error");
sendErrorReport("Location Map", "Couldn't get locations GeoJSON", "Server/network problem: " + xhr.status + ": " + xhr.statusText);
}
});
}
} else {
showWebGLErrorMessage();
app.preloader.hide();
}
}
function setupLocationMap(geojson) {
app.preloader.hide();
geojson.features.forEach((marker) => {
const el = document.createElement('div');
el.className = 'marker';
el.style.backgroundImage = "url(./assets/images/" + marker.properties.branding + "_marker.png)";
el.style.width = "32px";
el.style.height = "32px";
el.style.cursor = "pointer";
el.addEventListener('click', () => {
openMapLocationInfo(marker);
});
new maplibregl.Marker({element: el})
.setLngLat(marker.geometry.coordinates)
.addTo(locationMap.mapObj);
});
locationMap.mapObj.jumpTo({center: [-112.005, 46.589], zoom: 9});
}
$("body").on("sheet:open", "#locationInfoModal", function () {
$("#mapbox-locations").addClass("sheet-open");
locationMap.mapObj.resize();
});
$("body").on("sheet:close", "#locationInfoModal", function () {
$("#mapbox-locations").removeClass("sheet-open");
locationMap.mapObj.resize();
locationMap.mapObj.easeTo({center: [-112.005, 46.589], zoom: 9});
});

@ -23,6 +23,9 @@ var app = new Framework7({
popover: {
backdrop: true
},
sheet: {
backdrop: false
},
touch: {
tapHold: true
},

@ -7,6 +7,7 @@
var dropboxMap = null;
var serviceAreaMap = null;
var locationMap = null;
function showWebGLErrorMessage() {
app.dialog.alert("Well, this is awkward. Your device doesn't support displaying the map. If your \n\

@ -1,36 +0,0 @@
/*
* 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/.
*/
$("#app").on("submit", "#moneyorderForm", function (e) {
e.preventDefault();
verifyMoneyOrder($('#moneyorderserial').val());
return false;
});
function verifyMoneyOrder(serial) {
if (typeof serial != "string" || serial == "" || /^[0-9]{3,8}$/.test(serial) == false) {
app.dialog.alert("Enter a valid Helena Express money order serial number.", "Whoops!");
return;
}
app.dialog.preloader("Working...");
apirequest(SETTINGS.apis.moneyorderverify, {
serial: serial
}, function (resp) {
app.dialog.close();
if (resp.status == "OK") {
app.dialog.alert("Amount: $" + resp.amount
+ "<br>Issued: " + resp.issued_date + " UTC"
+ (resp.mo_status == "" ? "" : "<br>Status: " + resp.mo_status),
"Money Order #" + resp.serial);
} else {
app.dialog.alert(resp.msg, "Error");
}
}, function (error) {
app.dialog.close();
app.dialog.alert("Connection or server error. Try again later.", "Whoops!");
sendErrorReport("Money Order", "Verification");
});
}

@ -181,7 +181,7 @@ function handleDeepLink(href) {
router.navigate("/quicksend");
break;
case "/kiosk":
router.navigate("/postalpoint");
router.navigate("/kiosk");
break;
case "/manifest":
openExternalBrowser(link.href);
@ -190,24 +190,20 @@ function handleDeepLink(href) {
case "/mobile/":
router.navigate("/mobile");
break;
case "/money":
router.navigate("/moneyorder");
break;
case "/notary":
router.navigate("/notary");
break;
case "/pickup":
router.navigate("/pickup");
break;
case "/postalpoint":
case "/postalpoint/":
router.navigate("/postalpoint");
case "/locations":
router.navigate("/locations");
break;
case "/rates":
router.navigate("/rates");
break;
case "/review":
openExternalBrowser(link.href);
openExternalBrowser("https://helena.express/review");
break;
case "/schedule":
router.navigate("/appointment");

@ -6,7 +6,7 @@
function sendErrorReport(category, error, errordata) {
if (getStorage("analytics") !== "false") {
if (getStorage("analytics") !== "false" && typeof _paq !== "undefined") {
try {
if (typeof errordata == "undefined") {
_paq.push(['trackEvent', 'Error', category, error]);
@ -20,7 +20,7 @@ function sendErrorReport(category, error, errordata) {
}
function sendActionReport(category, action, data) {
if (getStorage("analytics") !== "false") {
if (getStorage("analytics") !== "false" && typeof _paq !== "undefined") {
try {
if (typeof data == "undefined") {
_paq.push(['trackEvent', 'User Action', category, action]);
@ -34,7 +34,7 @@ function sendActionReport(category, action, data) {
}
function trackPageView(url, title) {
if (getStorage("analytics") !== "false") {
if (getStorage("analytics") !== "false" && typeof _paq !== "undefined") {
try {
_paq.push(['setCustomUrl', "https://app.helena.express" + url]);
_paq.push(['setDocumentTitle', title]);

@ -12,7 +12,11 @@
* @returns {undefined}
*/
function setStorage(key, value) {
localStorage.setItem(key, value);
if (typeof value == "string") {
localStorage.setItem(key, value);
} else {
localStorage.setItem(key, "JSON|" + JSON.stringify(value));
}
}
/**
@ -21,7 +25,12 @@ function setStorage(key, value) {
* @returns {DOMString}
*/
function getStorage(key) {
return localStorage.getItem(key);
var val = localStorage.getItem(key);
if (typeof val == "string" && val.startsWith("JSON|")) {
return JSON.parse(val.substr(5));
} else {
return val;
}
}
function removeFromStorage(key) {

@ -46,8 +46,6 @@
<script src="node_modules/maplibre-gl/dist/maplibre-gl.js"></script>
<script src="node_modules/bwip-js/dist/bwip-js-min.js"></script>
<script src="assets/js/qrcode.min.js"></script>
<script src="assets/js/bitcore-lib.min.js"></script>
<script src="assets/js/bitcore-lib-doge.min.js"></script>
<script src="settings.js"></script>
@ -68,11 +66,9 @@
<script src="assets/js/account.js"></script>
<script src="assets/js/shop.js"></script>
<script src="assets/js/home.js"></script>
<script src="assets/js/crypto.js"></script>
<script src="assets/js/serviceareamap.js"></script>
<script src="assets/js/moneyorder.js"></script>
<script src="assets/js/locationmap.js"></script>
<script src="assets/js/quicksend.js"></script>
<!-- <script src="assets/js/labelmaker.js"></script> -->
<script src="routes.js"></script>
<script src="assets/js/main.js"></script>

380
www/package-lock.json generated

@ -1,8 +1,381 @@
{
"name": "HelenaExpressApp",
"version": "2.0.3",
"lockfileVersion": 1,
"version": "2.1.0",
"lockfileVersion": 2,
"requires": true,
"packages": {
"": {
"name": "HelenaExpressApp",
"version": "2.0.4",
"license": "MPL-2.0",
"dependencies": {
"@fortawesome/fontawesome-pro": "^6",
"@zxing/library": "^0.15.2",
"bwip-js": "^3.1.0",
"framework7": "^7.0.2",
"jquery": "^3.6.0",
"maplibre-gl": "^1.15.3",
"template7": "^1.4.2"
}
},
"node_modules/@fortawesome/fontawesome-pro": {
"version": "6.1.1",
"resolved": "https://npm.fontawesome.com/@fortawesome/fontawesome-pro/-/6.1.1/fontawesome-pro-6.1.1.tgz",
"integrity": "sha512-0w6GM8sCXNpcBLUz4bx61JvjjoCvfEIz5wBz2KjLNw9qk1F2XiUWuifXobvLbwaA7kqPGBRPo3U8Zw7zyaJ9sA==",
"engines": {
"node": ">=6"
}
},
"node_modules/@mapbox/geojson-rewind": {
"version": "0.5.1",
"resolved": "https://registry.npmjs.org/@mapbox/geojson-rewind/-/geojson-rewind-0.5.1.tgz",
"integrity": "sha512-eL7fMmfTBKjrb+VFHXCGv9Ot0zc3C0U+CwXo1IrP+EPwDczLoXv34Tgq3y+2mPSFNVUXgU42ILWJTC7145KPTA==",
"dependencies": {
"get-stream": "^6.0.1",
"minimist": "^1.2.5"
},
"bin": {
"geojson-rewind": "geojson-rewind"
}
},
"node_modules/@mapbox/geojson-types": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/@mapbox/geojson-types/-/geojson-types-1.0.2.tgz",
"integrity": "sha512-e9EBqHHv3EORHrSfbR9DqecPNn+AmuAoQxV6aL8Xu30bJMJR1o8PZLZzpk1Wq7/NfCbuhmakHTPYRhoqLsXRnw=="
},
"node_modules/@mapbox/jsonlint-lines-primitives": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/@mapbox/jsonlint-lines-primitives/-/jsonlint-lines-primitives-2.0.2.tgz",
"integrity": "sha1-zlblOfg1UrWNENZy6k1vya3HsjQ=",
"engines": {
"node": ">= 0.6"
}
},
"node_modules/@mapbox/mapbox-gl-supported": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/@mapbox/mapbox-gl-supported/-/mapbox-gl-supported-1.5.0.tgz",
"integrity": "sha512-/PT1P6DNf7vjEEiPkVIRJkvibbqWtqnyGaBz3nfRdcxclNSnSdaLU5tfAgcD7I8Yt5i+L19s406YLl1koLnLbg==",
"peerDependencies": {
"mapbox-gl": ">=0.32.1 <2.0.0"
}
},
"node_modules/@mapbox/point-geometry": {
"version": "0.1.0",
"resolved": "https://registry.npmjs.org/@mapbox/point-geometry/-/point-geometry-0.1.0.tgz",
"integrity": "sha1-ioP5M1x4YO/6Lu7KJUMyqgru2PI="
},
"node_modules/@mapbox/tiny-sdf": {
"version": "1.2.5",
"resolved": "https://registry.npmjs.org/@mapbox/tiny-sdf/-/tiny-sdf-1.2.5.tgz",
"integrity": "sha512-cD8A/zJlm6fdJOk6DqPUV8mcpyJkRz2x2R+/fYcWDYG3oWbG7/L7Yl/WqQ1VZCjnL9OTIMAn6c+BC5Eru4sQEw=="
},
"node_modules/@mapbox/unitbezier": {
"version": "0.0.0",
"resolved": "https://registry.npmjs.org/@mapbox/unitbezier/-/unitbezier-0.0.0.tgz",
"integrity": "sha1-FWUb1VOme4WB+zmIEMmK2Go0Uk4="
},
"node_modules/@mapbox/vector-tile": {
"version": "1.3.1",
"resolved": "https://registry.npmjs.org/@mapbox/vector-tile/-/vector-tile-1.3.1.tgz",
"integrity": "sha512-MCEddb8u44/xfQ3oD+Srl/tNcQoqTw3goGk2oLsrFxOTc3dUp+kAnby3PvAeeBYSMSjSPD1nd1AJA6W49WnoUw==",
"dependencies": {
"@mapbox/point-geometry": "~0.1.0"
}
},
"node_modules/@mapbox/whoots-js": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/@mapbox/whoots-js/-/whoots-js-3.1.0.tgz",
"integrity": "sha512-Es6WcD0nO5l+2BOQS4uLfNPYQaNDfbot3X1XUoloz+x0mPDS3eeORZJl06HXjwBG1fOGwCRnzK88LMdxKRrd6Q==",
"engines": {
"node": ">=6.0.0"
}
},
"node_modules/@zxing/library": {
"version": "0.15.2",
"resolved": "https://registry.npmjs.org/@zxing/library/-/library-0.15.2.tgz",
"integrity": "sha512-J+N88Eyg6eI2SKIk2YIkjjNICbMSqmLZnB3oD1S21Bi3k+Ddg2eKe/nW+Hce4NKAFAZtY1mdDM08Bj9eu87HSg==",
"dependencies": {
"ts-custom-error": "^3.0.0"
},
"engines": {
"node": ">= 8.9.0"
},
"optionalDependencies": {
"text-encoding": "^0.7.0"
}
},
"node_modules/bwip-js": {
"version": "3.1.0",
"resolved": "https://registry.npmjs.org/bwip-js/-/bwip-js-3.1.0.tgz",
"integrity": "sha512-H+4s1/25kC/ybwt+o0zhFkbTL4nGrzZV7KW44luWqT/ClmCzhXVqVgaNx8d9YoOUVKR461xDmLt3eGDRtGqRag==",
"bin": {
"bwip-js": "bin/bwip-js.js"
}
},
"node_modules/csscolorparser": {
"version": "1.0.3",
"resolved": "https://registry.npmjs.org/csscolorparser/-/csscolorparser-1.0.3.tgz",
"integrity": "sha1-s085HupNqPPpgjHizNjfnAQfFxs="
},
"node_modules/dom7": {
"version": "4.0.4",
"resolved": "https://registry.npmjs.org/dom7/-/dom7-4.0.4.tgz",
"integrity": "sha512-DSSgBzQ4rJWQp1u6o+3FVwMNnT5bzQbMb+o31TjYYeRi05uAcpF8koxdfzeoe5ElzPmua7W7N28YJhF7iEKqIw==",
"dependencies": {
"ssr-window": "^4.0.0"
}
},
"node_modules/earcut": {
"version": "2.2.3",
"resolved": "https://registry.npmjs.org/earcut/-/earcut-2.2.3.tgz",
"integrity": "sha512-iRDI1QeCQIhMCZk48DRDMVgQSSBDmbzzNhnxIo+pwx3swkfjMh6vh0nWLq1NdvGHLKH6wIrAM3vQWeTj6qeoug=="
},
"node_modules/framework7": {
"version": "7.0.2",
"resolved": "https://registry.npmjs.org/framework7/-/framework7-7.0.2.tgz",
"integrity": "sha512-LDjHItZ1+47wWYhItL95zqRDvfvl/5Lj7qGTPCFLO2U6/JrdYWbl2erkU8+KHwgSnB4tbDvLixWVlqOPCWbpZg==",
"hasInstallScript": true,
"dependencies": {
"dom7": "^4.0.4",
"htm": "^3.1.0",
"path-to-regexp": "^6.2.0",
"skeleton-elements": "^4.0.0",
"ssr-window": "^4.0.2",
"swiper": "^8.1.4"
},
"funding": {
"type": "patreon",
"url": "https://www.patreon.com/framework7"
}
},
"node_modules/geojson-vt": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/geojson-vt/-/geojson-vt-3.2.1.tgz",
"integrity": "sha512-EvGQQi/zPrDA6zr6BnJD/YhwAkBP8nnJ9emh3EnHQKVMfg/MRVtPbMYdgVy/IaEmn4UfagD2a6fafPDL5hbtwg=="
},
"node_modules/get-stream": {
"version": "6.0.1",
"resolved": "https://registry.npmjs.org/get-stream/-/get-stream-6.0.1.tgz",
"integrity": "sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==",
"engines": {
"node": ">=10"
},
"funding": {
"url": "https://github.com/sponsors/sindresorhus"
}
},
"node_modules/gl-matrix": {
"version": "3.4.3",
"resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-3.4.3.tgz",
"integrity": "sha512-wcCp8vu8FT22BnvKVPjXa/ICBWRq/zjFfdofZy1WSpQZpphblv12/bOQLBC1rMM7SGOFS9ltVmKOHil5+Ml7gA=="
},
"node_modules/grid-index": {
"version": "1.1.0",
"resolved": "https://registry.npmjs.org/grid-index/-/grid-index-1.1.0.tgz",
"integrity": "sha512-HZRwumpOGUrHyxO5bqKZL0B0GlUpwtCAzZ42sgxUPniu33R1LSFH5yrIcBCHjkctCAh3mtWKcKd9J4vDDdeVHA=="
},
"node_modules/htm": {
"version": "3.1.1",
"resolved": "https://registry.npmjs.org/htm/-/htm-3.1.1.tgz",
"integrity": "sha512-983Vyg8NwUE7JkZ6NmOqpCZ+sh1bKv2iYTlUkzlWmA5JD2acKoxd4KVxbMmxX/85mtfdnDmTFoNKcg5DGAvxNQ=="
},
"node_modules/ieee754": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
"integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/feross"
},
{
"type": "patreon",
"url": "https://www.patreon.com/feross"
},
{
"type": "consulting",
"url": "https://feross.org/support"
}
]
},
"node_modules/jquery": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/jquery/-/jquery-3.6.0.tgz",
"integrity": "sha512-JVzAR/AjBvVt2BmYhxRCSYysDsPcssdmTFnzyLEts9qNwmjmu4JTAMYubEfwVOSwpQ1I1sKKFcxhZCI2buerfw=="
},
"node_modules/kdbush": {
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/kdbush/-/kdbush-3.0.0.tgz",
"integrity": "sha512-hRkd6/XW4HTsA9vjVpY9tuXJYLSlelnkTmVFu4M9/7MIYQtFcHpbugAU7UbOfjOiVSVYl2fqgBuJ32JUmRo5Ew=="
},
"node_modules/maplibre-gl": {
"version": "1.15.3",
"resolved": "https://registry.npmjs.org/maplibre-gl/-/maplibre-gl-1.15.3.tgz",
"integrity": "sha512-ZuOhLCNgp7Yl1L9uyKgZeuo7kKdewP0iWtmEXsZ/snp0JiVkR1Kl+m1rsfKT/wpm/O4zZ7mUGxF16cYbMIFDRA==",
"dependencies": {
"@mapbox/geojson-rewind": "^0.5.0",
"@mapbox/geojson-types": "^1.0.2",
"@mapbox/jsonlint-lines-primitives": "^2.0.2",
"@mapbox/mapbox-gl-supported": "^1.5.0",
"@mapbox/point-geometry": "^0.1.0",
"@mapbox/tiny-sdf": "^1.1.1",
"@mapbox/unitbezier": "^0.0.0",
"@mapbox/vector-tile": "^1.3.1",
"@mapbox/whoots-js": "^3.1.0",
"csscolorparser": "~1.0.3",
"earcut": "^2.2.2",
"geojson-vt": "^3.2.1",
"gl-matrix": "^3.2.1",
"grid-index": "^1.1.0",
"minimist": "^1.2.6",
"murmurhash-js": "^1.0.0",
"pbf": "^3.2.1",
"potpack": "^1.0.1",
"quickselect": "^2.0.0",
"rw": "^1.3.3",
"supercluster": "^7.1.0",
"tinyqueue": "^2.0.3",
"vt-pbf": "^3.1.1"
},
"engines": {
"node": ">=6.4.0"
}
},
"node_modules/minimist": {
"version": "1.2.6",
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.6.tgz",
"integrity": "sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q=="
},
"node_modules/murmurhash-js": {
"version": "1.0.0",
"resolved": "https://registry.npmjs.org/murmurhash-js/-/murmurhash-js-1.0.0.tgz",
"integrity": "sha1-sGJ44h/Gw3+lMTcysEEry2rhX1E="
},
"node_modules/path-to-regexp": {
"version": "6.2.0",
"resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.0.tgz",
"integrity": "sha512-f66KywYG6+43afgE/8j/GoiNyygk/bnoCbps++3ErRKsIYkGGupyv07R2Ok5m9i67Iqc+T2g1eAUGUPzWhYTyg=="
},
"node_modules/pbf": {
"version": "3.2.1",
"resolved": "https://registry.npmjs.org/pbf/-/pbf-3.2.1.tgz",
"integrity": "sha512-ClrV7pNOn7rtmoQVF4TS1vyU0WhYRnP92fzbfF75jAIwpnzdJXf8iTd4CMEqO4yUenH6NDqLiwjqlh6QgZzgLQ==",
"dependencies": {
"ieee754": "^1.1.12",
"resolve-protobuf-schema": "^2.1.0"
},
"bin": {
"pbf": "bin/pbf"
}
},
"node_modules/potpack": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/potpack/-/potpack-1.0.2.tgz",
"integrity": "sha512-choctRBIV9EMT9WGAZHn3V7t0Z2pMQyl0EZE6pFc/6ml3ssw7Dlf/oAOvFwjm1HVsqfQN8GfeFyJ+d8tRzqueQ=="
},
"node_modules/protocol-buffers-schema": {
"version": "3.6.0",
"resolved": "https://registry.npmjs.org/protocol-buffers-schema/-/protocol-buffers-schema-3.6.0.tgz",
"integrity": "sha512-TdDRD+/QNdrCGCE7v8340QyuXd4kIWIgapsE2+n/SaGiSSbomYl4TjHlvIoCWRpE7wFt02EpB35VVA2ImcBVqw=="
},
"node_modules/quickselect": {
"version": "2.0.0",
"resolved": "https://registry.npmjs.org/quickselect/-/quickselect-2.0.0.tgz",
"integrity": "sha512-RKJ22hX8mHe3Y6wH/N3wCM6BWtjaxIyyUIkpHOvfFnxdI4yD4tBXEBKSbriGujF6jnSVkJrffuo6vxACiSSxIw=="
},
"node_modules/resolve-protobuf-schema": {
"version": "2.1.0",
"resolved": "https://registry.npmjs.org/resolve-protobuf-schema/-/resolve-protobuf-schema-2.1.0.tgz",
"integrity": "sha512-kI5ffTiZWmJaS/huM8wZfEMer1eRd7oJQhDuxeCLe3t7N7mX3z94CN0xPxBQxFYQTSNz9T0i+v6inKqSdK8xrQ==",
"dependencies": {
"protocol-buffers-schema": "^3.3.1"
}
},
"node_modules/rw": {
"version": "1.3.3",
"resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz",
"integrity": "sha1-P4Yt+pGrdmsUiF700BEkv9oHT7Q="
},
"node_modules/skeleton-elements": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/skeleton-elements/-/skeleton-elements-4.0.0.tgz",
"integrity": "sha512-ctu/bKsWvq1stmvaNDsaZI+tnttgHfTf1FJq7ZLL0N/g9SDTf1ulOIr/fTIbWSUrpqmC2BbKPDyd1h8JmGfV/Q=="
},
"node_modules/ssr-window": {
"version": "4.0.2",
"resolved": "https://registry.npmjs.org/ssr-window/-/ssr-window-4.0.2.tgz",
"integrity": "sha512-ISv/Ch+ig7SOtw7G2+qkwfVASzazUnvlDTwypdLoPoySv+6MqlOV10VwPSE6EWkGjhW50lUmghPmpYZXMu/+AQ=="
},
"node_modules/supercluster": {
"version": "7.1.5",
"resolved": "https://registry.npmjs.org/supercluster/-/supercluster-7.1.5.tgz",
"integrity": "sha512-EulshI3pGUM66o6ZdH3ReiFcvHpM3vAigyK+vcxdjpJyEbIIrtbmBdY23mGgnI24uXiGFvrGq9Gkum/8U7vJWg==",
"dependencies": {
"kdbush": "^3.0.0"
}
},
"node_modules/swiper": {
"version": "8.1.4",
"resolved": "https://registry.npmjs.org/swiper/-/swiper-8.1.4.tgz",
"integrity": "sha512-ho6ceKxqbDxV51qymVxwn1oB4CqTrsG3Y5pGW2aKlZxsT6NMdlow8ICUa+wD/m5l2T5ZD2B0yyqTihSSmLBV4A==",
"funding": [
{
"type": "patreon",
"url": "https://www.patreon.com/swiperjs"
},
{
"type": "open_collective",
"url": "http://opencollective.com/swiper"
}
],
"hasInstallScript": true,
"dependencies": {
"dom7": "^4.0.4",
"ssr-window": "^4.0.2"
},
"engines": {
"node": ">= 4.7.0"
}
},
"node_modules/template7": {
"version": "1.4.2",
"resolved": "https://registry.npmjs.org/template7/-/template7-1.4.2.tgz",
"integrity": "sha512-eoKnScBMDk7lyj7+iCzKbxGiSLLlQk0DNvmclyJuMCUKxy9JrFuAB+GD5iplF4WiQPtMdI06CHHks3avL22JXA==",
"engines": {
"node": ">= 0.10.0"
}
},
"node_modules/text-encoding": {
"version": "0.7.0",
"resolved": "https://registry.npmjs.org/text-encoding/-/text-encoding-0.7.0.tgz",
"integrity": "sha512-oJQ3f1hrOnbRLOcwKz0Liq2IcrvDeZRHXhd9RgLrsT+DjWY/nty1Hi7v3dtkaEYbPYe0mUoOfzRrMwfXXwgPUA==",
"deprecated": "no longer maintained",
"optional": true
},
"node_modules/tinyqueue": {
"version": "2.0.3",
"resolved": "https://registry.npmjs.org/tinyqueue/-/tinyqueue-2.0.3.tgz",
"integrity": "sha512-ppJZNDuKGgxzkHihX8v9v9G5f+18gzaTfrukGrq6ueg0lmH4nqVnA2IPG0AEH3jKEk2GRJCUhDoqpoiw3PHLBA=="
},
"node_modules/ts-custom-error": {
"version": "3.2.0",
"resolved": "https://registry.npmjs.org/ts-custom-error/-/ts-custom-error-3.2.0.tgz",
"integrity": "sha512-cBvC2QjtvJ9JfWLvstVnI45Y46Y5dMxIaG1TDMGAD/R87hpvqFL+7LhvUDhnRCfOnx/xitollFWWvUKKKhbN0A==",
"engines": {
"node": ">=8.0.0"
}
},
"node_modules/vt-pbf": {
"version": "3.1.3",
"resolved": "https://registry.npmjs.org/vt-pbf/-/vt-pbf-3.1.3.tgz",
"integrity": "sha512-2LzDFzt0mZKZ9IpVF2r69G9bXaP2Q2sArJCmcCgvfTdCCZzSyz4aCLoQyUilu37Ll56tCblIZrXFIjNUpGIlmA==",
"dependencies": {
"@mapbox/point-geometry": "0.1.0",
"@mapbox/vector-tile": "^1.3.1",
"pbf": "^3.2.1"
}
}
},
"dependencies": {
"@fortawesome/fontawesome-pro": {
"version": "6.1.1",
@ -31,7 +404,8 @@
"@mapbox/mapbox-gl-supported": {
"version": "1.5.0",
"resolved": "https://registry.npmjs.org/@mapbox/mapbox-gl-supported/-/mapbox-gl-supported-1.5.0.tgz",
"integrity": "sha512-/PT1P6DNf7vjEEiPkVIRJkvibbqWtqnyGaBz3nfRdcxclNSnSdaLU5tfAgcD7I8Yt5i+L19s406YLl1koLnLbg=="
"integrity": "sha512-/PT1P6DNf7vjEEiPkVIRJkvibbqWtqnyGaBz3nfRdcxclNSnSdaLU5tfAgcD7I8Yt5i+L19s406YLl1koLnLbg==",
"requires": {}
},
"@mapbox/point-geometry": {
"version": "0.1.0",

@ -1,6 +1,6 @@
{
"name": "HelenaExpressApp",
"version": "2.0.4",
"version": "2.1.0",
"main": "index.html",
"license": "MPL-2.0",
"dependencies": {

@ -1,67 +0,0 @@
<!-- 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/. -->
<div class="page" data-name="crypto">
<div class="navbar">
<div class="navbar-bg"></div>
<div class="navbar-inner">
<div class="left">
<a class="link back" href="#">
<i class="icon icon-back"></i>
<span class="if-not-md">Back</span>
</a>
</div>
<div class="title">Crypto Wallet</div>
</div>
</div>
<div class="page-content">
<div class="row justify-content-center">
<div class="col-100 medium-60 large-70">
<div class="swiper margin-top" id="crypto-intro-swiper">
<div class="swiper-wrapper">
{{#each slideshow}}
<div class="swiper-slide display-flex justify-contenty-center align-items-center flex-direction-column">
<img src="{{image}}" style="max-height: 40vh; max-width: 90%; height: 50rem;"/>
<p class="text-align-center margin padding">{{text}}</p>
</div>
{{/each}}
</div>
<div id="crypto-intro-swiper-pagination" class="swiper-pagination"></div>
</div>
</div>
<div class="col-100 medium-40 large-30">
<div class="block text-align-center">
<div class="button hapticbtn button-fill" onclick="scanWalletQrCode(openWalletPage);"><i class="fa-solid fa-qrcode"></i> Scan Wallet</div>
</div>
<div class="block text-align-center">
<a href="#" onclick="$('#wallet-address-manual-entry').removeClass('display-none');$('a[name=wallet-address-manual-entry-anchor]').get(0).scrollIntoView();">Can't scan? <span class="taptext">Tap</span><span class="clicktext">Click</span> here.</a>
</div>
<div class="block">
<div class="list margin-bottom-half display-none" id="wallet-address-manual-entry">
<ul class="padding">
<li class="item-content">
Type your wallet's public address below, then press the open wallet button.
</li>
<li class="item-content item-input">
<div class="item-inner">
<div class="item-input-wrap">
<input type="text" id="walletPubKeyManualEntry" placeholder="1X68a3n1..." />
<span class="input-clear-button"></span>
</div>
</div>
</li>
<li class="item-content">
<div class="button button-outline hapticbtn" onclick="openWalletPage($('#walletPubKeyManualEntry').val());">Open Wallet</div>
</li>
</ul>
</div>
<a name="wallet-address-manual-entry-anchor" href="#wallet-address-manual-entry-anchor"></a>
</div>
</div>
</div>
</div>
</div>

@ -1,209 +0,0 @@
<!-- 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/. -->
<div class="page" data-name="crypto_wallet">
<div class="navbar">
<div class="navbar-bg"></div>
<div class="navbar-inner">
<div class="left">
<a class="link back" href="#">
<i class="icon icon-back"></i>
<span class="if-not-md">Back</span>
</a>
</div>
<div class="title">Crypto Wallet</div>
</div>
</div>
<div class="page-content">
<div class="card-content-padding text-align-center">
<img id="walletBalanceLogo" style="max-height: 25vh; max-width: 25vw; height: 5em;" src="{{logo}}" />
<p>This <span id="walletCurrency">{{currencyname}}</span> wallet contains</p>
<h2><span id="walletBalanceAmount">{{balance}} {{currencyunit}}</span></h2>
<p>currently worth</p>
<h2><span id="walletFiatAmount">{{fiatvalue}}</span></h2>
</div>
<div class="row justify-content-center">
<div class="col-100 medium-50 large-30">
<div class="block">
<div class="button hapticbtn button-fill popup-open" id="sendCryptoOpenPopupBtn"><i class="fa-solid fa-inbox-out"></i> Send</div>
</div>
<div class="block">
<div class="button hapticbtn button-fill popup-open" data-popup="#receiveCryptoPopup" id="receiveCryptoOpenPopupBtn"><i class="fa-solid fa-inbox-in"></i> Receive</div>
</div>
</div>
</div>
<div class="card-content-padding text-color-gray text-align-center" id="walletAddress">{{walletaddress}}</div>
<div class="card-content-padding text-color-gray text-align-center" id="walletBalanceAttribution">
{{attribution}}
</div>
</div>
<div class="popup" id="sendCryptoPopup">
<div class="navbar">
<div class="navbar-bg"></div>
<div class="navbar-inner">
<div class="left">
<a class="link popup-close" href="#">
<i class="icon icon-back"></i>
<span class="if-not-md">Close</span>
</a>
</div>
<div class="title">Send Crypto</div>
</div>
</div>
<div class="list margin-bottom-half">
<ul>
<li class="item-divider">Step 1</li>
<li class="item-content">
<div class="item-inner">
Scan your private key. The private key unlocks your wallet and authorizes the transfer.
</div>
</li>
<li class="item-content item-input">
<div class="item-inner">
<div class="item-input-wrap">
<input type="text" id="walletPrivateKey" placeholder="6JJRxyW..." />
<span class="input-clear-button"></span>
</div>
</div>
</li>
<li class="item-content">
<div class="button hapticbtn button-fill" onclick="scanPrivateKeyQrCode(function (d) {
$('#walletPrivateKey').val(d);
});"><i class="fa-solid fa-key"></i> Scan Private Key
</div>
</li>
<li class="item-divider">Step 2</li>
<li class="item-content">
<div class="item-inner">
Scan or paste the recipient's wallet address.
The money will be sent here. Important: the recipient must be expecting the
same cryptocurrency your wallet uses. Otherwise the money will
be lost forever.
</div>
</li>
<li class="item-content item-input">
<div class="item-inner">
<div class="item-input-wrap">
<input type="text" id="walletToAddress" placeholder="1X68a3n1..." value="{{sendtoaddress}}" />
<span class="input-clear-button"></span>
</div>
</div>
</li>
<li class="item-content">
<div class="button hapticbtn button-fill" onclick="scanWalletQrCode(function (d) {
var parsed = parsePaymentURI(d);
if (parsed == null) {
$('#walletToAddress').val(d);
} else {
$('#walletToAddress').val(parsed.address);
if (typeof parsed['amount'] != 'undefined') {
$('#transactionAmount').val(parsed.amount);
}
}
});"><i class="fa-solid fa-inbox-in"></i> Scan Recipient's Wallet
</div>
</li>
<li class="item-divider">Step 3</li>
<li class="item-content">
<div class="item-inner">
Enter the amount to send.
</div>
</li>
<li class="item-content item-input">
<div class="item-inner">
<div class="item-title item-label" id="cryptoAmountSendCurrencyLabel"></div>
<div class="item-input-wrap">
<input type="number" id="transactionAmount" step="0.00000001" min="0.00000001" max="999999.99999999" value="{{sendtoamount}}"/>
<span class="input-clear-button"></span>
</div>
</div>
</li>
<li class="item-content item-input" id="cryptoFiatInputItem" style="display: none;">
<div class="item-inner">
<div class="item-title item-label" id="cryptoAmountSendFiatLabel"></div>
<div class="item-input-wrap">
<input type="number" id="transactionAmountFiat" step="0.01" min="0.01" max="9999.99"/>
<span class="input-clear-button"></span>
</div>
</div>
</li>
<li class="item-divider">Step 4</li>
<li class="item-content">
<div class="item-inner">
<div><span class="taptext">Tap</span><span class="clicktext">Click</span> the button to send the transaction.</div>
</div>
</li>
<li class="item-content">
<div class="button hapticbtn button-fill" onclick="walletGUISendCoins()">
<i class="fa-solid fa-paper-plane"></i> Send Transaction
</div>
</li>
<li class="item-content">
<div class="button hapticbtn popup-close" onclick="$('#walletPrivateKey').val('');" >
<i class="fa-solid fa-xmark"></i> Cancel
</div>
</li>
</ul>
</div>
</div>
<div class="popup" id="receiveCryptoPopup">
<div class="navbar">
<div class="navbar-bg"></div>
<div class="navbar-inner">
<div class="left">
<a class="link popup-close" href="#">
<i class="icon icon-back"></i>
<span class="if-not-md">Close</span>
</a>
</div>
<div class="title">Request Crypto</div>
</div>
</div>
<div class="margin">
Enter the amount to request.
</div>
<div class="list margin-bottom-half margin-top-half">
<ul>
<li class="item-content item-input">
<div class="item-inner">
<div class="item-title item-label" id="cryptoAmountReceiveCurrencyLabel">{{currencyunit}}</div>
<div class="item-input-wrap">
<input type="number" id="receiveAmount" step="0.00000001" min="0.00000001" max="999999.99999999" data-currency="{{currencyunit}}" />
<span class="input-clear-button"></span>
</div>
</div>
</li>
<li class="item-content item-input" id="cryptoAmountReceiveFiatLI" style="display: none;">
<div class="item-inner">
<div class="item-title item-label" id="cryptoAmountReceiveFiatLabel"></div>
<div class="item-input-wrap">
<input type="number" id="receiveAmountFiat" step="0.01" min="0.01" max="9999.99" data-exchangerate="{{exchangerate}}" data-currencylabel="$"/>
<span class="input-clear-button"></span>
</div>
</div>
</li>
<li class="item-content">
<div class="button hapticbtn button-fill" onclick="showPaymentRequestQRCode()">
<i class="fa-solid fa-qrcode"></i> Show Payment Request Code
</div>
</li>
</ul>
</div>
<div id="paymentRequestQRCodeContainer" class="block display-flex justify-content-center"></div>
</div>
</div>

@ -0,0 +1,68 @@
<!-- 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/. -->
<div class="page" data-name="trailer">
<div class="navbar">
<div class="navbar-bg"></div>
<div class="navbar-inner">
<div class="left">
<a class="link back" href="#">
<i class="icon icon-back"></i>
<span class="if-not-md">Back</span>
</a>
</div>
<div class="title">Shipping Kiosks</div>
</div>
</div>
<div class="page-content noselect">
<div class="row justify-content-center">
<div class="col-100 medium-50 padding-top">
<div class="card">
<div class="card-body padding">
<div class="text-align-center">
<img src="./assets/images/postalpoint-logo-horizontal-black.svg" class="hidden-dark margin" style="max-height: 20vh; max-width: 80%;" />
<img src="./assets/images/postalpoint-logo-horizontal-white.svg" class="hidden-light margin" style="max-height: 20vh; max-width: 80%;" />
</div>
<div class="block margin-bottom" id="kiosk-dyncontent">
Visit a PostalPoint™ shipping kiosk to send mail and packages.
We've designed the kiosks with a simple and easy to use touchscreen, free boxes and envelopes, and a secure package drop.
You pay USPS retail prices with no markup. Free tracking and insurance included.
</div>
</div>
</div>
</div>
<div class="col-100 medium-50">
<div class="block-title">Locations</div>
<div class="list">
<ul>
{{#each locations}}
<li>
<a href="geo:{{geo}}" class="item-content item-link">
<div class="item-inner item-cell">
<div class="item-row">
<div class="item-cell">
<span style="font-weight: 600;">{{name}}</span>
<br />Hours: {{hours}}
</div>
</div>
<div class="item-row">
<div class="item-cell">
{{info}}
</div>
</div>
</div>
</a>
</li>
{{/each}}
</ul>
</div>
</div>
</div>
<div class="block text-align-center margin-top">
Helena Express is a founding member of the PostalPoint shipping network. PostalPoint is a trademark of PostalPortal LLC.
</div>
</div>
</div>

@ -0,0 +1,42 @@
<!-- 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/. -->
<div class="page" data-name="locations">
<div class="navbar">
<div class="navbar-bg"></div>
<div class="navbar-inner">
<div class="left">
<a class="link back sheet-close" href="#">
<i class="icon icon-back"></i>
<span class="if-not-md">Back</span>
</a>
</div>
<div class="title">Locations</div>
</div>
</div>
<div class="page-content noselect">
<div class="toolbar">
<div class="toolbar-inner justify-content-start">
<span class="margin-horizontal-half padding-half"><img src="./assets/images/DAS_marker.png" style="height: 24px; vertical-align: middle;" /> Drop Box</span>
<span class="margin-horizontal-half padding-half"><img src="./assets/images/PP_marker.png" style="height: 24px; vertical-align: middle;" /> Kiosk</span>
</div>
</div>
<div id="mapbox-locations"></div>
</div>
<div class="sheet-modal" id="locationInfoModal">
<div class="navbar">
<div class="navbar-bg"></div>
<div class="navbar-inner">
<div class="title" id="locationInfoName">Hide On Scroll</div>
<div class="right"><a class="link sheet-close" href="#"><i class="far fa-times if-not-ios"></i> <span class="if-ios">Close</span></a></div>
</div>
</div>
<div class="sheet-modal-inner">
<div class="block" id="locationInfoModalContainer"></div>
</div>
</div>
</div>

@ -1,42 +0,0 @@
<!-- 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/. -->
<div class="page" data-name="money">
<div class="navbar">
<div class="navbar-bg"></div>
<div class="navbar-inner">
<div class="left">
<a class="link back hapticbtn" href="#">
<i class="icon icon-back"></i>
<span class="if-not-md">Back</span>
</a>
</div>
<div class="title">Money</div>
</div>
</div>
<div class="page-content noselect">
<div class="row justify-content-center margin-top">
<div class="col-100 medium-90 xlarge-75 margin-horizontal">
<div class="row justify-content-center">
{{#each pages}}
<div class="col-100 small-50 large-33 no-margin-vertical">
<div class="card hapticbtn pointercursor" onclick="router.navigate('{{href}}');">
<div class="card-content text-align-center padding">
<h1 class="no-margin"><i class="{{icon}}"></i></h1>
<br />
<span style="font-weight: 700;">{{title}}</span>
<br />
<span>{{text}}</span>
</div>
</div>
</div>
{{/each}}
</div>
</div>
</div>
</div>
</div>

@ -1,70 +0,0 @@
<!-- 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/. -->
<div class="page" data-name="moneyorder">
<div class="navbar">
<div class="navbar-bg"></div>
<div class="navbar-inner">
<div class="left">
<a class="link back" href="#">
<i class="icon icon-back"></i>
<span class="if-not-md">Back</span>
</a>
</div>
<div class="title">Money Orders</div>
</div>
</div>
<div class="page-content">
<div class="row justify-content-center">
<div class="col-100 small-50 xlarge-40">
<div class="card margin">
<div class="card-content padding-vertical" id="moneyorder-dyncontent">
<dl>
<dt>How do I purchase a money order?</dt>
<dd>You can buy a money order during any notary or shipping appointment. You can also call us to schedule a visit. Were available where you are and on your schedule.</dd>
<dt>How can I pay for my money order?</dt>
<dd>We only accept cash payment for money orders at this time.</dd>
<dt>How much does a money order cost?</dt>
<dd>You can send money orders up to $500 with Helena Express for a $3 fee ($6 if by appointment).</dd>
<dt>How can a recipient cash a Helena Express money order?</dt>
<dd>Our money orders can be cashed like a check. Just bring it to your bank or any business offering check cashing services.</dd>
</div>
</div>
</div>
<div class="col-100 small-50 xlarge-40">
<div class="card margin">
<div class="card-header">Verify Money Order</div>
<form class="card-content padding-vertical" id="moneyorderForm">
<div class="block">
Enter the serial number from the top-right corner of the money order.
</div>
<div class="list media-list">
<ul>
<li class="item-content item-input item-input-outline">
<div class="item-inner">
<div class="item-title item-floating-label">Serial Number</div>
<div class="item-input-wrap">
<input type="text" id="moneyorderserial" placeholder="12345" inputmode="numeric" />
<span class="input-clear-button"></span>
</div>
</div>
</li>
<li class="padding">
<div class="button hapticbtn button-fill" onclick="verifyMoneyOrder($('#moneyorderserial').val())"><i class="fa-solid fa-magnifying-glass-dollar"></i> Verify</div>
</li>
</ul>
</div>
</form>
</div>
</div>
</div>
</div>
</div>

@ -61,6 +61,11 @@
licensed to practice law. We are not allowed to draft legal
records, give advice on legal matters, including immigration, or charge
a fee for those activities.
<br />
<br />
<br />
<br />
<br />
</div>
</div>
</div>

@ -27,24 +27,19 @@
</div>
<div class="block margin-bottom" id="trailer-dyncontent">
Our Mobile Shipping Center is a specialized trailer equipped to offer mailing,
shipping, notarizing, copying, and faxing services. With no pickup or travel fees,
shipping, notarizing, copying, and faxing services. With no markup or extra fees,
it's a good way to save money and skip the line at the post office.
</div>
<div class="block margin-bottom">
Check the schedule and come visit us! Need directions?
Just <span class="taptext">tap</span><span class="clicktext">click</span>
a location to open a map.
</div>
<div class="block">
<div class="button" onclick='openExternalBrowser("https://helena.express/mobile");'>
Learn More &nbsp;<i class="fa-regular fa-arrow-up-right-from-square"></i>
</div>
</div>
<div class="block margin-bottom">
Use Quick Send for faster service! Just enter the address info for your package ahead of time then show us your phone screen.
</div>
<div class="block">
<div class="button" onclick='router.navigate("/quicksend");'>
Open Quick Send

@ -7,8 +7,7 @@
var dynamicPages = [
"notary",
"telegram",
"trailer",
"moneyorder"
"trailer"
];
var compiledPages = {};
var pagesToCompile = [
@ -23,17 +22,13 @@ var pagesToCompile = [
"shop",
"shoppingcart_fragment",
"rateresult",
// "labelrateresult",
"crypto",
"crypto_wallet",
"account",
"trackresult",
"settings",
"receipts",
"trailer",
"money",
"moneyorder",
//"postalpoint",
"kiosk",
"locations",
"quicksend"
];
console.log("Compiling page templates...");
@ -57,82 +52,6 @@ var routes = [
}
}
},
{
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',
@ -172,10 +91,10 @@ var routes = [
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: "Locations",
href: "/locations",
icon: "fa-duotone fa-map-location-dot",
text: "Find a shipping kiosk or drop box near you."
},
{
title: "Shop for Supplies",
@ -190,10 +109,10 @@ var routes = [
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."
title: "My Account",
href: "/account",
icon: "fa-duotone fa-user-circle",
text: "View receipts, get account number, update payment method, and more."
}
]
})
@ -207,84 +126,41 @@ var routes = [
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: "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: "Self-Serve Kiosk",
href: "/kiosk",
icon: "fa-duotone fa-display",
text: "Visit a friendly neighborhood PostalPoint™ shipping kiosk to send mail and packages with no lines or hassle."
},
{
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."
text: "Just drop your package into a Drop and Send℠ drop box and scan the QR code. We'll charge the postage to your Helena Express 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: "Appointment",
href: "/appointment/shipping",
icon: "fa-duotone fa-calendar-alt",
text: "A courier will come to you on your schedule. No account required."
text: "We'll come to your home or business on your schedule. It's like a post office in your driveway!"
},
{
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."
}
]
})
}, {});
}
},
{
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."
text: "Our Mobile Shipping Center is a specially-designed trailer for printing postage, shipping mail and packages, and more."
}
]
})
}, {});
}
},
{
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(),
@ -308,6 +184,19 @@ var routes = [
}
}
},
{
path: '/locations',
content: compiledPages.locations(),
name: 'locations',
on: {
pageAfterIn: function () {
loadLocationMap();
},
pageAfterOut: function () {
locationMap = null;
}
}
},
{
path: '/servicearea',
content: compiledPages.servicearea(),
@ -536,6 +425,52 @@ var routes = [
}
}
},
{
path: '/kiosk',
name: 'kiosk',
async: function ( {resolve, reject}) {
app.dialog.preloader("Loading...");
apirequest(SETTINGS.apis.locations, [], function (resp) {
app.dialog.close();
var kioskLocations = [];
for (var i = 0; i < resp.features.length; i++) {
if (resp.features[i].properties.branding != "PP") {
continue;
}
kioskLocations.push({
name: resp.features[i].properties.name,
hours: resp.features[i].properties.hours,
info: resp.features[i].properties.info,
geo: "geo:" + (Math.round(resp.features[i].geometry.coordinates[1] * 1000000) / 1000000) + "," + (Math.round(resp.features[i].geometry.coordinates[0] * 1000000) / 1000000)
});
}
resolve({
content: compiledPages.kiosk({
locations: kioskLocations
})
}, {});
}, function (error) {
app.dialog.close();
app.dialog.alert("Couldn't get the kiosk locations. Try again later.", "Whoops!");
sendErrorReport("Kiosks", "Loading locations");
resolve({
content: compiledPages.kiosk({
locations: []
})
}, {});
}, "GET");
},
on: {
pageBeforeIn: function () {
dyncontent = getDynamicPageContent("kiosk");
if (dyncontent != null) {
$("#kiosk-dyncontent").html(dyncontent);
}
}
}
},
{
path: '/telegram',
name: 'telegram',
@ -579,25 +514,6 @@ var routes = [
}
}
},
// {
// 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',

@ -42,21 +42,12 @@ var SETTINGS = {
// Get receipts linked with account
getreceipts: "https://apis.helena.express/v1/account/getreceipts/",
getreceipt: "https://apis.helena.express/v1/account/getreceipt/",
// Crypto: check balance and send transactions
walletbalance: "https://apis.helena.express/v1/crypto/walletbalance/",
getutxo: "https://apis.helena.express/v1/crypto/getutxo/",
broadcasttransaction: "https://apis.helena.express/v1/crypto/broadcasttransaction/",
cryptofees: "https://apis.helena.express/v1/crypto/fees/",
// Service area map
servicearea: "https://apis.helena.express/v1/servicearea/",
// Trailer schedule/dates/times/locations
trailerschedule: "https://helena.express/mobile/schedule.json",
// Money order verification
moneyorderverify: "https://apis.helena.express/v1/moneyorder/verify/",
// Label maker
label_rates: "https://apis.helena.express/v1/labelmaker/rates/",
label_purchase: "https://apis.helena.express/v1/labelmaker/purchase/",
postalpoint_locations: "https://apis.helena.express/v1/postalpoint/locations/"
// Physical locations
locations: "https://apis.helena.express/v1/locations/"
},
stripe_pubkey: "pk_test_51J6qFXCa1Fboir5UzPO3LCiMsVNiFP2lq4wR0dEcjJJVzAaJ3uRggDekZPB3qeYpMD3ayIYHKyD5sSn0IFLlEXMW001LqrvGSH",
branding: {

Loading…
Cancel
Save