"use client"; import { useState, useEffect } from "react"; import Image from "next/image"; import Link from "next/link"; import { motion, AnimatePresence } from "framer-motion"; import { ChevronDown, Star, Minus, Plus } from "lucide-react"; import { useTranslations } from "next-intl"; import type { Product } from "@/types/saleor"; import { useSaleorCheckoutStore } from "@/stores/saleorCheckoutStore"; import { getProductPrice, getProductPriceAmount, getLocalizedProduct, formatPrice } from "@/lib/saleor"; import ProductCard from "@/components/product/ProductCard"; import ProductBenefits from "@/components/product/ProductBenefits"; import ProductReviews from "@/components/product/ProductReviews"; import AsSeenIn from "@/components/home/AsSeenIn"; import TrustBadges from "@/components/home/TrustBadges"; import BeforeAfterGallery from "@/components/home/BeforeAfterGallery"; import HowItWorks from "@/components/home/HowItWorks"; import NewsletterSection from "@/components/home/NewsletterSection"; interface ProductDetailProps { product: Product; relatedProducts: Product[]; locale?: string; } function ExpandableSection({ title, children, defaultOpen = false }: { title: string; children: React.ReactNode; defaultOpen?: boolean; }) { const [isOpen, setIsOpen] = useState(defaultOpen); return (
{isOpen && (
{children}
)}
); } function StarRating({ rating = 5, count = 0 }: { rating?: number; count?: number }) { return (
{[...Array(5)].map((_, i) => ( ))}
{count > 0 && ( ({count >= 1000 ? '1000+' : count}) )}
); } export default function ProductDetail({ product, relatedProducts, locale = "sr" }: ProductDetailProps) { const t = useTranslations("ProductDetail"); const tProduct = useTranslations("Product"); const [selectedImage, setSelectedImage] = useState(0); const [quantity, setQuantity] = useState(1); const [isAdding, setIsAdding] = useState(false); const [urgencyIndex, setUrgencyIndex] = useState(0); const { addLine, openCart } = useSaleorCheckoutStore(); useEffect(() => { const interval = setInterval(() => { setUrgencyIndex(prev => (prev + 1) % 3); }, 3000); return () => clearInterval(interval); }, []); const urgencyMessages = [ { icon: "๐Ÿš€", text: t("urgency1") }, { icon: "๐Ÿ›’", text: t("urgency2") }, { icon: "๐Ÿ‘€", text: t("urgency3") }, ]; const localized = getLocalizedProduct(product, locale); const variant = product.variants?.[0]; const images = product.media?.length > 0 ? product.media.filter(m => m.type === "IMAGE") : [{ id: "0", url: "/placeholder-product.jpg", alt: localized.name, type: "IMAGE" as const }]; const handleAddToCart = async () => { if (!variant?.id) return; setIsAdding(true); try { await addLine(variant.id, quantity); openCart(); } finally { setIsAdding(false); } }; const isAvailable = variant?.quantityAvailable > 0; const price = getProductPrice(product); const priceAmount = getProductPriceAmount(product); const originalPrice = priceAmount > 0 ? formatPrice(Math.round(priceAmount * 1.30)) : null; const shortDescription = localized.description ? localized.description.split('.')[0] + '.' : locale === "en" ? "Premium natural oil for your beauty routine." : "Premium prirodno ulje za vaลกu rutinu lepote."; const benefits = product.metadata?.find(m => m.key === "benefits")?.value?.split(',') || [ locale === "en" ? "Natural" : "Prirodno", locale === "en" ? "Organic" : "Organsko", locale === "en" ? "Cruelty-free" : "Bez okrutnosti", ]; return ( <>
{images.length > 1 && (
{images.map((image, index) => ( ))}
)}
{images[selectedImage].alt {images.length > 1 && ( <>
{images.map((_, index) => (
)}
{urgencyMessages[urgencyIndex].icon} {urgencyMessages[urgencyIndex].text}

{localized.name}

{shortDescription}

{t("stocksRunningOut")}
{originalPrice && priceAmount > 0 && (
{originalPrice} -30%
{price}
)} {!originalPrice && (
{price || tProduct("outOfStock")}
)}
{product.variants && product.variants.length > 1 && (
{t("size")}
{product.variants.map((v) => ( ))}
)}
{t("qty")}
{quantity}
{isAvailable ? ( ) : (
{t("outOfStock")}
)}

{t("freeShipping")}

{t("guarantee")}

{t("secureCheckout")}

{t("easyReturns")}

{t("benefits")}
{benefits.map((benefit, index) => ( {benefit.trim()} ))}

{t("howToUseText")}

{t("ingredientsText")}

{variant?.sku && (

SKU: {variant.sku}

)}
{relatedProducts && relatedProducts.length > 0 && (
{t("youMayAlsoLike")}

{t("similarProducts")}

{relatedProducts.filter(p => p && p.id).slice(0, 4).map((relatedProduct, index) => (
))}
)} ); }