Fix image precaching

master
Gilang R 2024-10-17 16:51:07 +09:00
parent 14cf3181ae
commit c43170d653
Signed by: sinyo1015
GPG Key ID: D40305586B71891C
1 changed files with 53 additions and 24 deletions

View File

@ -1,33 +1,62 @@
import { useEffect, useState } from "react"
import { useEffect, useState, useRef } from "react";
interface CompanyLogoProps extends React.ImgHTMLAttributes<HTMLImageElement> {
location?: string | null
location?: string | null;
}
const imageModules = import.meta.glob('/src/assets/logos/companies/*.png')
const imageModules2 = import.meta.glob('/src/assets/logos/*.png')
const imageModules = import.meta.glob('/src/assets/logos/companies/*.png');
const imageModules2 = import.meta.glob('/src/assets/logos/*.png');
export const CompanyLogo: React.FC<CompanyLogoProps> = ({location, ...imgProps}) => {
const [logoSrc, setLogoSrc] = useState<string>()
export const CompanyLogo: React.FC<CompanyLogoProps> = ({ location, ...imgProps }) => {
const [logoSrc, setLogoSrc] = useState<string>();
const imageCacheRef = useRef<Record<string, string | Promise<string>>>({});
useEffect(() => {
const loadImage = async () => {
try {
// Construct the path based on the location
const imagePath = (location == undefined || location == null) ? '/src/assets/logos/ferinesia-logo.png' : `/src/assets/logos/companies/${location}`
const module = (location == undefined || location == null) ? imageModules2[imagePath] : imageModules[imagePath]
const image = await module() as any
useEffect(() => {
const loadImage = async () => {
const imagePath = (location == undefined || location == null)
? '/src/assets/logos/ferinesia-logo.png'
: `/src/assets/logos/companies/${location}`;
setLogoSrc(image.default)
} catch (error) {
//Ignore
// Check if the image is already loaded
if (imageCacheRef.current[imagePath]) {
if (typeof imageCacheRef.current[imagePath] === "string") {
// Image is already loaded
setLogoSrc(imageCacheRef.current[imagePath]);
} else {
// Image is still loading
const cachedImageUrl = await imageCacheRef.current[imagePath];
setLogoSrc(cachedImageUrl);
}
return;
}
loadImage()
}, [location])
return <img src={logoSrc} alt="Company Logo" {...imgProps} />
}
// Load the image module and cache the promise
const module = (location == undefined || location == null)
? imageModules2[imagePath]
: imageModules[imagePath];
if (module) {
const imagePromise = module().then((image: any) => {
const imageUrl = image.default;
// Store the loaded image URL in the cache
imageCacheRef.current[imagePath] = imageUrl;
return imageUrl;
});
// Store the promise in the cache
imageCacheRef.current[imagePath] = imagePromise;
// Set the logo source once the promise resolves
const loadedImageUrl = await imagePromise;
setLogoSrc(loadedImageUrl);
} else {
// Handle case where the module doesn't exist (optional)
setLogoSrc('/src/assets/logos/ferinesia-logo.png');
}
};
loadImage();
}, [location]);
return <img src={logoSrc} alt="Company Logo" {...imgProps} />;
};