import { getIcon, getIconByName, getLayeredIcon, IconTypes } from '@sd/assets/util'; import clsx from 'clsx'; import { forwardRef, Suspense, useMemo, type ImgHTMLAttributes } from 'react'; import { type ObjectKindKey } from '@sd/client'; import { useIsDark } from '~/hooks'; interface LayeredFileIconProps extends Omit, 'src'> { kind: ObjectKindKey; isDir: boolean; extension: string | null; customIcon: IconTypes | null; } const SUPPORTED_ICONS = ['Document', 'Code', 'Text', 'Config']; const positionConfig: Record = { Text: 'flex h-full w-full items-center justify-center', Code: 'flex h-full w-full items-center justify-center pt-[18px]', Config: 'flex h-full w-full items-center justify-center pt-[18px]' }; const LayeredFileIcon = forwardRef( ({ kind, isDir, extension, customIcon, ...props }, ref) => { const isDark = useIsDark(); const src = useMemo( () => customIcon ? getIconByName(customIcon, isDark) : getIcon(kind, isDark, extension, isDir), [customIcon, isDark, kind, extension, isDir] ); const iconImg = {`${kind}; if (SUPPORTED_ICONS.includes(kind) === false) { return iconImg; } const IconComponent = extension ? getLayeredIcon(kind, extension) : null; const positionClass = positionConfig[kind] || 'flex h-full w-full items-end justify-end pb-4 pr-2'; return IconComponent == null ? ( iconImg ) : (
{iconImg}
); } ); export default LayeredFileIcon;