"use client" import { useState, useRef, useEffect } from "react" import Image from "next/image" import { Heart, ChevronLeft, ChevronRight } from "lucide-react" import Link from "next/link" import { Product, formatPrice } from "../data/products" import { motion } from "framer-motion" interface NewArrivalsProps { products: Product[] } export default function NewArrivals({ products }: NewArrivalsProps) { const [hoveredProduct, setHoveredProduct] = useState(null) const [favorites, setFavorites] = useState([]) const sliderRef = useRef(null) const [showLeftArrow, setShowLeftArrow] = useState(false) const [showRightArrow, setShowRightArrow] = useState(true) const [isDragging, setIsDragging] = useState(false) const [startX, setStartX] = useState(0) const [scrollLeftValue, setScrollLeftValue] = useState(0) const [currentSlide, setCurrentSlide] = useState(0) const [slidesPerView, setSlidesPerView] = useState(4) // Функция для добавления/удаления товара из избранного const toggleFavorite = (id: number, e: React.MouseEvent) => { e.stopPropagation() e.preventDefault() setFavorites((prev) => (prev.includes(id) ? prev.filter((itemId) => itemId !== id) : [...prev, id])) } // Определение количества слайдов на экране в зависимости от размера экрана useEffect(() => { const handleResize = () => { const width = window.innerWidth; if (width < 640) { setSlidesPerView(1); } else if (width < 768) { setSlidesPerView(2); } else if (width < 1024) { setSlidesPerView(3); } else { setSlidesPerView(4); } }; handleResize(); window.addEventListener("resize", handleResize); return () => window.removeEventListener("resize", handleResize); }, []); // Обновление состояния стрелок при скролле const updateArrowVisibility = () => { if (sliderRef.current) { const { scrollLeft, scrollWidth, clientWidth } = sliderRef.current setShowLeftArrow(scrollLeft > 0) setShowRightArrow(scrollLeft < scrollWidth - clientWidth - 5) // 5px buffer // Обновление текущего слайда if (clientWidth > 0) { const slideWidth = scrollWidth / products.length; const newCurrentSlide = Math.round(scrollLeft / slideWidth); setCurrentSlide(newCurrentSlide); } } } // Инициализация и обработка изменений размера useEffect(() => { updateArrowVisibility() window.addEventListener("resize", updateArrowVisibility) return () => window.removeEventListener("resize", updateArrowVisibility) }, []) // Обработчики скролла const handleScroll = () => { updateArrowVisibility() } const scrollLeft = () => { if (sliderRef.current) { const itemWidth = sliderRef.current.scrollWidth / products.length; const newScrollLeft = Math.max(0, sliderRef.current.scrollLeft - (itemWidth * slidesPerView)); sliderRef.current.scrollTo({ left: newScrollLeft, behavior: "smooth" }); } } const scrollRight = () => { if (sliderRef.current) { const itemWidth = sliderRef.current.scrollWidth / products.length; const newScrollLeft = Math.min( sliderRef.current.scrollWidth - sliderRef.current.clientWidth, sliderRef.current.scrollLeft + (itemWidth * slidesPerView) ); sliderRef.current.scrollTo({ left: newScrollLeft, behavior: "smooth" }); } } // Обработчики перетаскивания (для мобильных) const handleMouseDown = (e: React.MouseEvent) => { setIsDragging(true) setStartX(e.pageX - (sliderRef.current?.offsetLeft || 0)) setScrollLeftValue(sliderRef.current?.scrollLeft || 0) } const handleMouseUp = () => { setIsDragging(false) } const handleMouseMove = (e: React.MouseEvent) => { if (!isDragging) return e.preventDefault() if (sliderRef.current) { const x = e.pageX - (sliderRef.current.offsetLeft || 0) const walk = (x - startX) * 2 // Скорость скролла sliderRef.current.scrollLeft = scrollLeftValue - walk } } const handleMouseLeave = () => { setIsDragging(false) } // Обработчики тач-событий const handleTouchStart = (e: React.TouchEvent) => { if (sliderRef.current) { setStartX(e.touches[0].pageX - (sliderRef.current.offsetLeft || 0)) setScrollLeftValue(sliderRef.current.scrollLeft) } } const handleTouchMove = (e: React.TouchEvent) => { if (sliderRef.current) { const x = e.touches[0].pageX - (sliderRef.current.offsetLeft || 0) const walk = (x - startX) * 2 sliderRef.current.scrollLeft = scrollLeftValue - walk } } // Переход к определенному слайду const goToSlide = (index: number) => { if (sliderRef.current) { const itemWidth = sliderRef.current.scrollWidth / products.length; sliderRef.current.scrollTo({ left: itemWidth * index, behavior: "smooth" }); } }; return (

Новинки

{/* Контейнер слайдера с кнопками навигации */}
{/* Кнопка влево */} {showLeftArrow && ( )} {/* Слайдер продуктов */}
{products.map((product) => ( setHoveredProduct(product.id)} onMouseLeave={() => setHoveredProduct(null)} >
1 ? product.images[1] : product.images[0] } alt={product.name} fill sizes="(max-width: 640px) 280px, (max-width: 768px) 320px, (max-width: 1024px) 300px, 280px" className="object-cover transition-all duration-500 hover:scale-105" /> {product.isNew && ( Новинка )}

{product.name}

{formatPrice(product.price)} ₽

))}
{/* Кнопка вправо */} {showRightArrow && ( )}
{/* Индикаторы слайдов (точки) */}
{Array.from({ length: Math.ceil(products.length / slidesPerView) }).map((_, index) => (
) }