'use client'; /* eslint-disable jsx-a11y/alt-text */ import { BLUR_ENABLED } from '@/app/config'; import { useAppState } from '@/app/AppState'; import { clsx} from 'clsx/lite'; import Image, { ImageProps } from 'next/image'; import { useCallback, useEffect, useRef, useState } from 'react'; export default function ImageWithFallback({ className, classNameImage = 'object-cover h-full', forceFallbackFade = false, blurDataURL, blurCompatibilityLevel = 'low', priority, ...props }: ImageProps & { blurCompatibilityLevel?: 'none' | 'low' | 'high' classNameImage?: string forceFallbackFade?: boolean }) { const ref = useRef(null); const { shouldDebugImageFallbacks } = useAppState(); const [isLoading, setIsLoading] = useState(true); const [didError, setDidError] = useState(false); const [fadeFallbackTransition, setFadeFallbackTransition] = useState(forceFallbackFade); const onLoad = useCallback(() => setIsLoading(false), []); const onError = useCallback(() => setDidError(true), []); useEffect(() => { if ( !ref.current?.complete || (ref.current?.naturalWidth ?? 0) === 0 ) { setFadeFallbackTransition(true); } }, []); 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 (
{(BLUR_ENABLED && blurDataURL) ? :
}
); }