summaryrefslogtreecommitdiff
path: root/src/lib/product/components/ProductMobile.jsx
diff options
context:
space:
mode:
authorRafi Zadanly <zadanlyr@gmail.com>2023-03-20 17:14:16 +0700
committerRafi Zadanly <zadanlyr@gmail.com>2023-03-20 17:14:16 +0700
commitd178a520534af7d1cbcc03134034ad8a2327b461 (patch)
tree488606d5e19782d2c0942402ab7c6e7c8d16bc1c /src/lib/product/components/ProductMobile.jsx
parent833488811b4164d7fbdce9bd70e171f06d62bf8d (diff)
product detail and cart header
Diffstat (limited to 'src/lib/product/components/ProductMobile.jsx')
-rw-r--r--src/lib/product/components/ProductMobile.jsx280
1 files changed, 0 insertions, 280 deletions
diff --git a/src/lib/product/components/ProductMobile.jsx b/src/lib/product/components/ProductMobile.jsx
deleted file mode 100644
index 07da876e..00000000
--- a/src/lib/product/components/ProductMobile.jsx
+++ /dev/null
@@ -1,280 +0,0 @@
-import Divider from '@/core/components/elements/Divider/Divider'
-import Image from '@/core/components/elements/Image/Image'
-import Link from '@/core/components/elements/Link/Link'
-import currencyFormat from '@/core/utils/currencyFormat'
-import { useEffect, useState } from 'react'
-import Select from 'react-select'
-import ProductSimilar from './ProductSimilar'
-import LazyLoad from 'react-lazy-load'
-import { updateItemCart } from '@/core/utils/cart'
-import { HeartIcon } from '@heroicons/react/24/outline'
-import { useRouter } from 'next/router'
-import MobileView from '@/core/components/views/MobileView'
-import { toast } from 'react-hot-toast'
-
-const ProductMobile = ({ product, wishlist, toggleWishlist }) => {
- const router = useRouter()
-
- const [quantity, setQuantity] = useState('1')
- const [selectedVariant, setSelectedVariant] = useState(null)
- const [informationTab, setInformationTab] = useState(informationTabOptions[0].value)
-
- const [activeVariant, setActiveVariant] = useState({
- id: product.id,
- code: product.code,
- name: product.name,
- price: product.lowestPrice,
- stock: product.stockTotal,
- weight: product.weight
- })
-
- const variantOptions = product.variants?.map((variant) => ({
- value: variant.id,
- label:
- (variant.code ? `[${variant.code}] ` : '') +
- (variant.attributes.length > 0 ? variant.attributes.join(', ') : product.name)
- }))
-
- useEffect(() => {
- if (!selectedVariant && variantOptions.length == 1) {
- setSelectedVariant(variantOptions[0])
- }
- }, [selectedVariant, variantOptions])
-
- useEffect(() => {
- if (selectedVariant) {
- const variant = product.variants.find((variant) => variant.id == selectedVariant.value)
- const variantAttributes =
- variant.attributes.length > 0 ? ' - ' + variant.attributes.join(', ') : ''
-
- setActiveVariant({
- id: variant.id,
- code: variant.code,
- name: variant.parent.name + variantAttributes,
- price: variant.price,
- stock: variant.stock,
- weight: variant.weight
- })
- }
- }, [selectedVariant, product])
-
- const validAction = () => {
- let isValid = true
- if (!selectedVariant) {
- toast.error('Pilih varian terlebih dahulu')
- isValid = false
- }
- if (!quantity || quantity < 1 || isNaN(parseInt(quantity))) {
- toast.error('Jumlah barang minimal 1')
- isValid = false
- }
- return isValid
- }
-
- const handleClickCart = () => {
- if (!validAction()) return
- updateItemCart({
- productId: activeVariant.id,
- quantity
- })
- toast.success('Berhasil menambahkan ke keranjang')
- }
-
- const handleClickBuy = () => {
- if (!validAction()) return
- router.push(`/shop/checkout?productId=${activeVariant.id}&quantity=${quantity}`)
- }
-
- const productSimilarQuery = [
- product?.name.replace(/[()/"&]/g, ''),
- `fq=-product_id:${product.id}`,
- `fq=-manufacture_id:${product.manufacture?.id || 0}`
- ].join('&')
-
- return (
- <MobileView>
- <Image
- src={product.image}
- alt={product.name}
- className='h-72 object-contain object-center w-full border-b border-gray_r-4'
- />
-
- <div className='p-4'>
- <div className='flex items-end mb-2'>
- {product.manufacture?.name ? (
- <Link href='/'>{product.manufacture?.name}</Link>
- ) : (
- <div>-</div>
- )}
- <button type='button' className='ml-auto' onClick={toggleWishlist}>
- {wishlist.data?.productTotal > 0 ? (
- <HeartIcon className='w-6 fill-red_r-11 text-red_r-11' />
- ) : (
- <HeartIcon className='w-6' />
- )}
- </button>
- </div>
- <h1 className='leading-6 font-medium'>{activeVariant?.name}</h1>
- {activeVariant?.price?.discountPercentage > 0 && (
- <div className='flex gap-x-1 items-center mt-2'>
- <div className='text-gray_r-11 line-through text-caption-1'>
- {currencyFormat(activeVariant?.price?.price)}
- </div>
- <div className='badge-solid-red'>{activeVariant?.price?.discountPercentage}%</div>
- </div>
- )}
- <h3 className='text-red_r-11 font-semibold mt-1'>
- {activeVariant?.price?.priceDiscount > 0 ? (
- currencyFormat(activeVariant?.price?.priceDiscount)
- ) : (
- <span className='text-gray_r-11 leading-6 font-normal'>
- Hubungi kami untuk dapatkan harga terbaik,&nbsp;
- <a href='https://wa.me/' className='text-red_r-11 underline'>
- klik disini
- </a>
- </span>
- )}
- </h3>
- </div>
-
- <Divider />
-
- <div className='p-4'>
- <div>
- <label className='flex justify-between'>
- Pilih Varian:
- <span className='text-gray_r-11'>{product?.variantTotal} Varian</span>
- </label>
- <Select
- name='variant'
- classNamePrefix='form-select'
- options={variantOptions}
- className='mt-2'
- value={selectedVariant}
- onChange={(option) => setSelectedVariant(option)}
- isSearchable={product.variantTotal > 10}
- />
- </div>
- <div className='mt-4 mb-2'>Jumlah</div>
- <div className='flex gap-x-3'>
- <div className='w-2/12'>
- <input
- name='quantity'
- type='number'
- className='form-input'
- value={quantity}
- onChange={(e) => setQuantity(e.target.value)}
- />
- </div>
- <button type='button' className='btn-yellow flex-1' onClick={handleClickCart}>
- Keranjang
- </button>
- <button type='button' className='btn-solid-red flex-1' onClick={handleClickBuy}>
- Beli
- </button>
- </div>
- </div>
-
- <Divider />
-
- <div className='p-4'>
- <h2 className='font-semibold'>Informasi Produk</h2>
- <div className='flex gap-x-4 mt-4 mb-3'>
- {informationTabOptions.map((option) => (
- <TabButton
- value={option.value}
- key={option.value}
- active={informationTab == option.value}
- onClick={() => setInformationTab(option.value)}
- >
- {option.label}
- </TabButton>
- ))}
- </div>
-
- <TabContent
- active={informationTab == 'specification'}
- className='rounded border border-gray_r-6 divide-y divide-gray_r-6'
- >
- <SpecificationContent label='Jumlah Varian'>
- <span>{product?.variantTotal} Varian</span>
- </SpecificationContent>
- <SpecificationContent label='Nomor SKU'>
- <span>SKU-{product?.id}</span>
- </SpecificationContent>
- <SpecificationContent label='Part Number'>
- <span>{activeVariant?.code || '-'}</span>
- </SpecificationContent>
- <SpecificationContent label='Stok'>
- {activeVariant?.stock > 0 && (
- <span className='flex gap-x-1.5'>
- <div className='badge-solid-red'>Ready Stock</div>
- <div className='badge-gray'>{activeVariant?.stock > 5 ? '> 5' : '< 5'}</div>
- </span>
- )}
- {activeVariant?.stock == 0 && (
- <a href='https://wa.me' className='text-red_r-11 font-medium'>
- Tanya Stok
- </a>
- )}
- </SpecificationContent>
- <SpecificationContent label='Berat Barang'>
- {activeVariant?.weight > 0 && <span>{activeVariant?.weight} KG</span>}
- {activeVariant?.weight == 0 && (
- <a href='https://wa.me' className='text-red_r-11 font-medium'>
- Tanya Berat
- </a>
- )}
- </SpecificationContent>
- </TabContent>
-
- <TabContent
- active={informationTab == 'description'}
- className='leading-6 text-gray_r-11'
- dangerouslySetInnerHTML={{
- __html: product.description != '' ? product.description : 'Belum ada deskripsi produk.'
- }}
- />
- </div>
-
- <Divider />
-
- <div className='p-4'>
- <h2 className='font-semibold mb-4'>Kamu Mungkin Juga Suka</h2>
- <LazyLoad>
- <ProductSimilar query={productSimilarQuery} />
- </LazyLoad>
- </div>
- </MobileView>
- )
-}
-
-const informationTabOptions = [
- { value: 'specification', label: 'Spesifikasi' },
- { value: 'description', label: 'Deskripsi' },
- { value: 'information', label: 'Info Penting' }
-]
-
-const TabButton = ({ children, active, ...props }) => {
- const activeClassName = active ? 'text-red_r-11 underline underline-offset-4' : 'text-gray_r-11'
- return (
- <button {...props} type='button' className={`font-medium pb-1 ${activeClassName}`}>
- {children}
- </button>
- )
-}
-
-const TabContent = ({ children, active, className, ...props }) => (
- <div {...props} className={`${active ? 'block' : 'hidden'} ${className}`}>
- {children}
- </div>
-)
-
-const SpecificationContent = ({ children, label }) => (
- <div className='flex justify-between p-3'>
- <span className='text-gray_r-11'>{label}</span>
- {children}
- </div>
-)
-
-export default ProductMobile