"use client"; import { memo } from "react"; import { Star } from "lucide-react"; import type { LucideIcon } from "lucide-react"; import Button from "@/components/button/Button"; import { useTheme } from "@/providers/themeProvider/ThemeProvider"; import { getButtonProps } from "@/lib/buttonUtils"; import { cls } from "@/lib/utils"; import type { ButtonConfig } from "@/types/button"; import ProductDetailGallery from "./ProductDetailGallery"; import ProductDetailVariantSelect from "./ProductDetailVariantSelect"; export interface ProductVariant { label: string; options: string[]; selected: string; onChange: (value: string) => void; } interface ProductDetailCardProps { layout: "page" | "section"; name: string; price: string; showRating?: boolean; rating?: number; ratingIcon?: LucideIcon; description?: string; images: { src: string; alt: string }[]; variants?: ProductVariant[]; quantity?: ProductVariant; buttons: ButtonConfig[]; className?: string; imageContainerClassName?: string; infoContainerClassName?: string; nameClassName?: string; priceClassName?: string; descriptionClassName?: string; variantSelectClassName?: string; variantLabelClassName?: string; buttonClassName?: string; } const ProductDetailCard = ({ layout, name, price, showRating = true, rating = 0, ratingIcon: RatingIcon = Star, description, images, variants, quantity, buttons, className = "", imageContainerClassName = "", infoContainerClassName = "", nameClassName = "", priceClassName = "", descriptionClassName = "", variantSelectClassName = "", variantLabelClassName = "", buttonClassName = "", }: ProductDetailCardProps) => { const theme = useTheme(); const getButtonConfigProps = () => { if (theme.defaultButtonVariant === "hover-bubble") { return { bgClassName: "w-full" }; } if (theme.defaultButtonVariant === "icon-arrow") { return { className: "justify-between" }; } return {}; }; return (

{name}

{price}

{showRating && (
{[...Array(5)].map((_, i) => ( ))}
)}
{description && (

{description}

)} {variants && variants.length > 0 && (
{variants.map((variant, index) => (
))}
)} {quantity && ( )}
{buttons.slice(0, 2).map((button, index) => (
); }; ProductDetailCard.displayName = "ProductDetailCard"; export default memo(ProductDetailCard);