'use client'; // سکشن ویترین محصولات: با اسکرول عمودی به اسکرول افقی پین‌شده تبدیل می‌شود (GSAP ScrollTrigger) // و یک ویدیوی پس‌زمینه دارد که با پیشرفت اسکرول جلو/عقب می‌رود. طبق درخواست کاربر، این سکشن // و هیرو از چرخه‌ی رنگ‌بندی متناوب بقیه سکشن‌ها مستثنا هستند. import {useEffect, useRef, useState} from 'react'; import {gsap} from 'gsap'; import {ScrollTrigger} from 'gsap/ScrollTrigger'; import {Modal, Button, message} from 'antd'; import {ShoppingCartOutlined} from '@ant-design/icons'; import {useDispatch} from 'react-redux'; import VendingCard from './VendingCard'; import {showcaseVideoSrc} from '@/data/content'; import {useLanguage} from '@/app/context/LanguageContext'; import {addToCart} from '@/store/cartSlice'; gsap.registerPlugin(ScrollTrigger); export default function HorizontalShowcase() { const sectionRef = useRef(null); const trackRef = useRef(null); const videoRef = useRef(null); const dispatch = useDispatch(); const {t} = useLanguage(); const [quickViewMachine, setQuickViewMachine] = useState(null); const [videoAvailable, setVideoAvailable] = useState(true); useEffect(() => { const ctx = gsap.context(() => { const track = trackRef.current; const section = sectionRef.current; if (!track || !section) return; const scrollDistance = () => track.scrollWidth - window.innerWidth; const horizontalTween = gsap.to(track, { x: () => -scrollDistance(), ease: 'none', scrollTrigger: { trigger: section, start: 'top top', end: () => `+=${scrollDistance()}`, scrub: 1, pin: true, invalidateOnRefresh: true, onUpdate: (self) => { const video = videoRef.current; if (video && video.duration) { video.currentTime = self.progress * video.duration; } }, }, }); return () => { horizontalTween.scrollTrigger?.kill(); horizontalTween.kill(); }; }, sectionRef); return () => ctx.revert(); }, []); const handleModalAddToCart = () => { if (!quickViewMachine) return; dispatch( addToCart({ id: quickViewMachine.id, name: quickViewMachine.name, priceNumeric: quickViewMachine.priceNumeric, priceLabel: quickViewMachine.priceLabel, image: quickViewMachine.image, }) ); message.success(t.cart.addToast(quickViewMachine.name)); setQuickViewMachine(null); }; return (
{videoAvailable && (
); }