/ *
* 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 ) ;
}