Advertisement
Guest User

Untitled

a guest
Mar 20th, 2019
61
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.07 KB | None | 0 0
  1. import {Power3, TweenMax} from 'gsap/TweenMax';
  2. import $ from 'jquery';
  3. import {formatMoney} from '@shopify/theme-currency/currency';
  4.  
  5. export default class AjaxCart {
  6.  
  7. constructor() {
  8.  
  9. this.defaults = {
  10. cartModal: '.js-ajax-cart-modal',
  11. cartModalClose: '.js-ajax-cart-modal-close',
  12. cartDrawer: '.js-ajax-cart-drawer',
  13. cartDrawerContent: '.js-ajax-cart-drawer-content',
  14. cartDrawerClose: '.js-ajax-cart-drawer-close',
  15. cartDrawerTrigger: '.js-ajax-cart-drawer-trigger',
  16. cartOverlay: '.js-ajax-cart-overlay',
  17. cartCounter: '.js-ajax-cart-counter',
  18. addToCart: '.js-ajax-add-to-cart',
  19. removeFromCart: '.js-ajax-remove-from-cart',
  20. removeFromCartNoDot: 'js-ajax-remove-from-cart',
  21. checkoutButton: '.js-ajax-checkout-button',
  22. bodyClass: 'is-overlay-opened',
  23. };
  24.  
  25. this.cartModal = document.querySelector(this.defaults.cartModal);
  26. this.cartModalClose = document.querySelector(this.defaults.cartModalClose);
  27. this.cartDrawer = document.querySelector(this.defaults.cartDrawer);
  28. this.cartDrawerContent = document.querySelector(this.defaults.cartDrawerContent);
  29. this.cartDrawerClose = document.querySelector(this.defaults.cartDrawerClose);
  30. this.cartDrawerTrigger = document.querySelector(this.defaults.cartDrawerTrigger);
  31. this.cartOverlay = document.querySelector(this.defaults.cartOverlay);
  32. this.cartCounter = document.querySelector(this.defaults.cartCounter);
  33. this.addToCart = document.querySelectorAll(this.defaults.addToCart);
  34. this.checkoutButton = document.querySelector(this.defaults.checkoutButton);
  35. this.htmlSelector = document.documentElement;
  36.  
  37. this.fetchCart();
  38.  
  39. this.addToCart.forEach((item) => {
  40. item.addEventListener('click', (event) => {
  41. event.preventDefault();
  42. const formID = item.parentNode.getAttribute('id');
  43. this.addProductToCart(formID);
  44. });
  45. });
  46.  
  47. this.cartOverlay.addEventListener('click', () => {
  48. this.closeFailModal();
  49. this.closeCartDrawer();
  50. this.closeCartOverlay();
  51. });
  52.  
  53. this.cartDrawerClose.addEventListener('click', () => {
  54. this.closeCartDrawer();
  55. this.closeCartOverlay();
  56. });
  57.  
  58. this.cartDrawerTrigger.addEventListener('click', (event) => {
  59. event.preventDefault();
  60. this.openCartDrawer();
  61. this.openCartOverlay();
  62. });
  63.  
  64. this.cartModalClose.addEventListener('click', () => {
  65. this.closeFailModal();
  66. this.closeCartDrawer();
  67. this.closeCartOverlay();
  68. });
  69.  
  70. }
  71.  
  72. fetchCart(callback) {
  73. $.ajax({
  74. type: 'GET',
  75. url: '/cart.js',
  76. dataType: 'json',
  77. })
  78. .done((cart) => {
  79. this.currentCartItemNumber(cart);
  80. if (cart.item_count === 0) {
  81. this.renderBlankCart();
  82. this.checkoutButton.classList.add('is-hidden');
  83. } else {
  84. this.renderCart(cart);
  85. this.checkoutButton.classList.remove('is-hidden');
  86. if (typeof callback === 'function') {
  87. callback();
  88. }
  89. }
  90. })
  91. .fail(() => {
  92. this.ajaxRequestFail();
  93. });
  94. }
  95.  
  96. addProductToCart(formID, callback) {
  97. $.ajax({
  98. type: 'POST',
  99. url: '/cart/add.js',
  100. dataType: 'json',
  101. data: $(`#${formID}`)
  102. .serialize(),
  103. })
  104. .done((cart) => {
  105. if ((typeof callback) === 'function') {
  106. callback(cart);
  107. } else {
  108. this.addToCartOk();
  109. }
  110. })
  111. .fail(() => {
  112. this.ajaxRequestFail();
  113. });
  114. }
  115.  
  116. changeItem(line, callback) {
  117. const quantity = 0;
  118. $.ajax({
  119. type: 'POST',
  120. url: '/cart/change.js',
  121. data: `quantity=${quantity}&line=${line}`,
  122. dataType: 'json',
  123. })
  124. .done((cart) => {
  125.  
  126. if ((typeof callback) === 'function') {
  127. callback(cart);
  128. } else {
  129. this.fetchCart();
  130. }
  131.  
  132. })
  133. .fail(() => {
  134. this.ajaxRequestFail();
  135. });
  136. }
  137.  
  138. currentCartItemNumber(cart) {
  139. this.cartCounter.innerHTML = cart.item_count;
  140. }
  141.  
  142. addToCartOk() {
  143. this.fetchAndOpenCart();
  144. }
  145.  
  146. fetchAndOpenCart() {
  147. this.fetchCart(() => {
  148. this.openCartDrawer();
  149. this.openCartOverlay();
  150. });
  151. }
  152.  
  153. ajaxRequestFail() {
  154. this.openFailModal();
  155. this.openCartOverlay();
  156. }
  157.  
  158. renderCart(cart) {
  159. this.clearCartDrawer();
  160. cart.items.forEach((item, index) => {
  161. const productTitle = `<a href="${item.url}" class="ajax-cart-item__title u-b2 link--underline">${item.product_title}</a>`;
  162. const productVariant = `<div class="ajax-cart-item__variant u-b2">${item.variant_title}</div>`;
  163. const productImage = `<div class="ajax-cart-item__image" style="background-image: url(${item.image});"></div>`;
  164. const productPrice = `<div class="ajax-cart-item__price u-b2 u-b2--medium">${formatMoney(item.line_price)}</div>`;
  165. const productQuantity = `<div class="ajax-cart-item__quantity u-b2">Quantity: ${item.quantity}</div>`;
  166. const productRemove = `<a class="ajax-cart-item__remove u-b2 link--underline ${this.defaults.removeFromCartNoDot}">Remove</a>`;
  167. const concatProductInfo = `<div class="ajax-cart-item__single" data-line="${Number(index + 1)}"><div class="ajax-cart-item__info-wrapper">${productImage}<div class="ajax-cart-item__info">${productTitle}${productVariant}${productQuantity}</div></div>${productPrice}${productRemove}</div>`;
  168. this.cartDrawerContent.innerHTML += concatProductInfo;
  169. });
  170. const cartSubTotal = `<div class="ajax-cart-drawer__subtotal"><span class="u-b2 u-b2--medium">Subtotal: </span><span class="ajax-cart-drawer__subtotal-price u-b2 u-b2--medium">${formatMoney(cart.total_price)}</span></div>`;
  171. this.cartDrawerContent.innerHTML += cartSubTotal;
  172. const removeFromCart = document.querySelectorAll(this.defaults.removeFromCart);
  173. removeFromCart.forEach((item) => {
  174. item.addEventListener('click', () => {
  175. const line = item.parentNode.getAttribute('data-line');
  176. this.changeItem(line);
  177. });
  178. });
  179. }
  180.  
  181. renderBlankCart() {
  182. this.clearCartDrawer();
  183. this.cartDrawerContent.innerHTML = '<div class="ajax-cart__empty u-a7 u-uppercase">Your Cart is currenty empty!</div>';
  184. }
  185.  
  186. openCartDrawer() {
  187. TweenMax.to(this.cartDrawer, 0.5, {
  188. x: -480,
  189. ease: Power3.easeInOut,
  190. });
  191. }
  192.  
  193. closeCartDrawer() {
  194. TweenMax.to(this.cartDrawer, 0.5, {
  195. x: 0,
  196. ease: Power3.easeInOut,
  197. });
  198. }
  199.  
  200. clearCartDrawer() {
  201. this.cartDrawerContent.innerHTML = '';
  202. }
  203.  
  204. openFailModal() {
  205. TweenMax.to(this.cartModal, 0.4, {
  206. autoAlpha: 1,
  207. ease: Power3.easeOut,
  208. });
  209. }
  210.  
  211. closeFailModal() {
  212. TweenMax.to(this.cartModal, 0.2, {
  213. autoAlpha: 0,
  214. ease: Power3.easeOut,
  215. });
  216. }
  217.  
  218. openCartOverlay() {
  219. this.htmlSelector.classList.add(this.defaults.bodyClass);
  220. TweenMax.to(this.cartOverlay, 0.5, {
  221. autoAlpha: 1,
  222. ease: Power3.easeInOut,
  223. });
  224. }
  225.  
  226. closeCartOverlay() {
  227. this.htmlSelector.classList.remove(this.defaults.bodyClass);
  228. TweenMax.to(this.cartOverlay, 0.5, {
  229. autoAlpha: 0,
  230. ease: Power3.easeInOut,
  231. });
  232. }
  233.  
  234. }
  235.  
  236. // tipovi ajax carta (mini cart, lijevi i desni drawer, popup, quantity change in cart)
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement