'use client'; import type {Machine} from '@/types/domain'; 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 {useAppDispatch} from '@/store/hooks'; 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 = useAppDispatch(); 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 = () => ( Math.max(track.scrollWidth - window.innerWidth, 0) ); let animationFrameId: number | null = null; let latestProgress = 0; const syncVideo = (progress: number) => { latestProgress = progress; if (animationFrameId !== null) return; animationFrameId = window.requestAnimationFrame(() => { const video = videoRef.current; if (video && Number.isFinite(video.duration) && video.duration > 0) { video.currentTime = latestProgress * video.duration; } animationFrameId = null; }); }; 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) => syncVideo(self.progress), }, }); return () => { if (animationFrameId !== null) window.cancelAnimationFrame(animationFrameId); 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 && (
); }