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

225 lines
7.4 KiB
JavaScript

/*
* This Source Code Form is subject to the terms of the Mozilla Public
* License, v. 2.0. If a copy of the MPL was not distributed with this
* file, You can obtain one at http://mozilla.org/MPL/2.0/.
*/
var shopitems = [];
var shopitems_flattened = [];
var samedaydeliveryfee = 10.0;
function loadShopPage( {resolve, reject}) {
app.dialog.preloader("Opening the shop...");
apirequest(SETTINGS.apis.shopitems, [], function (resp) {
app.dialog.close();
shopitems = resp.items;
samedaydeliveryfee = resp.samedaydeliveryfee;
for (var cat in shopitems) {
for (var i in shopitems[cat]["items"]) {
shopitems_flattened[i] = shopitems[cat]["items"][i];
}
}
resolve({
content: compiledPages.shop({
items: shopitems
})
}, {});
}, function (error) {
app.dialog.close();
app.dialog.alert("Couldn't open the shop right now. Try again later.", "Whoops!");
sendErrorReport("Shop", "Opening shop");
reject();
});
}
$("body").on("card:opened", ".shop-item-card", function () {
app.swiper.destroy("#swiper-" + $(this).data("sku"));
app.swiper.create("#swiper-" + $(this).data("sku"), {
pagination: {
el: "#swiper-pagination-" + $(this).data("sku"),
type: "bullets"
}
});
});
var shoppingcart = {};
if (inStorage("shoppingcart")) {
shoppingcart = JSON.parse(getStorage("shoppingcart"));
}
function addToCart(sku, qty) {
if (typeof qty == 'undefined') {
qty = 1;
}
if (shoppingcart[sku]) {
shoppingcart[sku] += qty;
} else {
shoppingcart[sku] = qty;
}
app.toast.show({
icon: "<i class='far fa-cart-plus fa-2x'></i>",
text: "Added to cart!",
position: "center",
horizontalPosition: "center",
closeTimeout: 2000,
destroyOnClose: true
});
updateCart();
sendActionReport("Shop", "Add to cart", sku + ", " + qty);
}
function removeFromCart(sku, qty) {
// If no qty set, delete them all
if (typeof qty == "undefined") {
qty = 99999;
}
if (shoppingcart[sku]) {
shoppingcart[sku] -= qty;
}
if (shoppingcart[sku] <= 0) {
delete shoppingcart[sku];
}
updateCart();
sendActionReport("Shop", "Remove from cart", sku + ", " + qty);
}
function emptyShoppingCart() {
shoppingcart = {};
updateCart();
}
function updateCart() {
setStorage("shoppingcart", JSON.stringify(shoppingcart));
var totalitems = 0;
for (var sku in shoppingcart) {
totalitems += shoppingcart[sku];
}
$("#shopping-cart-items-chip-label").text(totalitems + "");
var cartitems = [];
for (var sku in shoppingcart) {
var item = shopitems_flattened[sku];
item.qty = shoppingcart[sku];
item.linetotal = (item.qty * item.price).toFixed(2);
cartitems.push(item);
}
$("#shoppingCartContainer").html(compiledPages.shoppingcart_fragment({
cartitems: cartitems
}));
}
function openShopCheckout() {
// Check if order is mailable or not by checking each item for mailability
// Also check if all items are still in stock (cart could have sat around a while)
var ordermailable = true;
var orderinstock = true;
var ordertotal = 0.0;
var outofstockitems = [];
for (var sku in shoppingcart) {
if (shopitems_flattened[sku].mailable != true) {
ordermailable = false;
}
if (shopitems_flattened[sku].instock != true) {
orderinstock = false;
outofstockitems.push(shopitems_flattened[sku].name);
}
ordertotal += (shopitems_flattened[sku].price * shoppingcart[sku]);
}
if (!orderinstock) {
if (outofstockitems.length == 1) {
app.dialog.alert("The following item is out of stock. Remove it from your cart to complete your order.<br><br>" + outofstockitems[0], "Out of Stock!");
} else {
app.dialog.alert("The following items in your cart are out of stock. Remove them from your cart to complete your order.<br><br>" + outofstockitems.join("<br>"), "Out of Stock!");
}
return;
}
if (ordermailable) {
app.dialog.create({
title: 'Checkout',
text: "Your order can be either mailed to you (1-5 days) or delivered same-day. Either way, it will be sent to your account's address. Your saved payment method will be charged for $" + ordertotal.toFixed(2) + " plus any delivery fee when your order ships.",
buttons: [
{
text: 'Mail (free)'
},
{
text: 'Same-day delivery ($' + samedaydeliveryfee.toFixed(2) + ')'
},
{
text: 'Cancel Checkout',
color: "red"
}
],
verticalButtons: true,
onClick: function (dialog, index) {
switch (index) {
case 0:
placeOrder("mail", ordertotal);
break;
case 1:
placeOrder("courier", ordertotal + samedaydeliveryfee);
break;
}
}
}).open();
} else {
app.dialog.create({
title: 'Checkout',
text: "Your order will be delivered to your account's address. Your saved payment method will be charged for $" + (ordertotal + samedaydeliveryfee).toFixed(2) + " (including delivery fee) when your order ships.",
buttons: [
{
text: 'Confirm Order'
},
{
text: 'Cancel Checkout',
color: "red"
}
],
verticalButtons: true,
onClick: function (dialog, index) {
switch (index) {
case 0:
placeOrder("courier", ordertotal + samedaydeliveryfee);
break;
case 1:
break;
}
}
}).open();
}
}
function placeOrder(deliverymethod, ordertotal) {
app.dialog.preloader("Placing order...");
apirequest(SETTINGS.apis.shopbuy, {
cart: JSON.stringify(shoppingcart),
shipmethod: deliverymethod,
total: (ordertotal * 1.0).toFixed(2),
accountnumber: getStorage("accountnumber"),
accountkey: getStorage("accountkey")
}, function (resp) {
app.dialog.close();
if (resp.status == "ERROR") {
app.dialog.alert(resp.msg, "Error");
sendErrorReport("Shop", "Order not placed", "Server error: " + resp.msg);
return;
} else {
emptyShoppingCart();
app.dialog.alert("Your order has been received.", "Order placed!");
app.popup.close();
sendActionReport("Shop", "Order placed", "$" + (ordertotal * 1.0).toFixed(2));
return;
}
}, function (xhr, status, error) {
app.dialog.close();
app.dialog.alert("Your order might not have gone through due to a network error. If you don't get a confirmation email, try again.", "Whoops!");
sendErrorReport("Shop", "Order not placed", "Server/network problem: " + xhr.status + ": " + xhr.statusText);
})
console.log(deliverymethod);
console.log(shoppingcart);
}