"use client"; import Image from "next/image"; import { useCallback, useEffect, useMemo, useState } from "react"; import HoverFillButton from "./HoverFillButton"; export type HeroSlideData = { id: string; image: string; imagePosition?: string; title: string; subtitle: string; cta: { label: string; href: string }; }; const FALLBACK_SLIDES: HeroSlideData[] = [ { id: "autumn", image: "/images/home/banners/hero.jpg", imagePosition: "object-[center_top]", title: "برای بانویی که خودش انتخاب میکند.", subtitle: "made for her", cta: { label: "کالکشن پاییزه", href: "/products?collection=autumn" }, }, { id: "new", image: "/images/home/banners/hero.jpg", imagePosition: "object-[center_top]", title: "جدیدترین‌های فصل همین حالا ببینید.", subtitle: "new arrivals", cta: { label: "جدیدترین‌ها", href: "/products?sort=newest" }, }, { id: "sale", image: "/images/home/banners/hero.jpg", imagePosition: "object-[center_top]", title: "فروش ویژه تا ۷۰٪ تخفیف", subtitle: "up to 70% off", cta: { label: "مشاهده تخفیف‌ها", href: "/products?sale=1" }, }, ]; const AUTO_MS = 10000; type HeroSliderProps = { slides?: HeroSlideData[]; }; export default function HeroSlider({ slides }: HeroSliderProps) { const list = useMemo( () => (slides?.length ? slides : FALLBACK_SLIDES), [slides], ); const [index, setIndex] = useState(0); const [textKey, setTextKey] = useState(0); const [paused, setPaused] = useState(false); const slide = list[index] ?? list[0]; useEffect(() => { setIndex(0); }, [list]); const goTo = useCallback((next: number) => { setIndex(next); setTextKey((k) => k + 1); }, []); const goPrev = () => goTo((index - 1 + list.length) % list.length); const goNext = () => goTo((index + 1) % list.length); useEffect(() => { if (paused || list.length <= 1) return; const reduce = window.matchMedia("(prefers-reduced-motion: reduce)").matches; if (reduce) return; const t = window.setInterval(() => { setIndex((i) => (i + 1) % list.length); setTextKey((k) => k + 1); }, AUTO_MS); return () => window.clearInterval(t); }, [index, paused, list.length]); if (!slide) return null; return (
setPaused(true)} onMouseLeave={() => setPaused(false)} > {list.map((s, i) => { const active = i === index; return (
); })}

{slide.title}

{slide.subtitle ? (

{slide.subtitle}

) : null} {slide.cta.label ? (
{slide.cta.label}
) : null}
{list.length > 1 ? ( <>
{list.map((s, i) => { const active = i === index; return (
) : null}
); }