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.
225 lines
7.4 KiB
JavaScript
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);
|
|
} |