Advertisement
Guest User

Untitled

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