import { Box, Button, Skeleton, Tooltip } from '@chakra-ui/react'; import { HeartIcon } from '@heroicons/react/24/outline'; import { Info, MessageCircleIcon, Share2Icon } from 'lucide-react'; import { useRouter } from 'next/router'; import { useCallback, useEffect, useRef, useState } from 'react'; import { toast } from 'react-hot-toast'; import AddToWishlist from '../../../../../src-migrate/modules/product-detail/components/AddToWishlist'; import { RWebShare } from 'react-web-share'; import LazyLoad from 'react-lazy-load'; import { useProductCartContext } from '@/contexts/ProductCartContext'; import odooApi from '@/core/api/odooApi'; import Image from '@/core/components/elements/Image/Image'; import Link from '@/core/components/elements/Link/Link'; import BottomPopup from '@/core/components/elements/Popup/BottomPopup'; import DesktopView from '@/core/components/views/DesktopView'; import useAuth from '@/core/hooks/useAuth'; import { updateItemCart } from '@/core/utils/cart'; import currencyFormat from '@/core/utils/currencyFormat'; import { createSlug } from '@/core/utils/slug'; import whatsappUrl from '@/core/utils/whatsappUrl'; import { getAuth } from '~/libs/auth'; import ImageNext from 'next/image'; import productSimilarApi from '../../api/productSimilarApi'; import ProductCard from '../ProductCard'; import ProductSimilar from '../ProductSimilar'; import ProductPromoSection from '~/modules/product-promo/components/Section'; import SimilarBottom from '~/modules/product-detail/components/SimilarBottom'; import { gtagAddToCart } from '@/core/utils/googleTag'; const SELF_HOST = process.env.NEXT_PUBLIC_SELF_HOST; const ProductDesktopVariant = ({ product, wishlist, toggleWishlist, isVariant, }) => { const router = useRouter(); let auth = useAuth(); const { slug } = router.query; const { srsltid } = router.query; const [askAdminUrl, setAskAdminUrl, isApproval] = useState(); const [lowestPrice, setLowestPrice] = useState(null); const [qtyPickUp, setQtyPickUp] = useState(0); const [addCartAlert, setAddCartAlert] = useState(false); const [isLoadingSLA, setIsLoadingSLA] = useState(true); const [selectedVariant, setSelectedVariant] = useState(product.id); const { setRefreshCart } = useProductCartContext(); const [quantityInput, setQuantityInput] = useState(1); const [activeVariant, setActiveVariant] = useState({ id: null, code: product.code, name: product.name, price: lowestPrice, stock: product.stockTotal, weight: product.weight, isFlashSale: product.isFlashSale, }); useEffect(() => { if (selectedVariant) { setActiveVariant({ id: product.id, code: product.code, name: product.name, price: product.price, stock: product.stockTotal, weight: product.weight, isFlashSale: product.isFlashSale, }); } }, [selectedVariant, product]); const createdAskUrl = whatsappUrl({ template: 'product', payload: { manufacture: product.manufacture.name, productName: product.name, url: process.env.NEXT_PUBLIC_SELF_HOST + router.asPath, }, fallbackUrl: router.asPath, }); const getLowestPrice = useCallback(() => { const lowest = product.price; return lowest; }, [product]); useEffect(() => { const lowest = getLowestPrice(); setLowestPrice(lowest); }, [getLowestPrice]); const [informationTab, setInformationTab] = useState( informationTabOptions[0].value ); const variantQuantityRefs = useRef([]); const setVariantQuantityRef = (variantId) => (element) => { variantQuantityRefs.current[variantId] = element; }; const validQuantity = (quantity) => { let isValid = true; if (!quantity || quantity < 1 || isNaN(parseInt(quantity))) { toast.error('Jumlah barang minimal 1'); isValid = false; } return isValid; }; const handleAddToCart = (variant) => { if (!auth) { router.push(`/login?next=/shop/product/${slug}?srsltid=${srsltid}`); return; } const quantity = quantityInput; if (!validQuantity(quantity)) return; gtagAddToCart(activeVariant, quantity); updateItemCart({ productId: product.id, quantity, programLineId: null, selected: true, source: null, }).then(() => { setRefreshCart(true); }); setAddCartAlert(true); }; const handleBuy = async (variant) => { const quantity = variantQuantityRefs?.current[product.id]?.value; let isLoggedIn = typeof auth === 'object'; if (!isLoggedIn) { const currentUrl = encodeURIComponent(router.asPath); await router.push(`/login?next=${currentUrl}`); // Tunggu login berhasil, misalnya dengan memantau perubahan status auth. const authCheckInterval = setInterval(() => { const newAuth = getAuth(); if (typeof newAuth === 'object') { isLoggedIn = true; auth = newAuth; // Update nilai auth setelah login clearInterval(authCheckInterval); } }, 500); // Periksa status login setiap 500ms await new Promise((resolve) => { const checkLogin = setInterval(() => { if (isLoggedIn) { clearInterval(checkLogin); resolve(null); } }, 500); }); } if (!validQuantity(quantity)) return; updateItemCart({ productId: variant, quantity, programLineId: null, selected: true, source: 'buy', }); router.push(`/shop/checkout?source=buy`); }; const handleButton = async (variant) => { const quantity = quantityInput; let isLoggedIn = typeof auth === 'object'; if (!isLoggedIn) { const currentUrl = encodeURIComponent(router.asPath); await router.push(`/login?next=${currentUrl}`); // Tunggu login berhasil, misalnya dengan memantau perubahan status auth. const authCheckInterval = setInterval(() => { const newAuth = getAuth(); if (typeof newAuth === 'object') { isLoggedIn = true; auth = newAuth; // Update nilai auth setelah login clearInterval(authCheckInterval); } }, 500); // Periksa status login setiap 500ms await new Promise((resolve) => { const checkLogin = setInterval(() => { if (isLoggedIn) { clearInterval(checkLogin); resolve(null); } }, 500); }); } if (!validQuantity(quantity)) return; updateItemCart({ productId: variant, quantity, programLineId: null, selected: true, source: 'buy', }); router.push('/shop/quotation?source=buy'); }; 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, `fq=-product_id_i:${product.id}`, `fq=-manufacture_id_i:${product.manufacture?.id || 0}`, ].join('&'); const [productSimilarInBrand, setProductSimilarInBrand] = useState(null); useEffect(() => { const loadProductSimilarInBrand = async () => { const productSimilarQuery = [ product?.name, `fq=-product_id_i:${product.id}`, ].join('&'); const dataProductSimilar = await productSimilarApi({ query: productSimilarQuery, }); setProductSimilarInBrand(dataProductSimilar.products); }; if (!productSimilarInBrand) loadProductSimilarInBrand(); }, [product, productSimilarInBrand]); useEffect(() => { const fetchData = async () => { const dataSLA = await odooApi( 'GET', `/api/v1/product_variant/${product.id}/stock` ); product.sla = dataSLA; setIsLoadingSLA(false); }; fetchData(); }, [product]); useEffect(() => { const fetchData = async () => { const qty_available = await odooApi( 'GET', `/api/v1/product_variant/${product.id}/qty_available` ); setQtyPickUp(qty_available?.qty); }; fetchData(); }, [product]); return (
{product.name}

{product?.name}

Item Code
{product.code}
Manufacture
{product?.manufacture.logo ? ( {product.manufacture.name} ) : (

{product.manufacture.name}

)}
Berat Barang
{product?.weight > 0 && {product?.weight} KG} {product?.weight == 0 && ( Tanya Berat )}
Terjual
-
Persiapan Barang
{!product?.sla && } {product?.sla && ( {product?.sla?.slaDate} )}

Informasi Produk


' ? 'Belum ada deskripsi' : product.parent.description, }} />
{product?.isFlashsale > 0 && product?.price?.discountPercentage > 0 ? ( <>
{product?.price?.discountPercentage}%
{currencyFormat(product?.price?.price)}
{currencyFormat(product?.price?.priceDiscount)}
Termasuk PPN:{' '} {currencyFormat( product?.price?.priceDiscount * process.env.NEXT_PUBLIC_PPN )}
) : (

{product?.price?.price > 0 ? ( <> {currencyFormat(product?.price?.price)}
Termasuk PPN:{' '} {currencyFormat( product?.price?.price * process.env.NEXT_PUBLIC_PPN )}
) : ( Hubungi kami untuk dapatkan harga terbaik,  klik disini )}

)}
setQuantityInput(e.target.value)} className=' w-24 h-10 text-center border border-gray-300 rounded focus:outline-none' />
Stock : {product?.sla?.qty}{' '}
{qtyPickUp > 0 && ( pickup now )}
{qtyPickUp > 0 && ( <>
* {qtyPickUp} barang bisa di pickup
)}
| |
Produk Serupa
{productSimilarInBrand && productSimilarInBrand?.map((product) => (
))}
Kamu Mungkin Juga Suka
{/* */}
setAddCartAlert(false)} >
{product.name}
{product.name}
Lihat Keranjang
Kamu Mungkin Juga Suka
{/* */}
); }; const informationTabOptions = [ { value: 'description', label: 'Deskripsi' }, { value: 'information', label: 'Info Penting' }, ]; const TabButton = ({ children, active, ...props }) => { const activeClassName = active ? 'text-danger-500 underline underline-offset-4' : 'text-gray_r-12/80'; return ( ); }; const TabContent = ({ children, active, className = '', ...props }) => (
{children}
); export default ProductDesktopVariant;