Advertisement
Guest User

Marmot Cart

a guest
Jun 18th, 2019
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
  1. // Please copy every line of code into the browser during testing. fetchCart() [at the bottom] is the key starter
  2.  
  3. // Parse HTML Response as there was no JSON response.
  4. fetchCart = () => {
  5.   fetch(`api/v1/cart`).then(res => res.text()).then(html => {
  6.     let parser = new DOMParser();
  7.     let doc = parser.parseFromString(html, "text/html");
  8.     return doc
  9.   }).then(parseCart).then(createModal)
  10. }
  11.  
  12. // This is a helper method to count the quantity per item in a user's cart
  13.  
  14. quantityChecker = (products) => {
  15.   let totalQty = 0;
  16.   if (products) {
  17.     for (let i = 0; i < products.length; i++) {
  18.       let qtyInt = parseInt(products[i].getElementsByClassName('mini-cart-pricing')[0].getElementsByClassName('value')[0].innerText)
  19.       totalQty += qtyInt
  20.     }
  21.     return totalQty
  22.   } else {
  23.     return totalQty
  24.   }
  25. }
  26.  
  27. // This function gathers data from the parsed HTML from the fetch and creates a new object
  28.  
  29. parseCart = (cartData) => {
  30.  
  31.   // Products
  32.   let products = cartData.getElementsByClassName('mini-cart-product')
  33.   let subtotal = cartData.getElementsByClassName('order-totals-table')[0].innerHTML
  34.   let quantity = quantityChecker(products)
  35.  
  36.   // Store Every Product
  37.  
  38.   let items = []
  39.  
  40.   // Loop over Products Array to Creat Individual Objects
  41.   if (products) {
  42.     for (let i = 0; i < products.length; i++) {
  43.       let newItem = {
  44.         entireProduct: products[i].innerHTML,
  45.       }
  46.       items.push(newItem)
  47.     }
  48.   } else {
  49.     null
  50.   }
  51.  
  52.   // Cart Data -- Provides Quantity, Total, Logo, and EVERY item.
  53.   const cart = {
  54.     qty: quantity,
  55.     allItems: items,
  56.     total: subtotal,
  57.     logo: cartData.getElementsByClassName('logo-container')[1].innerHTML,
  58.     }
  59.   return cart
  60. }
  61.  
  62. // Modal creation
  63.  
  64. createModal = (cartData) => {
  65.  
  66.   let pageHeight = $(document).height();
  67.   let pageWidth = $(window).width();
  68.  
  69.   // Backdrop div - Obscures the Main page
  70.   let backdropDiv = $('<div id="backdrop"></div>').appendTo('body');
  71.   $(backdropDiv).css({
  72.     'position':'fixed',
  73.     'margin': '0',
  74.     'padding':'0',
  75.     'top':'0',
  76.     'left':'0',
  77.     'background-color':'rgba(0,0,0,0.7)',
  78.     'height':'100%',
  79.     'width':'100%',
  80.     'z-index':'10',
  81.     'display':'none',
  82.   });
  83.  
  84.   // Modal - All Content will be displayed here
  85.   let cartModal = $('<div id="cartModal"></div>').appendTo($(backdropDiv));
  86.   $(cartModal).empty();
  87.  
  88.   $(cartModal).css({
  89.     'background-color':'rgba(255,255,255,1)',
  90.     'position':'absolute',
  91.     'border':'1px',
  92.     'border-style':'solid',
  93.     'border-color': '#1F1F2E',
  94.     'z-index':'50',
  95.     'height':'60%',
  96.     'width':'60%',
  97.     'padding':'50px',
  98.     'left':'25%',
  99.     'top':'10%',
  100.     'overflow':'scroll',
  101.     'display':'none',
  102.   });
  103.  
  104.   // Header - Marmot Logo and Close button to the right
  105.   let boxLogoSpan = $('<span id="box-logo-span"></span>').appendTo(cartModal);
  106.   let boxLogo = $(`${cartData.logo}`).appendTo($(boxLogoSpan));
  107.   boxLogo.css({
  108.     'text-align': 'left',
  109.     'font-family': 'Proxima'
  110.   });
  111.  
  112.   // Close button
  113.   let closeButton = $('<a id="close-button">Close</a>').appendTo($(boxLogoSpan));
  114.   closeButton.css({
  115.     'text-align': 'right',
  116.     'float': 'right',
  117.   });
  118.  
  119.   // Close Cart Functionality
  120.   $('#close-button').click(function() {
  121.     $(backdropDiv).fadeOut("slow");
  122.     toggleCartOff()
  123.   });
  124.  
  125.  
  126.   // Separator
  127.   const separator = document.createElement('hr')
  128.   cartModal.append(separator)
  129.  
  130.   // Cart Info - Items and Pricing Per Item and Quantity of Item
  131.   const cartContainer = document.createElement('div')
  132.   let products = cartData.allItems
  133.   products.forEach(product => {
  134.     let hr = document.createElement('hr')
  135.     let productDiv = document.createElement('div')
  136.     productDiv.id = product.name
  137.  
  138.     let dv = document.createElement('div')
  139.     dv.innerHTML = product.entireProduct
  140.     productDiv.append(dv, hr)
  141.     cartContainer.append(productDiv)
  142.   })
  143.  
  144.   // Total Info - Includes Item count and Pricing
  145.   const total = document.createElement('div')
  146.   total.innerHTML = `<table><tr class="order-subtotal">
  147.     <td>Total Items </td>
  148.     <td>${cartData.qty}</td>
  149.     </tr>
  150.     ${cartData.total}</table>`
  151.  
  152.   // Cart + Checkout Button. This redirects the user to the Checkout/Cart
  153.   const visitCart = document.createElement('div')
  154.   visitCart.innerHTML = `<a href="https://www.marmot.com/cart" id="checkout-btn"><span class="checkout-button cart-button button">Cart</span></a>`
  155.   cartContainer.append(total)
  156.   cartModal.append(cartContainer, visitCart)
  157. }
  158.  
  159. // This function vets the positioning of the scrollbar at all times
  160.  
  161. checkScroll = () => {
  162.   let scroll = $(window).scrollTop(),
  163.                docHeight = $(document).height(),
  164.                windowHeight = $(window).height();
  165.   let scrollPercent = (scroll / (docHeight-windowHeight)) * 100;
  166.   if (scrollPercent > 89) {
  167.     return true;
  168.   }
  169. };
  170.  
  171. // This Event Listener utilizes the checkScroll function to determine when to toggle the modal on
  172. window.addEventListener('scroll', () => {
  173.   if (checkScroll()) {
  174.     toggleCartOn();
  175.   }
  176. });
  177.  
  178. toggleCartOn = () => {
  179.   // Uncomment the below to stop scrolling after cart is toggled on.
  180.   // $('body').css({'overflow':'hidden'})
  181.   $('#backdrop').css({'display':'inline'})
  182.   $('#cartModal').css({'display':'inline'})
  183. };
  184.  
  185. toggleCartOff = () => {
  186.   // Uncomment the below to start scrolling after cart is toggled off.
  187.   // $('body').css({'overflow':'scroll'})
  188.   $('#backdrop').css({'display':'none'})
  189.   $('#cartModal').css({'display':'none'})
  190. };
  191.  
  192. // Run the below function to start
  193. fetchCart()
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement