diff options
| author | Rafi Zadanly <zadanlyr@gmail.com> | 2023-02-22 11:03:34 +0700 |
|---|---|---|
| committer | Rafi Zadanly <zadanlyr@gmail.com> | 2023-02-22 11:03:34 +0700 |
| commit | f66b12fd1d0b83af0d7230d7b1565fbe00afbe3c (patch) | |
| tree | 253dcf854a3c92e09ca846e86a09e5b4c5d16be1 /src/lib/product/components/Product.jsx | |
| parent | 3c559031623649a67825ff47f34512f0eb946861 (diff) | |
prettier
Diffstat (limited to 'src/lib/product/components/Product.jsx')
| -rw-r--r-- | src/lib/product/components/Product.jsx | 230 |
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, - <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 |
