import style from '../styles/price-action.module.css'; import Image from 'next/image'; import Link from 'next/link'; import { useEffect, useState } from 'react'; import formatCurrency from '~/libs/formatCurrency'; import { IProductDetail } from '~/types/product'; import { useProductDetail } from '../stores/useProductDetail'; import AddToCart from './AddToCart'; import AddToQuotation from './AddToQuotation'; import { getAuth } from '~/libs/auth'; import useDevice from '@/core/hooks/useDevice'; import odooApi from '~/libs/odooApi'; import { Button, Skeleton } from '@chakra-ui/react'; import DesktopView from '@/core/components/views/DesktopView'; import MobileView from '@/core/components/views/MobileView'; // 1. Tambahkan onCompare (Optional) di sini type Props = { product: IProductDetail; onCompare?: () => void; }; const PPN: number = process.env.NEXT_PUBLIC_PPN ? parseFloat(process.env.NEXT_PUBLIC_PPN) : 0; const PriceAction = ({ product, onCompare }: Props) => { const { activePrice, setActive, activeVariantId, quantityInput, setQuantityInput, askAdminUrl, isApproval, setIsApproval, selectedVariant, sla, } = useProductDetail(); const [qtyPickUp, setQtyPickUp] = useState(0); const { isDesktop, isMobile } = useDevice(); useEffect(() => { setActive(selectedVariant); if (product.variants.length > 2 && product.variants[0].price.price === 0) { const variants = product.variants; for (let i = 0; i < variants.length; i++) { if (variants[i].price.price > 0) { setActive(variants[i]); break; } } } }, [product, setActive, selectedVariant]); useEffect(() => { const fetchData = async () => { const qty_available = await odooApi( 'GET', `/api/v1/product_variant/${selectedVariant.id}/qty_available` ); setQtyPickUp(qty_available?.qty); }; fetchData(); }, [selectedVariant]); useEffect(() => { setQuantityInput('1'); }, [selectedVariant]); let voucherPastiHemat = 0; if ( product?.voucher_pasti_hemat ? product?.voucher_pasti_hemat.length : voucherPastiHemat > 0 ) { const stringVoucher = product?.voucher_pasti_hemat[0]; const validJsonString = stringVoucher.replace(/'/g, '"'); voucherPastiHemat = JSON.parse(validJsonString); } const hasPrice = Number(product?.lowest_price?.price) > 0; return (
{!!activePrice && activePrice.price > 0 && ( <>
{activePrice.discount_percentage > 0 && ( <>
{Math.floor(activePrice.discount_percentage)}%
Rp {formatCurrency(activePrice.price || 0)}
)}
Rp {formatCurrency(activePrice.price_discount || 0)}
Termasuk PPN: Rp{' '} {formatCurrency(Math.round(activePrice.price_discount * PPN))}
{activePrice.discount_percentage > 0 ? ( <>
{Math.floor(activePrice.discount_percentage)}%
{/* harga setelah diskon (main-price) di kiri */}
Rp {formatCurrency(activePrice.price_discount || 0)}
{/* harga coret di kanan */}
Rp {formatCurrency(activePrice.price || 0)}
) : ( // kalau tidak ada diskon, tampilkan harga normal saja
Rp {formatCurrency(activePrice.price || 0)}
)}
Termasuk PPN: Rp{' '} {formatCurrency(Math.round(activePrice.price_discount * PPN))}
)}
{/* Qty */}
setQuantityInput(e.target.value)} className={`${style['quantity-input']} disabled:bg-gray-100 disabled:text-gray-400`} disabled={!hasPrice} />
{/* Stok */}
Stock : {hasPrice ? sla?.qty : 'Habis'}
{/* Pickup badge */}
{qtyPickUp > 0 && (
pickup now
)}
{/* ===== MOBILE: grid kiri-kanan, kanan hanya qty ===== */}
{/* Kiri */}
Stock : {sla?.qty} {qtyPickUp > 0 && ( pickup now )}
{/* Kanan: hanya qty, rata kanan */}
setQuantityInput(e.target.value)} className='h-11 md:h-12 w-16 md:w-20 text-center text-lg md:text-xl outline-none border-x [appearance:textfield] [&::-webkit-outer-spin-button]:appearance-none [&::-webkit-inner-spin-button]:appearance-none' disabled={!hasPrice} />
{!isApproval && ( )}
{/* 2. TERUSKAN onCompare KE SINI */}
{!isApproval && ( )}
); }; export default PriceAction;