Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

update cart example #57

Merged
merged 1 commit into from
Mar 30, 2016
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Jump to
Jump to file
Failed to load files.
Diff view
Diff view
8 changes: 8 additions & 0 deletions examples/cart/index.html
Original file line number Diff line number Diff line change
Expand Up @@ -61,6 +61,14 @@ <h2 class="cart-title">Your cart</h2>
<!-- .cart end -->


<!-- .cart-tab start -->
<button class="btn btn--cart-tab">
<span class="btn__counter"></span>
<svg xmlns="http://www.w3.org/2000/svg" class="icon-cart icon-cart--side" viewBox="0 0 25 25" enable-background="new 0 0 25 25"><g fill="#fff"><path d="M24.6 3.6c-.3-.4-.8-.6-1.3-.6h-18.4l-.1-.5c-.3-1.5-1.7-1.5-2.5-1.5h-1.3c-.6 0-1 .4-1 1s.4 1 1 1h1.8l3 13.6c.2 1.2 1.3 2.4 2.5 2.4h12.7c.6 0 1-.4 1-1s-.4-1-1-1h-12.7c-.2 0-.5-.4-.6-.8l-.2-1.2h12.6c1.3 0 2.3-1.4 2.5-2.4l2.4-7.4v-.2c.1-.5-.1-1-.4-1.4zm-4 8.5v.2c-.1.3-.4.8-.5.8h-13l-1.8-8.1h17.6l-2.3 7.1z"></path><circle cx="9" cy="22" r="2"></circle><circle cx="19" cy="22" r="2"></circle></g></svg>
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Should this live in its own file maybe? Keep large blobs out of the index?

I don't feel strongly either way.

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

It's such a small example that I think we should keep it all in the same place. Keeps the example as straight forward as possible

Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

👍

</button>
<!-- .cart-tab end -->


<script id="cart-item-template" type="text/template">
<div class="cart-item">
<div class="cart-item__img"></div>
Expand Down
145 changes: 100 additions & 45 deletions examples/cart/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -9,11 +9,23 @@ $(function() {
});

var cart;
client.createCart().then(function (newCart) {
cart = newCart;
});
var cartLineItemCount;
if(localStorage.getItem('lastCartId')) {
client.fetchCart(localStorage.getItem('lastCartId')).then(function(remoteCart) {
cart = remoteCart;
cartLineItemCount = cart.lineItems.length;
renderCartItems();
});
} else {
client.createCart().then(function (newCart) {
cart = newCart;
localStorage.setItem('lastCartId', cart.id);
cartLineItemCount = 0;
});
}



var lineItemImages = {};

/* Fetch product and init
============================================================ */
Expand All @@ -36,6 +48,12 @@ $(function() {
attachQuantityIncrementListeners(product);
attachQuantityDecrementListeners(product);

updateCartTabButton();

attachCheckoutButtonListeners();

closeCart();

});

/* Generate DOM elements for variant selectors
Expand Down Expand Up @@ -99,42 +117,40 @@ $(function() {
function attachBuyButtonListeners(product) {
$('.buy-button').on('click', function (event) {
event.preventDefault();
var image = product.selectedVariantImage;
var id = product.selectedVariant.id;
lineItemImages[id] = image.src;
addVariantToCart(product, product.selectedVariant, 1);
addVariantToCart(product.selectedVariant, 1);
});
}

/* Increase product variant quantity in cart
============================================================ */
function attachQuantityIncrementListeners(product) {
$('.cart').on('click', '.quantity-increment', function() {
var variantId = parseInt($(this).attr('data-variant-id'));
var variantId = parseInt($(this).attr('data-variant-id'), 10);
var variant = product.variants.filter(function (variant) {
return (variant.id === variantId);
})[0];

$(this).closest('.cart-item').addClass('js-working');
$(this).attr('disabled', 'disabled');

addVariantToCart(product, variant, 1);
addVariantToCart(variant, 1);
});
}

/* Decrease product variant quantity in cart
============================================================ */
function attachQuantityDecrementListeners(product) {
$('.cart').on('click', '.quantity-decrement', function() {
var variantId = parseInt($(this).attr('data-variant-id'));
var variantId = parseInt($(this).attr('data-variant-id'), 10);
var variant = product.variants.filter(function (variant) {
return (variant.id === variantId);
})[0];

$(this).closest('.cart-item').addClass('js-working');
$(this).attr('disabled', 'disabled');

addVariantToCart(product, variant, -1);
addVariantToCart(variant, -1);
});
}

Expand All @@ -151,48 +167,59 @@ $(function() {
$('.cart').removeClass('js-active');
});
}
closeCart();


/* Add 'quantity' amount of product 'variant' to cart
============================================================ */
function addVariantToCart(product, variant, quantity) {
function addVariantToCart(variant, quantity) {
openCart();

cart.addVariants({ variant: variant, quantity: quantity }).then(function () {
var $cartItemContainer = $('.cart-item-container');
var totalPrice = 0;

$cartItemContainer.empty();
var lineItemEmptyTemplate = $('#cart-item-template').html();
var $cartLineItems = cart.lineItems.map(function (lineItem, index) {
var $lineItemTemplate = $(lineItemEmptyTemplate);
var itemImage = lineItem.image.src;
$lineItemTemplate.find('.cart-item__img').css('background-image', 'url(' + itemImage + ')');
$lineItemTemplate.find('.cart-item__title').text(lineItem.title);
$lineItemTemplate.find('.cart-item__variant-title').text(lineItem.variant_title);
$lineItemTemplate.find('.cart-item__price').text(formatAsMoney(lineItem.line_price));
$lineItemTemplate.find('.cart-item__quantity').attr('value', lineItem.quantity);
$lineItemTemplate.find('.quantity-decrement').attr('data-variant-id', lineItem.variant_id);
$lineItemTemplate.find('.quantity-increment').attr('data-variant-id', lineItem.variant_id);

if (index === cart.lineItems.length - 1) {
$lineItemTemplate.addClass('js-hidden');
}
return $lineItemTemplate;
});
$cartItemContainer.append($cartLineItems);

setTimeout(function () {
$cartItemContainer.find('.js-hidden').removeClass('js-hidden');
}, 0)

$('.cart .pricing').text(formatAsMoney(cart.subtotal));

cart.addVariants({ variant: variant, quantity: quantity }).then(function() {
renderCartItems();
}).catch(function (errors) {
console.log("Fail");
console.log(errors);
console.log('Fail');
console.error(errors);
});

updateCartTabButton();
}

/* Render the line items currently in the cart */
function renderCartItems() {
var $cartItemContainer = $('.cart-item-container');
var totalPrice = 0;

$cartItemContainer.empty();
var lineItemEmptyTemplate = $('#cart-item-template').html();
var $cartLineItems = cart.lineItems.map(function (lineItem, index) {
var $lineItemTemplate = $(lineItemEmptyTemplate);
var itemImage = lineItem.image.src;
$lineItemTemplate.find('.cart-item__img').css('background-image', 'url(' + itemImage + ')');

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

are you avoiding using a templating system here for any reason?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Just trying to keep the example as simple and small as possible. The focus of the example is meant to be the interactions with the SDK, so I didn't want to add in anything fancy with templating. I'm open to hearing other options though - whatever makes the example as simple and digestible as possible.

@richgilbank thoughts?

Copy link
Contributor Author

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

just chatted with tyler in person - verdict was that it makes sense to not add an additional dependency for an example.

$lineItemTemplate.find('.cart-item__title').text(lineItem.title);
$lineItemTemplate.find('.cart-item__variant-title').text(lineItem.variant_title);
$lineItemTemplate.find('.cart-item__price').text(formatAsMoney(lineItem.line_price));
$lineItemTemplate.find('.cart-item__quantity').attr('value', lineItem.quantity);
$lineItemTemplate.find('.quantity-decrement').attr('data-variant-id', lineItem.variant_id);
$lineItemTemplate.find('.quantity-increment').attr('data-variant-id', lineItem.variant_id);

if (cartLineItemCount < cart.lineItems.length && (index === cart.lineItems.length - 1)) {
$lineItemTemplate.addClass('js-hidden');
cartLineItemCount = cart.lineItems.length;
}

if (cartLineItemCount > cart.lineItems.length) {
cartLineItemCount = cart.lineItems.length;
}

return $lineItemTemplate;
});
$cartItemContainer.append($cartLineItems);

setTimeout(function () {
$cartItemContainer.find('.js-hidden').removeClass('js-hidden');
}, 0)

$('.cart .pricing').text(formatAsMoney(cart.subtotal));
}

/* Format amount as currency
Expand All @@ -201,4 +228,32 @@ $(function() {
return '$' + parseFloat(amount, 10).toFixed(2).replace(/(\d)(?=(\d{3})+\.)/g, "$1,").toString();
}


/* Checkout listener
============================================================ */
function attachCheckoutButtonListeners() {
$('.btn--cart-checkout').on('click', function () {
window.open(cart.checkoutUrl, '_self');
});
}

/* Update cart tab button
============================================================ */
function updateCartTabButton() {
if (cart.lineItems.length > 0) {
var totalItems = cart.lineItems.reduce(function(total, item) {
return total + item.quantity;
}, 0);
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Made a note to move this work to the cart: #51

$('.btn--cart-tab .btn__counter').html(totalItems);
$('.btn--cart-tab').addClass('js-active');
} else {
$('.btn--cart-tab').removeClass('js-active');
$('.cart').removeClass('js-active');
}

$('.btn--cart-tab').click(function() {
openCart();
});
}

});
31 changes: 31 additions & 0 deletions examples/cart/styles/_buttons.scss
Original file line number Diff line number Diff line change
Expand Up @@ -30,3 +30,34 @@
left: 50%;
transform: translate(-50%);
}


.btn--cart-tab {
padding: 5px 11px;
border-radius: 3px 0 0 3px;
position: fixed;
right: 0;
top: 50%;
transform: translate(100%, -50%);
opacity: 0;
min-width: inherit;
width: auto;
height: auto;
z-index: 2;

&.js-active {
transform: translateY(-50%);
opacity: 1;
}
}

.btn__counter {
display: block;
margin: 0 auto 10px auto;
font-size: 18px;
}

.icon-cart--side {
height: 20px;
width: 20px;
}
1 change: 1 addition & 0 deletions examples/cart/styles/_cart.scss
Original file line number Diff line number Diff line change
Expand Up @@ -5,6 +5,7 @@
height: 100%;
right: 0;
top: 0;
z-index: 3;
background: white;
border-radius: 1px;
box-shadow: 0 0 0 rgba(0, 0, 0, 0.1);
Expand Down