import React, { useRef, useEffect, useState, ReactNode } from 'react'; import { FaTrashAlt } from 'react-icons/fa'; import { openConfirm } from './ConfirmModal'; interface DatasetImageCardProps { imageUrl: string; alt: string; children?: ReactNode; className?: string; onDelete?: () => void; } const DatasetImageCard: React.FC = ({ imageUrl, alt, children, className = '', onDelete = () => {}, }) => { const cardRef = useRef(null); const [isVisible, setIsVisible] = useState(false); const [loaded, setLoaded] = useState(false); const [isCaptionLoaded, setIsCaptionLoaded] = useState(false); const [caption, setCaption] = useState(''); const isGettingCaption = useRef(false); const fetchCaption = async () => { try { if (isGettingCaption.current || isCaptionLoaded) return; isGettingCaption.current = true; const response = await fetch(`/api/caption/${encodeURIComponent(imageUrl)}`); const data = await response.text(); setCaption(data); setIsCaptionLoaded(true); } catch (error) { console.error('Error fetching caption:', error); } }; useEffect(() => { isVisible && fetchCaption(); }, [isVisible]); useEffect(() => { // Create intersection observer to check visibility const observer = new IntersectionObserver( entries => { if (entries[0].isIntersecting) { setIsVisible(true); observer.disconnect(); } }, { threshold: 0.1 }, ); if (cardRef.current) { observer.observe(cardRef.current); } return () => { observer.disconnect(); }; }, []); const handleLoad = (): void => { setLoaded(true); }; return (
{/* Square image container */}
{isVisible && ( {alt} )} {children &&
{children}
}
{/* Text area below the image */}
{isVisible && isCaptionLoaded && (