This commit is contained in:
Your Name committed 2026-10-06 19:55:05 +07:00
1 parent acee55a633
commit b7f337fb79
5 files changed
+11 -12

No files matched your search

@@ -1,5 +1,4 @@
import ProductCard from './ProductCard'; import ProductCard from './ProductCard';
import ProductSwatchCard from './ProductSwatchCard';
import { useRef } from 'react'; import { useRef } from 'react';
import { ChevronLeft, ChevronRight, ArrowRight } from 'lucide-react'; import { ChevronLeft, ChevronRight, ArrowRight } from 'lucide-react';
import { useTranslation } from 'react-i18next'; import { useTranslation } from 'react-i18next';
+2 -2
View File
@@ -1,5 +1,5 @@
import { useNavigate } from 'react-router-dom'; import { useNavigate } from 'react-router-dom';
import { useState, useMemo } from 'react'; import { useMemo } from 'react';
import type { Product, Variant, TranslatableString } from '../types'; import type { Product, Variant, TranslatableString } from '../types';
import { getCategoryImage, formatPrice } from '../types'; import { getCategoryImage, formatPrice } from '../types';
import { Heart, ShoppingBag, Layers } from 'lucide-react'; import { Heart, ShoppingBag, Layers } from 'lucide-react';
@@ -53,7 +53,7 @@ export default function ProductCard({
const { addToCart } = useCartStore(); const { addToCart } = useCartStore();
const { i18n, t } = useTranslation(); const { i18n, t } = useTranslation();
const isWished = isInWishlist(product.id); const isWished = isInWishlist(product.id);
const [selectedVariant, setSelectedVariant] = useState(product.variants?.[0] || null); const selectedVariant = product.variants?.[0] || null;
// Extract unique color swatches from variants // Extract unique color swatches from variants
const colorSwatches = useMemo(() => { const colorSwatches = useMemo(() => {
@@ -1,4 +1,4 @@
import { useState, useMemo } from 'react'; import { useMemo } from 'react';
import { Link } from 'react-router-dom'; import { Link } from 'react-router-dom';
import type { Product, Variant, TranslatableString } from '../types'; import type { Product, Variant, TranslatableString } from '../types';
import { formatPrice } from '../types'; import { formatPrice } from '../types';
@@ -36,9 +36,9 @@ export default function ProductSwatchCard({ product, badgeText }: ProductSwatchC
}, [product.variants]); }, [product.variants]);
// Active selected variant // Active selected variant
const [activeVariant, setActiveVariant] = useState<Variant | null>(() => { const activeVariant = useMemo<Variant | null>(() => {
return colorSwatches[0]?.variant || product.variants?.[0] || null; return colorSwatches[0]?.variant || product.variants?.[0] || null;
}); }, [colorSwatches, product.variants]);
// Display Image: variant image if available, else first product image // Display Image: variant image if available, else first product image
const displayImageUrl = useMemo(() => { const displayImageUrl = useMemo(() => {
+2 -2
View File
@@ -1,6 +1,6 @@
"use client" "use client"
import { useState, useMemo } from 'react' import { useMemo } from 'react'
import Image from 'next/image' import Image from 'next/image'
import Link from './LocalizedLink' import Link from './LocalizedLink'
import { ShoppingBag, Layers } from 'lucide-react' import { ShoppingBag, Layers } from 'lucide-react'
@@ -22,7 +22,7 @@ interface ProductCardProps {
export default function ProductCard({ product, cardStyle = 'standard', badgeText }: ProductCardProps) { export default function ProductCard({ product, cardStyle = 'standard', badgeText }: ProductCardProps) {
const lang = useLang() const lang = useLang()
const { addToCart } = useCartStore() const { addToCart } = useCartStore()
const [selectedVariant, setSelectedVariant] = useState(product.variants?.[0] || null) const selectedVariant = product.variants?.[0] || null
// Extract unique color swatches from variants // Extract unique color swatches from variants
const colorSwatches = useMemo(() => { const colorSwatches = useMemo(() => {
@@ -1,6 +1,6 @@
"use client" "use client"
import { useState, useMemo } from 'react' import { useMemo } from 'react'
import Image from 'next/image' import Image from 'next/image'
import Link from './LocalizedLink' import Link from './LocalizedLink'
import type { Product, Variant } from '@homaroma/types' import type { Product, Variant } from '@homaroma/types'
@@ -35,10 +35,10 @@ export default function ProductSwatchCard({ product, badgeText }: ProductSwatchC
return swatches return swatches
}, [product.variants]) }, [product.variants])
// Active selected variant (for image and price swap when clicking swatch) // Active selected variant
const [activeVariant, setActiveVariant] = useState<Variant | null>(() => { const activeVariant = useMemo<Variant | null>(() => {
return colorSwatches[0]?.variant || product.variants?.[0] || null return colorSwatches[0]?.variant || product.variants?.[0] || null
}) }, [colorSwatches, product.variants])
// Display Image: variant image if available, else first product image // Display Image: variant image if available, else first product image
const displayImageUrl = useMemo(() => { const displayImageUrl = useMemo(() => {