import { forwardRef, HTMLProps, ReactNode, useEffect,useMemo, useState } from "react"; import { FormattedMessage } from "react-intl"; import useImgProxy from "@/Hooks/useImgProxy"; import { getUrlHostname } from "@/Utils"; type ProxyImgProps = HTMLProps & { size?: number; sha256?: string; className?: string; promptToLoadDirectly?: boolean; missingImageElement?: ReactNode; }; export const ProxyImg = forwardRef(function ProxyImg( { size, className, promptToLoadDirectly, missingImageElement, sha256, ...props }: ProxyImgProps, ref, ) { const { proxy } = useImgProxy(); const [loadFailed, setLoadFailed] = useState(false); const [bypass, setBypass] = useState(CONFIG.media.bypassImgProxyError); const proxiedSrc = useMemo(() => proxy(props.src ?? "", size, sha256), [props.src, size, sha256]); const [src, setSrc] = useState(proxiedSrc); useEffect(() => { setLoadFailed(false); setSrc(proxy(props.src, size, sha256)); }, [props.src, size, sha256]); if (loadFailed && !bypass && (promptToLoadDirectly ?? true)) { return (
{ e.stopPropagation(); setBypass(true); }}>
); } const handleImageError = e => { if (props.onError) { props.onError(e); } else { console.error("Failed to load image: ", props.src, e); if (bypass && src === proxiedSrc) { setSrc(props.src ?? ""); } else { setLoadFailed(true); } } }; if (!src || loadFailed) return missingImageElement ??
Image not available
; return ( ); });