mirror of
https://github.com/jeffvli/feishin.git
synced 2026-05-10 04:30:25 +02:00
add enableViewport prop to Image to conditionally lazy load
This commit is contained in:
@@ -18,6 +18,7 @@ import { useInViewport } from '/@/shared/hooks/use-in-viewport';
|
|||||||
export interface ImageProps extends Omit<ImgHTMLAttributes<HTMLImageElement>, 'src'> {
|
export interface ImageProps extends Omit<ImgHTMLAttributes<HTMLImageElement>, 'src'> {
|
||||||
containerClassName?: string;
|
containerClassName?: string;
|
||||||
enableAnimation?: boolean;
|
enableAnimation?: boolean;
|
||||||
|
enableViewport?: boolean;
|
||||||
imageContainerProps?: Omit<ImageContainerProps, 'children'>;
|
imageContainerProps?: Omit<ImageContainerProps, 'children'>;
|
||||||
includeLoader?: boolean;
|
includeLoader?: boolean;
|
||||||
includeUnloader?: boolean;
|
includeUnloader?: boolean;
|
||||||
@@ -47,12 +48,72 @@ export function BaseImage({
|
|||||||
className,
|
className,
|
||||||
containerClassName,
|
containerClassName,
|
||||||
enableAnimation = false,
|
enableAnimation = false,
|
||||||
|
enableViewport = true,
|
||||||
imageContainerProps,
|
imageContainerProps,
|
||||||
includeLoader = true,
|
includeLoader = true,
|
||||||
includeUnloader = true,
|
includeUnloader = true,
|
||||||
src,
|
src,
|
||||||
unloaderIcon = 'emptyImage',
|
unloaderIcon = 'emptyImage',
|
||||||
...props
|
...props
|
||||||
|
}: ImageProps) {
|
||||||
|
if (enableViewport) {
|
||||||
|
return (
|
||||||
|
<ImageWithViewport
|
||||||
|
className={className}
|
||||||
|
containerClassName={containerClassName}
|
||||||
|
enableAnimation={enableAnimation}
|
||||||
|
imageContainerProps={imageContainerProps}
|
||||||
|
includeLoader={includeLoader}
|
||||||
|
includeUnloader={includeUnloader}
|
||||||
|
src={src}
|
||||||
|
unloaderIcon={unloaderIcon}
|
||||||
|
{...props}
|
||||||
|
/>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<ImageContainer
|
||||||
|
className={containerClassName}
|
||||||
|
enableAnimation={enableAnimation}
|
||||||
|
{...imageContainerProps}
|
||||||
|
>
|
||||||
|
{src ? (
|
||||||
|
<Img
|
||||||
|
className={clsx(styles.image, className, {
|
||||||
|
[styles.animated]: enableAnimation,
|
||||||
|
})}
|
||||||
|
decoding="async"
|
||||||
|
fetchPriority="high"
|
||||||
|
loader={includeLoader ? <ImageLoader className={className} /> : null}
|
||||||
|
loading="eager"
|
||||||
|
src={src}
|
||||||
|
unloader={
|
||||||
|
includeUnloader ? (
|
||||||
|
<ImageUnloader className={className} icon={unloaderIcon} />
|
||||||
|
) : null
|
||||||
|
}
|
||||||
|
{...props}
|
||||||
|
/>
|
||||||
|
) : !src ? (
|
||||||
|
<ImageUnloader className={className} icon={unloaderIcon} />
|
||||||
|
) : (
|
||||||
|
<ImageLoader className={className} />
|
||||||
|
)}
|
||||||
|
</ImageContainer>
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
function ImageWithViewport({
|
||||||
|
className,
|
||||||
|
containerClassName,
|
||||||
|
enableAnimation,
|
||||||
|
imageContainerProps,
|
||||||
|
includeLoader,
|
||||||
|
includeUnloader,
|
||||||
|
src,
|
||||||
|
unloaderIcon,
|
||||||
|
...props
|
||||||
}: ImageProps) {
|
}: ImageProps) {
|
||||||
const { inViewport, ref } = useInViewport();
|
const { inViewport, ref } = useInViewport();
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user