summaryrefslogtreecommitdiff
path: root/src/lib/product/components/Product.jsx
diff options
context:
space:
mode:
authorRafi Zadanly <zadanlyr@gmail.com>2023-02-22 11:03:34 +0700
committerRafi Zadanly <zadanlyr@gmail.com>2023-02-22 11:03:34 +0700
commitf66b12fd1d0b83af0d7230d7b1565fbe00afbe3c (patch)
tree253dcf854a3c92e09ca846e86a09e5b4c5d16be1 /src/lib/product/components/Product.jsx
parent3c559031623649a67825ff47f34512f0eb946861 (diff)
prettier
Diffstat (limited to 'src/lib/product/components/Product.jsx')
-rw-r--r--src/lib/product/components/Product.jsx230
1 files changed, 104 insertions, 126 deletions
diff --git a/src/lib/product/components/Product.jsx b/src/lib/product/components/Product.jsx
index 92f4e37d..2181c38e 100644
--- a/src/lib/product/components/Product.jsx
+++ b/src/lib/product/components/Product.jsx
@@ -1,41 +1,40 @@
-import Badge from "@/core/components/elements/Badge/Badge"
-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 { toast } from "react-hot-toast"
-import { updateItemCart } from "@/core/utils/cart"
+import Badge from '@/core/components/elements/Badge/Badge'
+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 { toast } from 'react-hot-toast'
+import { updateItemCart } from '@/core/utils/cart'
const informationTabOptions = [
{ value: 'specification', label: 'Spesifikasi' },
{ value: 'description', label: 'Deskripsi' },
- { value: 'important', label: 'Info Penting' },
+ { value: 'important', label: 'Info Penting' }
]
const Product = ({ product }) => {
- const [ quantity, setQuantity ] = useState('1')
- const [ selectedVariant, setSelectedVariant ] = useState(null)
- const [ informationTab, setInformationTab ] = useState(null)
+ const [quantity, setQuantity] = useState('1')
+ const [selectedVariant, setSelectedVariant] = useState(null)
+ const [informationTab, setInformationTab] = useState(null)
- const [ activeVariant, setActiveVariant ] = useState({
+ const [activeVariant, setActiveVariant] = useState({
id: product.id,
code: product.code,
name: product.name,
price: product.lowestPrice,
stock: product.stockTotal,
- weight: product.weight,
+ 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)
+ label:
+ (variant.code ? `[${variant.code}] ` : '') +
+ (variant.attributes.length > 0 ? variant.attributes.join(', ') : product.name)
}))
useEffect(() => {
@@ -46,9 +45,10 @@ const Product = ({ product }) => {
useEffect(() => {
if (selectedVariant) {
- const variant = product.variants.find(variant => variant.id == selectedVariant.value)
- const variantAttributes = variant.attributes.length > 0 ? ' - ' + variant.attributes.join(', ') : ''
-
+ 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,
@@ -87,76 +87,69 @@ const Product = ({ product }) => {
<Image
src={product.image}
alt={product.name}
- className="h-72 object-contain object-center w-full border-b border-gray_r-4"
+ className='h-72 object-contain object-center w-full border-b border-gray_r-4'
/>
- <div className="p-4">
- <Link href="/" className="mb-2">{ product.manufacture?.name }</Link>
- <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">
+ <div className='p-4'>
+ <Link href='/' className='mb-2'>
+ {product.manufacture?.name}
+ </Link>
+ <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>
- <Badge type="solid-red">
- {activeVariant?.price?.discountPercentage}%
- </Badge>
+ <Badge type='solid-red'>{activeVariant?.price?.discountPercentage}%</Badge>
</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">
+ )}
+ <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>
+ <a href='https://wa.me/' className='text-red_r-11 underline'>
+ klik disini
+ </a>
</span>
- ) }
+ )}
</h3>
</div>
<Divider />
- <div className="p-4">
+ <div className='p-4'>
<div>
- <label className="flex justify-between">
+ <label className='flex justify-between'>
Pilih Varian:
- <span className="text-gray_r-11">
- { product?.variantTotal } Varian
- </span>
+ <span className='text-gray_r-11'>{product?.variantTotal} Varian</span>
</label>
<Select
- name="variant"
- classNamePrefix="form-select"
+ name='variant'
+ classNamePrefix='form-select'
options={variantOptions}
- className="mt-2"
+ 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"
+ <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}
- >
+ <button type='button' className='btn-yellow flex-1' onClick={handleClickCart}>
Keranjang
</button>
- <button
- type="button"
- className="btn-solid-red flex-1"
- >
+ <button type='button' className='btn-solid-red flex-1'>
Beli
</button>
</div>
@@ -164,78 +157,70 @@ const Product = ({ product }) => {
<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}
+ <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"
+ <TabContent
+ active={informationTab == 'specification'}
+ className='rounded border border-gray_r-6 divide-y divide-gray_r-6'
>
- <SpecificationContent label="Jumlah Varian">
+ <SpecificationContent label='Jumlah Varian'>
<span>{product?.variantTotal} Varian</span>
</SpecificationContent>
- <SpecificationContent label="Nomor SKU">
+ <SpecificationContent label='Nomor SKU'>
<span>SKU-{product?.id}</span>
</SpecificationContent>
- <SpecificationContent label="Part Number">
+ <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>
+ </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"
- >
+ )}
+ {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"
- >
+ )}
+ </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>
+ )}
+ </SpecificationContent>
</TabContent>
<TabContent
active={informationTab == 'description'}
- className="leading-6 text-gray_r-11"
- dangerouslySetInnerHTML={{__html: (product.description != '' ? product.description : 'Belum ada deskripsi produk.')}}
+ 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>
+ <div className='p-4'>
+ <h2 className='font-semibold mb-4'>Kamu Mungkin Juga Suka</h2>
<LazyLoad>
<ProductSimilar query={product?.name.split(' ').slice(1, 3).join(' ')} />
</LazyLoad>
@@ -247,30 +232,23 @@ const Product = ({ product }) => {
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 {...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 {...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 className='flex justify-between p-3'>
+ <span className='text-gray_r-11'>{label}</span>
+ {children}
</div>
)
-export default Product \ No newline at end of file
+export default Product