From d178a520534af7d1cbcc03134034ad8a2327b461 Mon Sep 17 00:00:00 2001
From: Rafi Zadanly <zadanlyr@gmail.com>
Date: Mon, 20 Mar 2023 17:14:16 +0700
Subject: product detail and cart header

---
 src/lib/cart/components/Cart.jsx | 316 ++++++++++++++++++++-------------------
 1 file changed, 164 insertions(+), 152 deletions(-)

(limited to 'src/lib/cart/components/Cart.jsx')

diff --git a/src/lib/cart/components/Cart.jsx b/src/lib/cart/components/Cart.jsx
index 962ef860..b48b41fc 100644
--- a/src/lib/cart/components/Cart.jsx
+++ b/src/lib/cart/components/Cart.jsx
@@ -11,6 +11,8 @@ import BottomPopup from '@/core/components/elements/Popup/BottomPopup'
 import { toast } from 'react-hot-toast'
 import Spinner from '@/core/components/elements/Spinner/Spinner'
 import Alert from '@/core/components/elements/Alert/Alert'
+import MobileView from '@/core/components/views/MobileView'
+import DesktopView from '@/core/components/views/DesktopView'
 
 const Cart = () => {
   const router = useRouter()
@@ -115,174 +117,184 @@ const Cart = () => {
   }
 
   return (
-    <div className='pt-4'>
-      <div className='flex justify-between mb-4 px-4'>
-        <h1 className='font-semibold'>Daftar Produk Belanja</h1>
-        <Link href='/'>Cari Produk Lain</Link>
-      </div>
-
-      <div className='flex flex-col gap-y-4 h-screen'>
-        {cart.isLoading && (
-          <div className='flex justify-center my-4'>
-            <Spinner className='w-6 text-gray_r-12/50 fill-gray_r-12' />
+    <>
+      <MobileView>
+        <div className='pt-4'>
+          <div className='flex justify-between mb-4 px-4'>
+            <h1 className='font-semibold'>Daftar Produk Belanja</h1>
+            <Link href='/'>Cari Produk Lain</Link>
           </div>
-        )}
 
-        {!cart.isLoading && (!products || products?.length == 0) && (
-          <div className='px-4'>
-            <Alert
-              className='text-center my-2'
-              type='info'
-            >
-              Keranjang belanja anda masih kosong
-            </Alert>
-          </div>
-        )}
+          <div className='flex flex-col gap-y-4 h-screen'>
+            {cart.isLoading && (
+              <div className='flex justify-center my-4'>
+                <Spinner className='w-6 text-gray_r-12/50 fill-gray_r-12' />
+              </div>
+            )}
 
-        {products?.map((product) => (
-          <div
-            key={product?.id}
-            className='flex mx-4'
-          >
-            <button
-              type='button'
-              className='flex items-center mr-2'
-              onClick={() => toggleSelected(product.id)}
-            >
-              {!product?.selected && <div className='w-5 h-5 border border-gray_r-11 rounded' />}
-              {product?.selected && <CheckIcon className='border bg-red_r-10 w-5 text-white' />}
-            </button>
-            <Link
-              href={createSlug('/shop/product/', product?.parent.name, product?.parent.id)}
-              className='w-[30%] flex-shrink-0'
-            >
-              <Image
-                src={product?.parent?.image}
-                alt={product?.name}
-                className='object-contain object-center border border-gray_r-6 h-40 w-full rounded-md'
-              />
-            </Link>
-            <div className='flex-1 px-2 text-caption-2'>
-              <Link
-                href={createSlug('/shop/product/', product?.parent.name, product?.parent.id)}
-                className='line-clamp-2 leading-6 !text-gray_r-12 font-normal'
-              >
-                {product?.parent?.name}
-              </Link>
-              <div className='text-gray_r-11 mt-1'>
-                {product?.code}{' '}
-                {product?.attributes.length > 0 ? `| ${product?.attributes.join(', ')}` : ''}
+            {!cart.isLoading && (!products || products?.length == 0) && (
+              <div className='px-4'>
+                <Alert className='text-center my-2' type='info'>
+                  Keranjang belanja anda masih kosong
+                </Alert>
               </div>
-              {product?.price?.discountPercentage > 0 && (
-                <div className='flex gap-x-1 items-center mt-3'>
-                  <div className='text-gray_r-11 line-through text-caption-2'>
-                    {currencyFormat(product?.price?.price)}
+            )}
+
+            {products?.map((product) => (
+              <div key={product?.id} className='flex mx-4'>
+                <button
+                  type='button'
+                  className='flex items-center mr-2'
+                  onClick={() => toggleSelected(product.id)}
+                >
+                  {!product?.selected && (
+                    <div className='w-5 h-5 border border-gray_r-11 rounded' />
+                  )}
+                  {product?.selected && <CheckIcon className='border bg-red_r-10 w-5 text-white' />}
+                </button>
+                <Link
+                  href={createSlug('/shop/product/', product?.parent.name, product?.parent.id)}
+                  className='w-[30%] flex-shrink-0'
+                >
+                  <Image
+                    src={product?.parent?.image}
+                    alt={product?.name}
+                    className='object-contain object-center border border-gray_r-6 h-40 w-full rounded-md'
+                  />
+                </Link>
+                <div className='flex-1 px-2 text-caption-2'>
+                  <Link
+                    href={createSlug('/shop/product/', product?.parent.name, product?.parent.id)}
+                    className='line-clamp-2 leading-6 !text-gray_r-12 font-normal'
+                  >
+                    {product?.parent?.name}
+                  </Link>
+                  <div className='text-gray_r-11 mt-1'>
+                    {product?.code}{' '}
+                    {product?.attributes.length > 0 ? `| ${product?.attributes.join(', ')}` : ''}
+                  </div>
+                  {product?.price?.discountPercentage > 0 && (
+                    <div className='flex gap-x-1 items-center mt-3'>
+                      <div className='text-gray_r-11 line-through text-caption-2'>
+                        {currencyFormat(product?.price?.price)}
+                      </div>
+                      <div className='badge-solid-red'>{product?.price?.discountPercentage}%</div>
+                    </div>
+                  )}
+                  <div className='font-normal mt-1'>
+                    {currencyFormat(product?.price?.priceDiscount)}
+                  </div>
+                  <div className='flex justify-between items-center mt-1'>
+                    <div className='text-red_r-11 font-medium'>
+                      {currencyFormat(product?.price?.priceDiscount * product?.quantity)}
+                    </div>
+                    <div className='flex gap-x-1'>
+                      <button
+                        type='button'
+                        className='btn-light px-2 py-1'
+                        onClick={() => updateQuantity(1, product?.id, 'MINUS')}
+                        disabled={product?.quantity == 1}
+                      >
+                        -
+                      </button>
+                      <input
+                        className='form-input w-6 border-0 border-b rounded-none py-1 px-0 text-center'
+                        type='number'
+                        value={product?.quantity}
+                        onChange={(e) => updateQuantity(e.target.value, product?.id)}
+                        onBlur={(e) => updateQuantity(e.target.value, product?.id, 'BLUR')}
+                      />
+                      <button
+                        type='button'
+                        className='btn-light px-2 py-1'
+                        onClick={() => updateQuantity(1, product?.id, 'PLUS')}
+                      >
+                        +
+                      </button>
+                      <button
+                        className='btn-red p-1 ml-1'
+                        onClick={() => setDeleteConfirmation(product)}
+                      >
+                        <TrashIcon className='w-4' />
+                      </button>
+                    </div>
                   </div>
-                  <div className='badge-solid-red'>{product?.price?.discountPercentage}%</div>
                 </div>
-              )}
-              <div className='font-normal mt-1'>
-                {currencyFormat(product?.price?.priceDiscount)}
               </div>
-              <div className='flex justify-between items-center mt-1'>
-                <div className='text-red_r-11 font-medium'>
-                  {currencyFormat(product?.price?.priceDiscount * product?.quantity)}
-                </div>
-                <div className='flex gap-x-1'>
-                  <button
-                    type='button'
-                    className='btn-light px-2 py-1'
-                    onClick={() => updateQuantity(1, product?.id, 'MINUS')}
-                    disabled={product?.quantity == 1}
-                  >
-                    -
-                  </button>
-                  <input
-                    className='form-input w-6 border-0 border-b rounded-none py-1 px-0 text-center'
-                    type='number'
-                    value={product?.quantity}
-                    onChange={(e) => updateQuantity(e.target.value, product?.id)}
-                    onBlur={(e) => updateQuantity(e.target.value, product?.id, 'BLUR')}
-                  />
-                  <button
-                    type='button'
-                    className='btn-light px-2 py-1'
-                    onClick={() => updateQuantity(1, product?.id, 'PLUS')}
-                  >
-                    +
-                  </button>
-                  <button
-                    className='btn-red p-1 ml-1'
-                    onClick={() => setDeleteConfirmation(product)}
-                  >
-                    <TrashIcon className='w-4' />
-                  </button>
+            ))}
+
+            <div className='sticky bottom-0 left-0 w-full p-4 mt-auto border-t border-gray_r-6 bg-white'>
+              <div className='flex justify-between mb-4'>
+                <div className='text-gray_r-11'>
+                  Total:
+                  <span className='text-red_r-11 font-semibold'>
+                    &nbsp;
+                    {selectedProduct().length > 0
+                      ? currencyFormat(totalPriceBeforeTax - totalDiscountAmount + totalTaxAmount)
+                      : '-'}
+                  </span>
                 </div>
               </div>
+              <div className='flex gap-x-3'>
+                <button
+                  type='button'
+                  className='btn-yellow flex-1'
+                  disabled={selectedProduct().length == 0}
+                  onClick={() => router.push('/shop/quotation')}
+                >
+                  Quotation
+                </button>
+                <button
+                  type='button'
+                  className='btn-solid-red flex-1'
+                  disabled={selectedProduct().length == 0}
+                  onClick={() => router.push('/shop/checkout')}
+                >
+                  Checkout
+                </button>
+              </div>
             </div>
           </div>
-        ))}
 
-        <div className='sticky bottom-0 left-0 w-full p-4 mt-auto border-t border-gray_r-6 bg-white'>
-          <div className='flex justify-between mb-4'>
-            <div className='text-gray_r-11'>
-              Total:
-              <span className='text-red_r-11 font-semibold'>
-                &nbsp;
-                {selectedProduct().length > 0
-                  ? currencyFormat(totalPriceBeforeTax - totalDiscountAmount + totalTaxAmount)
-                  : '-'}
-              </span>
+          <BottomPopup
+            active={deleteConfirmation}
+            close={() => setDeleteConfirmation(null)}
+            title='Hapus dari Keranjang'
+          >
+            <div className='leading-7 text-gray_r-12/80'>
+              Apakah anda yakin menghapus barang{' '}
+              <span className='underline'>{deleteConfirmation?.name}</span> dari keranjang?
             </div>
-          </div>
-          <div className='flex gap-x-3'>
-            <button
-              type='button'
-              className='btn-yellow flex-1'
-              disabled={selectedProduct().length == 0}
-              onClick={() => router.push('/shop/quotation')}
-            >
-              Quotation
-            </button>
-            <button
-              type='button'
-              className='btn-solid-red flex-1'
-              disabled={selectedProduct().length == 0}
-              onClick={() => router.push('/shop/checkout')}
-            >
-              Checkout
-            </button>
-          </div>
+            <div className='flex mt-6 gap-x-4'>
+              <button
+                className='btn-solid-red flex-1'
+                type='button'
+                onClick={() => deleteProduct(deleteConfirmation?.id)}
+              >
+                Ya, Hapus
+              </button>
+              <button
+                className='btn-light flex-1'
+                type='button'
+                onClick={() => setDeleteConfirmation(null)}
+              >
+                Batal
+              </button>
+            </div>
+          </BottomPopup>
         </div>
-      </div>
+      </MobileView>
 
-      <BottomPopup
-        active={deleteConfirmation}
-        close={() => setDeleteConfirmation(null)}
-        title='Hapus dari Keranjang'
-      >
-        <div className='leading-7 text-gray_r-12/80'>
-          Apakah anda yakin menghapus barang{' '}
-          <span className='underline'>{deleteConfirmation?.name}</span> dari keranjang?
-        </div>
-        <div className='flex mt-6 gap-x-4'>
-          <button
-            className='btn-solid-red flex-1'
-            type='button'
-            onClick={() => deleteProduct(deleteConfirmation?.id)}
-          >
-            Ya, Hapus
-          </button>
-          <button
-            className='btn-light flex-1'
-            type='button'
-            onClick={() => setDeleteConfirmation(null)}
-          >
-            Batal
-          </button>
+      <DesktopView>
+        <div className='container mx-auto pt-10'>
+          <div className='flex'>
+            <div className='w-9/12'>
+              <h1 className='text-title-sm font-semibold'>Daftar Produk Belanja</h1>
+            </div>
+          </div>
         </div>
-      </BottomPopup>
-    </div>
+      </DesktopView>
+    </>
   )
 }
 
-- 
cgit v1.2.3

