ctrl-alt-del-world/midway

View on GitHub
web/src/components/cartDrawer.tsx

Summary

Maintainability
A
3 hrs
Test Coverage
import React from 'react'
import { Link } from 'gatsby'
import cx from 'classnames'

import { Cart } from 'src/components/cart'
import { useStore, useToggleCart, useCartTotals, useCartItems, useCheckout } from 'src/context/siteContext'

import {
  Close
} from 'src/components/svgs'

/*
/    Cart Drawer: This module is a bit more robust then other parts of the theme,
/    this is because carts are relatively difficult to execute, scale to mobile etc,
/    feel free to keep more of this styling if you use this component, the structure 
/    a bit confusing to make sure all elements are visible/scrollable on mobile
*/

export const CartDrawer = () => {
  const lineItems = useCartItems()
  const { cartIsOpen } = useStore()
  const { total } = useCartTotals()
  const toggleCart = useToggleCart()
  const openCheckout = useCheckout()
  const trap = cartIsOpen ? (
    <React.Fragment>
      <div className='cart__drawer-inner'>
        <div className='ac rel cart__drawer-header df aic jcc'>
          <button type='reset' className='pa button--none bg--transparent cart__drawer-close close left cb' onClick={() => toggleCart()}>
            <Close className='db m1' />
          </button>
          <h4 className='s26 medium'>Cart</h4>
        </div>
        <div className='bg--off-white cart__drawer-shipping df jcc aic tc'>
          <div className='x ac'>
            <div className='cart__drawer-progress x pr'>
              <span className='block pa bg--black left y' style={{ 'width': `${((parseFloat(total)).toFixed(2) / 40) * 100}%` }} />
            </div>
            {lineItems.length > 0 && (
              <>
                {parseInt(total, 0) <= 40 ? (
                  <div className='s12 p1'>You're <span className=''>${(40 - (parseFloat(total))).toFixed(2)}</span> away from free shipping!</div>
                ) : (
                  <div className='s12 p1'>Your order qualifies for <span className='bold'>Free Shipping!</span></div>
                )}
              </>
            )}
          </div>
        </div>
        <Cart />
      </div>
      <div className={cx('bg--white cart__drawer-buttons', parseInt(total, 0) >= 40 && 'free', lineItems.length >= 1 && 'visible')}>
        <div className='f fw bcw  left ac cart__drawer-bottom pa bottom x jcc aic rel x'>
          <div className='x p2 jcb'>
            {lineItems.length > 0 && (
              <div className='py1 cart__drawer-sub medium'>
                <div className='x df jcb aic py18 px1 bcw'>
                  <span className='s18'>Subtotal</span>
                  <span className='s18 mono'>${total}</span>
                </div>
              </div>
            )}
          </div>
          {lineItems.length < 1 ? (
              <Link className='button button--lg p3 bold s16 dib tc color--white bg--black medium x'  onClick={() => toggleCart()} to='/'>Continue Shopping</Link>
          ): (
            <button onClick={openCheckout} type='submit' className='button bn bt p2 medium bg--black color--black s16 x'>
              <span className='color--white'>Checkout</span>
            </button>
          )}
        </div>
      </div>
    </React.Fragment>
  ) : (
    false
  )
  return (
    <>
      <div
        className={cx('cart__drawer bg--white aist z10 right top x pf', cartIsOpen && 'is-open')}
        id='container'
      >
      {trap}
      </div>
      {/* Handles the overlay to click-close the cart */}
      <div onClick={() => toggleCart()} className={cx('cart__drawer-bg bg--white z9 left top x y pf', cartIsOpen && 'is-open')} />
    </>
  )
}