Revert "refactor image to only render in viewport once"

This reverts commit 746951b55f.
This commit is contained in:
jeffvli
2026-01-14 18:46:09 -08:00
parent c1c07b861e
commit 1850cc68d8
+5 -32
View File
@@ -6,8 +6,6 @@ import {
type ImgHTMLAttributes, type ImgHTMLAttributes,
memo, memo,
ReactNode, ReactNode,
useEffect,
useState,
} from 'react'; } from 'react';
import { Img } from 'react-image'; import { Img } from 'react-image';
@@ -45,25 +43,6 @@ interface ImageUnloaderProps {
export const FALLBACK_SVG = export const FALLBACK_SVG =
'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMDAiIGhlaWdodD0iMzAwIj48ZmlsdGVyIGlkPSJhIiB4PSIwIiB5PSIwIj48ZmVUdXJidWxlbmNlIHR5cGU9ImZyYWN0YWxOb2lzZSIgYmFzZUZyZXF1ZW5jeT0iLjc1IiBzdGl0Y2hUaWxlcz0ic3RpdGNoIi8+PGZlQ29sb3JNYXRyaXggdHlwZT0ic2F0dXJhdGUiIHZhbHVlcz0iMCIvPjwvZmlsdGVyPjxwYXRoIGZpbHRlcj0idXJsKCNhKSIgb3BhY2l0eT0iLjA1IiBkPSJNMCAwaDMwMHYzMDBIMHoiLz48L3N2Zz4='; 'data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIzMDAiIGhlaWdodD0iMzAwIj48ZmlsdGVyIGlkPSJhIiB4PSIwIiB5PSIwIj48ZmVUdXJidWxlbmNlIHR5cGU9ImZyYWN0YWxOb2lzZSIgYmFzZUZyZXF1ZW5jeT0iLjc1IiBzdGl0Y2hUaWxlcz0ic3RpdGNoIi8+PGZlQ29sb3JNYXRyaXggdHlwZT0ic2F0dXJhdGUiIHZhbHVlcz0iMCIvPjwvZmlsdGVyPjxwYXRoIGZpbHRlcj0idXJsKCNhKSIgb3BhY2l0eT0iLjA1IiBkPSJNMCAwaDMwMHYzMDBIMHoiLz48L3N2Zz4=';
interface ImageViewportWrapperProps {
children: (shouldRenderImage: boolean, ref: ForwardedRef<HTMLDivElement>) => ReactNode;
}
const ImageViewportWrapper = ({ children }: ImageViewportWrapperProps) => {
const [hasEnteredViewport, setHasEnteredViewport] = useState(false);
const { inViewport, ref } = useInViewport();
useEffect(() => {
if (inViewport && !hasEnteredViewport) {
setHasEnteredViewport(true);
}
}, [inViewport, hasEnteredViewport]);
const shouldRenderImage = hasEnteredViewport || inViewport;
return <>{children(shouldRenderImage, ref)}</>;
};
export function BaseImage({ export function BaseImage({
className, className,
containerClassName, containerClassName,
@@ -75,26 +54,23 @@ export function BaseImage({
unloaderIcon = 'emptyImage', unloaderIcon = 'emptyImage',
...props ...props
}: ImageProps) { }: ImageProps) {
return ( const { inViewport, ref } = useInViewport();
<ImageViewportWrapper>
{(shouldRenderImage, viewportRef) => {
return ( return (
<ImageContainer <ImageContainer
className={containerClassName} className={containerClassName}
enableAnimation={enableAnimation} enableAnimation={enableAnimation}
ref={viewportRef} ref={ref}
{...imageContainerProps} {...imageContainerProps}
> >
{shouldRenderImage && src ? ( {inViewport && src ? (
<Img <Img
className={clsx(styles.image, className, { className={clsx(styles.image, className, {
[styles.animated]: enableAnimation, [styles.animated]: enableAnimation,
})} })}
decoding="async" decoding="async"
fetchPriority="high" fetchPriority="high"
loader={ loader={includeLoader ? <ImageLoader className={className} /> : null}
includeLoader ? <ImageLoader className={className} /> : null
}
loading="eager" loading="eager"
src={src} src={src}
unloader={ unloader={
@@ -111,9 +87,6 @@ export function BaseImage({
)} )}
</ImageContainer> </ImageContainer>
); );
}}
</ImageViewportWrapper>
);
} }
export const Image = memo(BaseImage); export const Image = memo(BaseImage);