Files
Homarr/src/components/IconSelector/DebouncedImage.tsx

58 lines
1.2 KiB
TypeScript
Raw Normal View History

import { Image, Loader, createStyles } from '@mantine/core';
import { useDebouncedValue } from '@mantine/hooks';
import { IconPhotoOff } from '@tabler/icons';
interface DebouncedImageProps {
width: number;
height: number;
src: string;
debouncedWaitPeriod?: number;
}
export const DebouncedImage = ({
src,
width,
height,
debouncedWaitPeriod = 1000,
}: DebouncedImageProps) => {
const { classes } = useStyles();
const [debouncedIconImageUrl] = useDebouncedValue(src, debouncedWaitPeriod);
if (debouncedIconImageUrl !== src) {
return <Loader width={width} height={height} />;
}
if (debouncedIconImageUrl.length > 0) {
return (
<Image
placeholder={<IconPhotoOff />}
className={classes.iconImage}
src={debouncedIconImageUrl}
width={width}
height={height}
fit="contain"
alt=""
withPlaceholder
/>
);
}
return (
<Image
className={classes.iconImage}
src="/imgs/logo/logo.png"
width={width}
height={height}
fit="contain"
alt=""
withPlaceholder
/>
);
};
const useStyles = createStyles(() => ({
iconImage: {
objectFit: 'contain',
},
}));