import { Box, Skeleton, Tooltip } from '@chakra-ui/react';
import { HeartIcon } from '@heroicons/react/24/outline';
import { Info } from 'lucide-react';
import { useRouter } from 'next/router';
import { useCallback, useEffect, useRef, useState } from 'react';
import { toast } from 'react-hot-toast';
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 productSimilarApi from '../../api/productSimilarApi';
import ProductCard from '../ProductCard';
import ProductSimilar from '../ProductSimilar';
const ProductDesktopVariant = ({
product,
wishlist,
toggleWishlist,
isVariant,
}) => {
const router = useRouter();
const auth = useAuth();
const { slug } = router.query;
const [lowestPrice, setLowestPrice] = useState(null);
const [addCartAlert, setAddCartAlert] = useState(false);
const [isLoadingSLA, setIsLoadingSLA] = useState(true);
const { setRefreshCart } = useProductCartContext();
const getLowestPrice = useCallback(() => {
const lowest = product.price;
/* const lowest = prices.reduce((lowest, price) => {
return price.priceDiscount < lowest.priceDiscount ? price : lowest
}, prices[0])*/
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}`);
return;
}
const quantity = variantQuantityRefs.current[product.id].value;
if (!validQuantity(quantity)) return;
updateItemCart({
productId: product.id,
quantity,
programLineId: null,
selected: true,
source: null,
}).then(() => {
setRefreshCart(true);
});
setAddCartAlert(true);
};
const handleBuy = (variant) => {
const quantity = variantQuantityRefs.current[product.id].value;
if (!validQuantity(quantity)) return;
updateItemCart({
productId: variant,
quantity,
programLineId: null,
selected: true,
source: 'buy',
});
router.push(`/shop/checkout?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]);
return (
{product?.name}
{product?.price?.price > 0 ? (
<>
{currencyFormat(product?.price?.price)}
)}