import React, { useRef, useEffect, useState, ReactNode } from 'react'; import { isVideo } from '@/utils/basic'; interface SampleImageCardProps { imageUrl: string; alt: string; numSamples: number; sampleImages: string[]; children?: ReactNode; className?: string; onDelete?: () => void; onClick?: () => void; /** pass your scroll container element (e.g. containerRef.current) */ observerRoot?: Element | null; /** optional: tweak pre-load buffer */ rootMargin?: string; // default '200px 0px' } const SampleImageCard: React.FC = ({ imageUrl, alt, numSamples, sampleImages, children, className = '', onClick = () => {}, observerRoot = null, rootMargin = '200px 0px', }) => { const cardRef = useRef(null); const videoRef = useRef(null); const [isVisible, setIsVisible] = useState(false); const [loaded, setLoaded] = useState(false); // Observe both enter and exit useEffect(() => { const el = cardRef.current; if (!el) return; const observer = new IntersectionObserver( entries => { for (const entry of entries) { if (entry.target === el) { setIsVisible(entry.isIntersecting); } } }, { root: observerRoot ?? null, threshold: 0.01, rootMargin, }, ); observer.observe(el); return () => observer.disconnect(); }, [observerRoot, rootMargin]); const handleLoad = () => setLoaded(true); return (
{isVisible ? ( isVideo(imageUrl) ? (
); }; export default SampleImageCard;