|
import { IconMap } from '@/constants/llm'; |
|
import { cn } from '@/lib/utils'; |
|
import Icon, { UserOutlined } from '@ant-design/icons'; |
|
import { IconComponentProps } from '@ant-design/icons/lib/components/Icon'; |
|
import { Avatar } from 'antd'; |
|
import { AvatarSize } from 'antd/es/avatar/AvatarContext'; |
|
|
|
const importAll = (requireContext: __WebpackModuleApi.RequireContext) => { |
|
const list = requireContext.keys().map((key) => { |
|
const name = key.replace(/\.\/(.*)\.\w+$/, '$1'); |
|
return { name, value: requireContext(key) }; |
|
}); |
|
return list; |
|
}; |
|
|
|
let routeList: { name: string; value: string }[] = []; |
|
|
|
try { |
|
routeList = importAll(require.context('@/assets/svg', true, /\.svg$/)); |
|
} catch (error) { |
|
console.warn(error); |
|
routeList = []; |
|
} |
|
|
|
interface IProps extends IconComponentProps { |
|
name: string; |
|
width: string | number; |
|
height?: string | number; |
|
imgClass?: string; |
|
} |
|
|
|
const SvgIcon = ({ name, width, height, imgClass, ...restProps }: IProps) => { |
|
const ListItem = routeList.find((item) => item.name === name); |
|
return ( |
|
<Icon |
|
component={() => ( |
|
<img |
|
src={ListItem?.value} |
|
alt="" |
|
width={width} |
|
height={height} |
|
className={cn(imgClass, 'max-w-full')} |
|
/> |
|
)} |
|
{...(restProps as any)} |
|
/> |
|
); |
|
}; |
|
|
|
export const LlmIcon = ({ |
|
name, |
|
height = 48, |
|
width = 48, |
|
size = 'large', |
|
imgClass, |
|
}: { |
|
name: string; |
|
height?: number; |
|
width?: number; |
|
size?: AvatarSize; |
|
imgClass?: string; |
|
}) => { |
|
const icon = IconMap[name as keyof typeof IconMap]; |
|
|
|
return icon ? ( |
|
<SvgIcon |
|
name={`llm/${icon}`} |
|
width={width} |
|
height={height} |
|
imgClass={imgClass} |
|
></SvgIcon> |
|
) : ( |
|
<Avatar shape="square" size={size} icon={<UserOutlined />} /> |
|
); |
|
}; |
|
|
|
export default SvgIcon; |
|
|