'use client'; import { useEffect, useRef, useState } from 'react'; import { clsx } from 'clsx/lite'; import Spinner from '@/components/Spinner'; import { IMAGE_OG_DIMENSION } from '@/image-response'; import { TbPhotoQuestion } from 'react-icons/tb'; type LoadingState = 'loading' | 'loaded' | 'failed'; export default function OGLoaderImage({ title, path, retryTime, className, enabled = true, }: { title: string path: string retryTime?: number className?: string enabled?: boolean }) { const ref = useRef(null); const [loadingState, setLoadingState] = useState('loading'); const { width, height, aspectRatio } = IMAGE_OG_DIMENSION; useEffect(() => { if (!ref.current?.complete) { setLoadingState('loading'); } }, [path]); return (
{loadingState === 'loading' &&
} {loadingState === 'failed' &&
} {(loadingState === 'loading' || loadingState === 'loaded') && {title} setLoadingState('loading')} onLoad={() => setLoadingState('loaded')} onError={e => { setLoadingState('failed'); if (retryTime !== undefined) { setLoadingState('loading'); setTimeout(() => { e.currentTarget.src = ''; e.currentTarget.src = path; }, retryTime); } }} />}
); };