summaryrefslogtreecommitdiff
path: root/src/lib/product/components
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
parent833488811b4164d7fbdce9bd70e171f06d62bf8d (diff)
product detail and cart header
Diffstat (limited to 'src/lib/product/components')
-rw-r--r--src/lib/product/components/Product/Product.jsx (renamed from src/lib/product/components/Product.jsx)0
-rw-r--r--src/lib/product/components/Product/ProductDesktop.jsx (renamed from src/lib/product/components/ProductDesktop.jsx)69
-rw-r--r--src/lib/product/components/Product/ProductMobile.jsx (renamed from src/lib/product/components/ProductMobile.jsx)2
3 files changed, 30 insertions, 41 deletions
diff --git a/src/lib/product/components/Product.jsx b/src/lib/product/components/Product/Product.jsx
index 9521cbe4..9521cbe4 100644
--- a/src/lib/product/components/Product.jsx
+++ b/src/lib/product/components/Product/Product.jsx
diff --git a/src/lib/product/components/ProductDesktop.jsx b/src/lib/product/components/Product/ProductDesktop.jsx
index 55d44212..ac17ec6e 100644
--- a/src/lib/product/components/ProductDesktop.jsx
+++ b/src/lib/product/components/Product/ProductDesktop.jsx
@@ -3,46 +3,24 @@ import Link from '@/core/components/elements/Link/Link'
import DesktopView from '@/core/components/views/DesktopView'
import currencyFormat from '@/core/utils/currencyFormat'
import { HeartIcon } from '@heroicons/react/24/outline'
-import { Fragment, useEffect, useRef, useState } from 'react'
+import { useRef, useState } from 'react'
import LazyLoad from 'react-lazy-load'
-import ProductSimilar from './ProductSimilar'
+import ProductSimilar from '../ProductSimilar'
import { toast } from 'react-hot-toast'
import { updateItemCart } from '@/core/utils/cart'
const ProductDesktop = ({ product, wishlist, toggleWishlist }) => {
- const [variantQuantity, setVariantQuantity] = useState(null)
const [informationTab, setInformationTab] = useState(informationTabOptions[0].value)
- useEffect(() => {
- const mapVariantQuantity = product.variants.reduce((acc, cur) => {
- acc[cur.id] = '1'
- return acc
- }, {})
- setVariantQuantity(mapVariantQuantity)
- }, [product])
+ const variantQuantityRefs = useRef([])
- const changeQuantity = (variantId, quantity) => {
- setVariantQuantity((variantQuantity) => ({ ...variantQuantity, [variantId]: quantity }))
+ const setVariantQuantityRef = (variantId) => (element) => {
+ variantQuantityRefs.current[variantId] = element
}
- const variantSectionRef = useRef(null)
- const goToVariantSection = () => {
- if (variantSectionRef.current) {
- const position = variantSectionRef.current.getBoundingClientRect()
- window.scrollTo({
- top: position.top - 120 + window.pageYOffset,
- behavior: 'smooth'
- })
- }
- }
-
- const validAction = (variantId) => {
+ const validQuantity = (quantity) => {
let isValid = true
- if (
- !variantQuantity[variantId] ||
- variantQuantity[variantId] < 1 ||
- isNaN(parseInt(variantQuantity[variantId]))
- ) {
+ if (!quantity || quantity < 1 || isNaN(parseInt(quantity))) {
toast.error('Jumlah barang minimal 1')
isValid = false
}
@@ -50,14 +28,26 @@ const ProductDesktop = ({ product, wishlist, toggleWishlist }) => {
}
const handleAddToCart = (variantId) => {
- if (!validAction(variantId)) return
+ const quantity = variantQuantityRefs.current[variantId].value
+ if (!validQuantity(quantity)) return
updateItemCart({
productId: variantId,
- quantity: variantQuantity[variantId]
+ quantity
})
toast.success('Berhasil menambahkan ke keranjang')
}
+ const variantSectionRef = useRef(null)
+ const goToVariantSection = () => {
+ if (variantSectionRef.current) {
+ const position = variantSectionRef.current.getBoundingClientRect()
+ window.scrollTo({
+ top: position.top - 120 + window.pageYOffset,
+ behavior: 'smooth'
+ })
+ }
+ }
+
const productSimilarQuery = [
product?.name.replace(/[()/"&]/g, ''),
`fq=-product_id:${product.id}`,
@@ -66,16 +56,16 @@ const ProductDesktop = ({ product, wishlist, toggleWishlist }) => {
return (
<DesktopView>
- <div className='container mx-auto mt-10'>
+ <div className='container mx-auto pt-10'>
<div className='flex'>
- <div className='w-3/12'>
+ <div className='w-[30%]'>
<Image
src={product.image}
alt={product.name}
className='h-96 object-contain object-center w-full border border-gray_r-4'
/>
</div>
- <div className='w-6/12 px-4'>
+ <div className='w-[50%] px-4'>
<h1 className='text-title-md leading-10 font-medium'>{product?.name}</h1>
<div className='mt-10'>
<div className='flex p-3'>
@@ -110,7 +100,7 @@ const ProductDesktop = ({ product, wishlist, toggleWishlist }) => {
</div>
</div>
- <div className='w-3/12'>
+ <div className='w-[20%]'>
{product.variants.length > 1 && product.lowestPrice.priceDiscount > 0 && (
<div className='text-gray_r-12/80'>Harga mulai dari: </div>
)}
@@ -187,8 +177,8 @@ const ProductDesktop = ({ product, wishlist, toggleWishlist }) => {
<input
type='number'
className='form-input w-16 py-2 text-center bg-gray_r-1'
- value={variantQuantity?.[variant.id]}
- onChange={(e) => changeQuantity(variant.id, e.target.value)}
+ ref={setVariantQuantityRef(variant.id)}
+ defaultValue={1}
/>
</td>
<td className='flex gap-x-3'>
@@ -212,8 +202,7 @@ const ProductDesktop = ({ product, wishlist, toggleWishlist }) => {
<div className='mt-12'>
<div className='text-h-lg font-semibold'>Informasi Produk</div>
- <div className='my-5 h-0.5 bg-gray_r-6' />
- <div className='flex gap-x-4 mb-5'>
+ <div className='flex gap-x-4 mt-6 mb-4'>
{informationTabOptions.map((option) => (
<TabButton
value={option.value}
@@ -237,7 +226,7 @@ const ProductDesktop = ({ product, wishlist, toggleWishlist }) => {
}}
/>
</TabContent>
-
+
<TabContent active={informationTab == 'information'}>Belum ada informasi.</TabContent>
</div>
</div>
diff --git a/src/lib/product/components/ProductMobile.jsx b/src/lib/product/components/Product/ProductMobile.jsx
index 07da876e..c572a58e 100644
--- a/src/lib/product/components/ProductMobile.jsx
+++ b/src/lib/product/components/Product/ProductMobile.jsx
@@ -4,7 +4,7 @@ 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 ProductSimilar from '../ProductSimilar'
import LazyLoad from 'react-lazy-load'
import { updateItemCart } from '@/core/utils/cart'
import { HeartIcon } from '@heroicons/react/24/outline'