import { useRef, useState, useEffect } from "react"; import gsap from "gsap"; import { useGSAP } from "@gsap/react"; import { ScrollTrigger } from "gsap/ScrollTrigger"; import { motion, AnimatePresence } from "motion/react"; import Button from "@/components/ui/Button"; import TextAnimation from "@/components/ui/TextAnimation"; import AvatarGroup from "@/components/ui/AvatarGroup"; import HeroBackgroundSlot from "@/components/ui/HeroBackgroundSlot"; gsap.registerPlugin(ScrollTrigger); type HeroVideoScrollProps = { videoSrc: string; tag: string; title: string; description: string; primaryButton: { text: string; href: string }; secondaryButton?: { text: string; href: string }; bottomText: string; avatarsSrc?: string[]; avatarsLabel?: string; textAnimation: "slide-up" | "fade-blur" | "fade"; }; const HeroVideoScroll = ({ videoSrc, tag, title, description, primaryButton, secondaryButton, bottomText, avatarsSrc, avatarsLabel, textAnimation, }: HeroVideoScrollProps) => { const sectionRef = useRef(null); const videoRef = useRef(null); const [isVideoLoaded, setIsVideoLoaded] = useState(false); const [showLoader, setShowLoader] = useState(true); useEffect(() => { const video = videoRef.current; if (!video) return; const handleCanPlayThrough = () => { setIsVideoLoaded(true); }; if (video.readyState >= 4) { setIsVideoLoaded(true); } else { video.addEventListener("canplaythrough", handleCanPlayThrough, { once: true }); } const timeout = setTimeout(() => { setIsVideoLoaded(true); }, 8000); return () => { video.removeEventListener("canplaythrough", handleCanPlayThrough); clearTimeout(timeout); }; }, []); useGSAP( () => { if (!isVideoLoaded) return; const video = videoRef.current; if (!video) return; const setupScrollTrigger = () => { ScrollTrigger.create({ trigger: sectionRef.current, start: "top top", end: "bottom bottom", scrub: 0.5, onUpdate: (self) => { if (video.duration) { video.currentTime = video.duration * self.progress; } }, }); }; if (video.readyState >= 1) { setupScrollTrigger(); } else { video.addEventListener("loadedmetadata", setupScrollTrigger, { once: true, }); } }, { scope: sectionRef, dependencies: [isVideoLoaded] } ); return ( <> {showLoader && ( { if (isVideoLoaded) setShowLoader(false); }} >
{tag} {tag}
)}
); }; export default HeroVideoScroll;