'use client'; /* eslint-disable jsx-a11y/alt-text */ import { BLUR_ENABLED } from '@/app/config'; import { useAppState } from '@/state/AppState'; import { clsx} from 'clsx/lite'; import Image, { ImageProps } from 'next/image'; import { useCallback, useEffect, useState } from 'react'; export default function ImageWithFallback(props: ImageProps & { blurCompatibilityLevel?: 'none' | 'low' | 'high' classNameImage?: string }) { const { className, classNameImage = 'object-cover h-full', priority, blurDataURL, blurCompatibilityLevel = 'low', ...rest } = props; const { shouldDebugImageFallbacks } = useAppState(); const [wasCached, setWasCached] = useState(false); const [isLoading, setIsLoading] = useState(true); const [didError, setDidError] = useState(false); const onLoad = useCallback(() => setIsLoading(false), []); const onError = useCallback(() => setDidError(true), []); const [hideFallback, setHideFallback] = useState(false); useEffect(() => { if (!isLoading && !didError) { const timeout = setTimeout(() => { setHideFallback(true); }, 1000); return () => clearTimeout(timeout); } }, [isLoading, didError]); const showFallback = !wasCached && !hideFallback; const getBlurClass = () => { switch (blurCompatibilityLevel) { case 'high': // Fix poorly blurred placeholder data generated on client return 'blur-[4px] @xs:blue-md scale-[1.05]'; case 'low': return 'blur-[2px] @xs:blue-md scale-[1.01]'; } }; return (