/* global React */ const { useState, useEffect, useRef } = React; function ScrollExpandHero({ mediaType = "video", mediaSrc, posterSrc, bgImageSrc, title, date, scrollToExpand, textBlend, children, }) { const [scrollProgress, setScrollProgress] = useState(0); const [showContent, setShowContent] = useState(false); const [mediaFullyExpanded, setMediaFullyExpanded] = useState(false); const [touchStartY, setTouchStartY] = useState(0); const [isMobile, setIsMobile] = useState(false); const videoRef = useRef(null); useEffect(() => { setScrollProgress(0); setShowContent(false); setMediaFullyExpanded(false); }, [mediaType, mediaSrc]); useEffect(() => { // Sur mobile : contenu visible directement, aucun listener if (isMobile) { setShowContent(true); setMediaFullyExpanded(true); setScrollProgress(1); return; } const handleWheel = (e) => { if (mediaFullyExpanded) return; const scrollDelta = e.deltaY * 0.0018; setScrollProgress(prev => { const next = Math.min(Math.max(prev + scrollDelta, 0), 1); if (next >= 1) { setMediaFullyExpanded(true); setShowContent(true); } return next; }); }; const handleTouchStart = (e) => { setTouchStartY(e.touches[0].clientY); }; const handleTouchMove = (e) => { if (mediaFullyExpanded || !touchStartY) return; const touchY = e.touches[0].clientY; const delta = (touchStartY - touchY) * 0.006; setScrollProgress(prev => { const next = Math.min(Math.max(prev + delta, 0), 1); if (next >= 1) { setMediaFullyExpanded(true); setShowContent(true); } return next; }); setTouchStartY(touchY); }; const handleTouchEnd = () => setTouchStartY(0); // passive: true = ne bloque pas le scroll natif du navigateur window.addEventListener("wheel", handleWheel, { passive: true }); window.addEventListener("touchstart", handleTouchStart, { passive: true }); window.addEventListener("touchmove", handleTouchMove, { passive: true }); window.addEventListener("touchend", handleTouchEnd, { passive: true }); return () => { window.removeEventListener("wheel", handleWheel); window.removeEventListener("touchstart", handleTouchStart); window.removeEventListener("touchmove", handleTouchMove); window.removeEventListener("touchend", handleTouchEnd); }; }, [isMobile, mediaFullyExpanded, touchStartY, scrollProgress]); useEffect(() => { const check = () => setIsMobile(window.innerWidth < 768); check(); window.addEventListener("resize", check); return () => window.removeEventListener("resize", check); }, []); // Force autoplay on mobile (iOS Safari requires explicit .play() call) useEffect(() => { if (videoRef.current) { videoRef.current.muted = true; const playPromise = videoRef.current.play(); if (playPromise !== undefined) { playPromise.catch(() => { // Autoplay blocked — try again on first touch const tryPlay = () => { videoRef.current && videoRef.current.play().catch(() => {}); document.removeEventListener("touchstart", tryPlay); document.removeEventListener("click", tryPlay); }; document.addEventListener("touchstart", tryPlay, { once: true }); document.addEventListener("click", tryPlay, { once: true }); }); } } }, [mediaSrc]); const mediaWidth = 300 + scrollProgress * (isMobile ? 650 : 1250); const mediaHeight = 400 + scrollProgress * (isMobile ? 200 : 400); const textTranslateX = scrollProgress * (isMobile ? 180 : 150); const firstWord = title ? title.split(" ")[0] : ""; const restOfTitle = title ? title.split(" ").slice(1).join(" ") : ""; const isYoutube = mediaType === "video" && mediaSrc && mediaSrc.includes("youtube.com"); const ytSrc = isYoutube ? mediaSrc.includes("embed") ? mediaSrc + (mediaSrc.includes("?") ? "&" : "?") + "autoplay=1&mute=1&loop=1&controls=0&showinfo=0&rel=0&disablekb=1&modestbranding=1" : mediaSrc.replace("watch?v=", "embed/") + "?autoplay=1&mute=1&loop=1&controls=0&showinfo=0&rel=0&disablekb=1&modestbranding=1&playlist=" + mediaSrc.split("v=")[1] : null; return (
{mediaType === "video" ? ( isYoutube ? (