import { forwardRef, HTMLProps, memo, ReactNode, useEffect, useState } from "react"; import { FormattedMessage } from "react-intl"; import Icon from "@/Components/Icons/Icon"; import useImgProxy from "@/Hooks/useImgProxy"; import { getUrlHostname } from "@/Utils"; type ProxyImgProps = HTMLProps & { size?: number; sha256?: string; className?: string; promptToLoadDirectly?: boolean; missingImageElement?: ReactNode; }; const defaultMissingImageElement = ; const ProxyImgComponent = forwardRef(function ProxyImg( { src, size, className, promptToLoadDirectly, missingImageElement, sha256, ...props }: ProxyImgProps, ref, ) { const { proxy } = useImgProxy(); const [loadFailed, setLoadFailed] = useState(false); const [bypass, setBypass] = useState(CONFIG.media.bypassImgProxyError); const [imgSrc, setImgSrc] = useState(src ? proxy(src, size, sha256) : undefined); useEffect(() => { setLoadFailed(false); if (src) { setImgSrc(proxy(src, size, sha256)); } }, [src, size, sha256]); if (loadFailed && !bypass && (promptToLoadDirectly ?? true)) { return (
{ e.stopPropagation(); setBypass(true); }}>
); } const handleImageError = (e: React.SyntheticEvent) => { console.warn("ImgLoadOnError", src, e); if (props.onError) { props.onError(e); } else { if (bypass && imgSrc !== src) { setImgSrc(src ?? ""); } else { setLoadFailed(true); } } }; if (!imgSrc || loadFailed) { return missingImageElement ?? defaultMissingImageElement; } return ( ); }); const ProxyImg = memo(ProxyImgComponent); ProxyImg.displayName = "ProxyImg"; export { ProxyImg };