import style from '../styles/product-detail.module.css'; import Link from 'next/link'; import { useRouter } from 'next/router'; import { useEffect, useMemo, useState } from 'react'; import dynamic from 'next/dynamic'; import { Button } from '@chakra-ui/react'; import { MessageCircleIcon, Share2Icon } from 'lucide-react'; import { LazyLoadComponent } from 'react-lazy-load-image-component'; const RWebShare = dynamic( () => import('react-web-share').then(m => m.RWebShare), { ssr: false } ); import useDevice from '@/core/hooks/useDevice'; import { getAuth } from '~/libs/auth'; import { whatsappUrl } from '~/libs/whatsappUrl'; import ProductPromoSection from '~/modules/product-promo/components/Section'; import { IProductDetail } from '~/types/product'; import { useProductDetail } from '../stores/useProductDetail'; import AddToWishlist from './AddToWishlist'; import Breadcrumb from './Breadcrumb'; import ProductImage from './Image'; import Information from './Information'; import PriceAction from './PriceAction'; import SimilarBottom from './SimilarBottom'; import SimilarSide from './SimilarSide'; import { gtagProductDetail } from '@/core/utils/googleTag'; type Props = { product: IProductDetail }; const SELF_HOST = process.env.NEXT_PUBLIC_SELF_HOST || ''; const ProductDetail = ({ product }: Props) => { const { isDesktop, isMobile } = useDevice(); const router = useRouter(); const [auth, setAuth] = useState(null); useEffect(() => { try { setAuth(getAuth() ?? null); } catch {} }, []); const { setAskAdminUrl, askAdminUrl, activeVariantId, setIsApproval, isApproval, setSelectedVariant, } = useProductDetail(); useEffect(() => { try { gtagProductDetail(product); } catch {} }, [product]); const currentPath = router?.asPath || '/'; useEffect(() => { const createdAskUrl = whatsappUrl({ template: 'product', payload: { manufacture: product.manufacture?.name ?? '', productName: product.name ?? '', url: SELF_HOST + currentPath, }, fallbackUrl: currentPath, }); setAskAdminUrl(createdAskUrl); }, [currentPath, product.manufacture?.name, product.name, setAskAdminUrl]); useEffect(() => { if (auth && typeof auth === 'object') { setIsApproval(!!auth?.feature?.soApproval); } const selectedVariant = product?.variants?.find(v => v.is_in_bu) || product?.variants?.[0] || null; setSelectedVariant(selectedVariant); }, [auth, product?.variants, setIsApproval, setSelectedVariant]); const allImages = useMemo(() => { const arr: string[] = []; if (Array.isArray(product?.image_carousel)) arr.push(...product.image_carousel); if (product?.image) arr.unshift(product.image); return arr; }, [product?.image, product?.image_carousel]); const [mainImage, setMainImage] = useState(allImages[0] || ''); useEffect(() => { if (!allImages.includes(mainImage)) setMainImage(allImages[0] || ''); }, [allImages, mainImage]); const canShare = typeof navigator !== 'undefined' && typeof (navigator as any).share === 'function'; return ( <>
{allImages.length > 0 && (
{allImages.map((img, index) => (
setMainImage(img)} > {`Thumbnail { (e.target as HTMLImageElement).src = '/images/noimage.jpeg'; }} />
))}
)}

{product.name}

{isMobile && (
)}
{!!activeVariantId && !isApproval && ( )}

Informasi Produk


' ? 'Belum ada deskripsi' : product.description, }} />
{isDesktop && (
| | {canShare && ( )}
Produk Serupa
)}
Kamu Mungkin Juga Suka
); }; export default ProductDetail;