dressed_for_succes_store/components/NewArrivals.tsx

103 lines
3.7 KiB
TypeScript
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

import { motion } from 'framer-motion';
import Image from 'next/image';
import { useState } from 'react';
import { Heart } from 'lucide-react';
// Типы для свойств компонента
interface NewArrivalsProps {
products: Product[];
}
// Тип для товара
interface Product {
id: number;
name: string;
price: number;
images: string[];
description: string;
isNew?: boolean;
}
export default function NewArrivals({ products }: NewArrivalsProps) {
// Состояние для отслеживания наведения на карточки товаров
const [hoveredProduct, setHoveredProduct] = useState<number | null>(null);
// Состояние для отслеживания избранных товаров
const [favorites, setFavorites] = useState<number[]>([]);
// Функция для добавления/удаления товара из избранного
const toggleFavorite = (id: number, e: React.MouseEvent) => {
e.stopPropagation();
setFavorites(prev =>
prev.includes(id)
? prev.filter(itemId => itemId !== id)
: [...prev, id]
);
};
return (
<section className="py-8 bg-white">
<div className="container mx-auto px-6">
<motion.h2
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
transition={{ delay: 0.2 }}
className="text-3xl text-center font-medium mb-12"
>
Новинки
</motion.h2>
<div className="grid grid-cols-1 md:grid-cols-2 lg:grid-cols-4 gap-x-6 gap-y-12">
{products.map((product, index) => (
<motion.div
key={product.id}
initial={{ opacity: 0, y: 20 }}
whileInView={{ opacity: 1, y: 0 }}
transition={{ delay: index * 0.1 }}
className="group relative"
onMouseEnter={() => setHoveredProduct(product.id)}
onMouseLeave={() => setHoveredProduct(null)}
>
{/* Метка "New" */}
{product.isNew && (
<div className="absolute top-4 left-4 z-10 bg-gray-100 text-gray-700 text-xs px-3 py-1 rounded-full">
New
</div>
)}
{/* Кнопка избранного */}
<button
onClick={(e) => toggleFavorite(product.id, e)}
className="absolute top-4 right-4 z-10 p-1"
>
<Heart
className={`w-6 h-6 transition-colors ${
favorites.includes(product.id)
? 'fill-black text-black'
: 'text-gray-400 hover:text-black'
}`}
/>
</button>
{/* Изображение товара */}
<div className="relative aspect-[3/4] w-full overflow-hidden mb-4">
<Image
src={hoveredProduct === product.id && product.images.length > 1 ? product.images[1] : product.images[0]}
alt={product.name}
layout="fill"
objectFit="cover"
className="transition-all duration-500 hover:scale-105"
/>
</div>
{/* Информация о товаре */}
<div className="px-1">
<h3 className="text-sm text-gray-700 mb-2 line-clamp-2">{product.name}</h3>
<p className="text-base font-medium">{product.price.toLocaleString()} </p>
</div>
</motion.div>
))}
</div>
</div>
</section>
);
}