mirror of
https://github.com/jeffvli/feishin.git
synced 2026-05-09 20:29:36 +02:00
re-add session cache for loaded images
This commit is contained in:
@@ -20,6 +20,8 @@ import { useDebouncedValue } from '/@/shared/hooks/use-debounced-value';
|
|||||||
import { useInViewport } from '/@/shared/hooks/use-in-viewport';
|
import { useInViewport } from '/@/shared/hooks/use-in-viewport';
|
||||||
import { ImageRequest } from '/@/shared/types/domain-types';
|
import { ImageRequest } from '/@/shared/types/domain-types';
|
||||||
|
|
||||||
|
const loadedImageCacheKeys = new Set<string>();
|
||||||
|
|
||||||
export interface ImageProps extends Omit<ImgHTMLAttributes<HTMLImageElement>, 'src'> {
|
export interface ImageProps extends Omit<ImgHTMLAttributes<HTMLImageElement>, 'src'> {
|
||||||
containerClassName?: string;
|
containerClassName?: string;
|
||||||
enableAnimation?: boolean;
|
enableAnimation?: boolean;
|
||||||
@@ -78,10 +80,14 @@ export function BaseImage({
|
|||||||
() => imageRequest ?? (src ? { cacheKey: src, url: src } : undefined),
|
() => imageRequest ?? (src ? { cacheKey: src, url: src } : undefined),
|
||||||
[imageRequest, src],
|
[imageRequest, src],
|
||||||
);
|
);
|
||||||
|
const isInSessionCache = Boolean(
|
||||||
|
rawImageRequest?.cacheKey && loadedImageCacheKeys.has(rawImageRequest.cacheKey),
|
||||||
|
);
|
||||||
const [debouncedImageRequest] = useDebouncedValue(rawImageRequest, 100, {
|
const [debouncedImageRequest] = useDebouncedValue(rawImageRequest, 100, {
|
||||||
waitForInitial: true,
|
waitForInitial: true,
|
||||||
});
|
});
|
||||||
const effectiveImageRequest = enableDebounce ? debouncedImageRequest : rawImageRequest;
|
const effectiveImageRequest =
|
||||||
|
isInSessionCache || !enableDebounce ? rawImageRequest : debouncedImageRequest;
|
||||||
|
|
||||||
const [hasLoadedInInstance, setHasLoadedInInstance] = useState(false);
|
const [hasLoadedInInstance, setHasLoadedInInstance] = useState(false);
|
||||||
|
|
||||||
@@ -90,7 +96,8 @@ export function BaseImage({
|
|||||||
}, [effectiveImageRequest?.cacheKey]);
|
}, [effectiveImageRequest?.cacheKey]);
|
||||||
|
|
||||||
const shouldLoadImage = Boolean(
|
const shouldLoadImage = Boolean(
|
||||||
effectiveImageRequest && (!enableViewport || inViewport || hasLoadedInInstance),
|
effectiveImageRequest &&
|
||||||
|
(!enableViewport || isInSessionCache || inViewport || hasLoadedInInstance),
|
||||||
);
|
);
|
||||||
|
|
||||||
const nativeImage = useNativeImage({
|
const nativeImage = useNativeImage({
|
||||||
@@ -109,6 +116,7 @@ export function BaseImage({
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
loadedImageCacheKeys.add(effectiveImageRequest.cacheKey);
|
||||||
setHasLoadedInInstance(true);
|
setHasLoadedInInstance(true);
|
||||||
}, [effectiveImageRequest?.cacheKey, nativeImage.isLoaded]);
|
}, [effectiveImageRequest?.cacheKey, nativeImage.isLoaded]);
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user