"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[selectedImage].url})
{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("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) => (
))}
)}
>
);
}