Files
mtdb_movie/common/resources/client/ui/images/mixed-image.tsx
maher 703f50a09d
Some checks failed
Build / run (push) Has been cancelled
first commit
2025-10-29 11:42:25 +01:00

55 lines
1.2 KiB
TypeScript
Executable File

import {ComponentType, HTMLAttributes, memo} from 'react';
import {SvgImage} from './svg-image/svg-image';
import {SvgIconProps} from '../../icons/svg-icon';
import {isAbsoluteUrl} from '@common/utils/urls/is-absolute-url';
interface Props extends HTMLAttributes<HTMLElement> {
src: string | ComponentType<SvgIconProps>;
className?: string;
}
export const MixedImage = memo(({src, className, ...domProps}: Props) => {
let type: 'svg' | 'image' | 'icon' | null = null;
if (!src) {
type = null;
} else if (typeof src === 'object') {
type = 'icon';
} else if (
(src as string).endsWith('.svg') &&
!isAbsoluteUrl(src as string)
) {
type = 'svg';
} else {
type = 'image';
}
if (type === 'svg') {
return (
<SvgImage
{...domProps}
className={className}
src={src as string}
height={false}
/>
);
}
if (type === 'image') {
return (
<img {...domProps} className={className} src={src as string} alt="" />
);
}
if (type === 'icon') {
const Icon = src;
return (
<Icon
{...(domProps as HTMLAttributes<SVGElement>)}
className={className}
/>
);
}
return null;
});