x
This commit is contained in:
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';
|
||||||
|
|||||||
@@ -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(() => {
|
||||||
|
|||||||
@@ -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(() => {
|
||||||
|
|||||||
Reference in new issue
Block a user