| import type { FC } from 'react' |
| import { memo } from 'react' |
| import { BlockEnum } from './types' |
| import { |
| Answer, |
| Assigner, |
| Code, |
| DocsExtractor, |
| End, |
| Home, |
| Http, |
| IfElse, |
| Iteration, |
| KnowledgeRetrieval, |
| ListFilter, |
| Llm, |
| ParameterExtractor, |
| QuestionClassifier, |
| TemplatingTransform, |
| VariableX, |
| } from '@/app/components/base/icons/src/vender/workflow' |
| import AppIcon from '@/app/components/base/app-icon' |
|
|
| type BlockIconProps = { |
| type: BlockEnum |
| size?: string |
| className?: string |
| toolIcon?: string | { content: string; background: string } |
| } |
| const ICON_CONTAINER_CLASSNAME_SIZE_MAP: Record<string, string> = { |
| xs: 'w-4 h-4 rounded-[5px] shadow-xs', |
| sm: 'w-5 h-5 rounded-md shadow-xs', |
| md: 'w-6 h-6 rounded-lg shadow-md', |
| } |
| const getIcon = (type: BlockEnum, className: string) => { |
| return { |
| [BlockEnum.Start]: <Home className={className} />, |
| [BlockEnum.LLM]: <Llm className={className} />, |
| [BlockEnum.Code]: <Code className={className} />, |
| [BlockEnum.End]: <End className={className} />, |
| [BlockEnum.IfElse]: <IfElse className={className} />, |
| [BlockEnum.HttpRequest]: <Http className={className} />, |
| [BlockEnum.Answer]: <Answer className={className} />, |
| [BlockEnum.KnowledgeRetrieval]: <KnowledgeRetrieval className={className} />, |
| [BlockEnum.QuestionClassifier]: <QuestionClassifier className={className} />, |
| [BlockEnum.TemplateTransform]: <TemplatingTransform className={className} />, |
| [BlockEnum.VariableAssigner]: <VariableX className={className} />, |
| [BlockEnum.VariableAggregator]: <VariableX className={className} />, |
| [BlockEnum.Assigner]: <Assigner className={className} />, |
| [BlockEnum.Tool]: <VariableX className={className} />, |
| [BlockEnum.Iteration]: <Iteration className={className} />, |
| [BlockEnum.ParameterExtractor]: <ParameterExtractor className={className} />, |
| [BlockEnum.DocExtractor]: <DocsExtractor className={className} />, |
| [BlockEnum.ListFilter]: <ListFilter className={className} />, |
| }[type] |
| } |
| const ICON_CONTAINER_BG_COLOR_MAP: Record<string, string> = { |
| [BlockEnum.Start]: 'bg-util-colors-blue-brand-blue-brand-500', |
| [BlockEnum.LLM]: 'bg-util-colors-indigo-indigo-500', |
| [BlockEnum.Code]: 'bg-util-colors-blue-blue-500', |
| [BlockEnum.End]: 'bg-util-colors-warning-warning-500', |
| [BlockEnum.IfElse]: 'bg-util-colors-cyan-cyan-500', |
| [BlockEnum.Iteration]: 'bg-util-colors-cyan-cyan-500', |
| [BlockEnum.HttpRequest]: 'bg-util-colors-violet-violet-500', |
| [BlockEnum.Answer]: 'bg-util-colors-warning-warning-500', |
| [BlockEnum.KnowledgeRetrieval]: 'bg-util-colors-green-green-500', |
| [BlockEnum.QuestionClassifier]: 'bg-util-colors-green-green-500', |
| [BlockEnum.TemplateTransform]: 'bg-util-colors-blue-blue-500', |
| [BlockEnum.VariableAssigner]: 'bg-util-colors-blue-blue-500', |
| [BlockEnum.VariableAggregator]: 'bg-util-colors-blue-blue-500', |
| [BlockEnum.Assigner]: 'bg-util-colors-blue-blue-500', |
| [BlockEnum.ParameterExtractor]: 'bg-util-colors-blue-blue-500', |
| [BlockEnum.DocExtractor]: 'bg-util-colors-green-green-500', |
| [BlockEnum.ListFilter]: 'bg-util-colors-cyan-cyan-500', |
| } |
| const BlockIcon: FC<BlockIconProps> = ({ |
| type, |
| size = 'sm', |
| className, |
| toolIcon, |
| }) => { |
| return ( |
| <div className={` |
| flex items-center justify-center border-[0.5px] border-white/2 text-white |
| ${ICON_CONTAINER_CLASSNAME_SIZE_MAP[size]} |
| ${ICON_CONTAINER_BG_COLOR_MAP[type]} |
| ${toolIcon && '!shadow-none'} |
| ${className} |
| `} |
| > |
| { |
| type !== BlockEnum.Tool && ( |
| getIcon(type, size === 'xs' ? 'w-3 h-3' : 'w-3.5 h-3.5') |
| ) |
| } |
| { |
| type === BlockEnum.Tool && toolIcon && ( |
| <> |
| { |
| typeof toolIcon === 'string' |
| ? ( |
| <div |
| className='shrink-0 w-full h-full bg-cover bg-center rounded-md' |
| style={{ |
| backgroundImage: `url(${toolIcon})`, |
| }} |
| ></div> |
| ) |
| : ( |
| <AppIcon |
| className='shrink-0 !w-full !h-full' |
| size='tiny' |
| icon={toolIcon?.content} |
| background={toolIcon?.background} |
| /> |
| ) |
| } |
| </> |
| ) |
| } |
| </div> |
| ) |
| } |
|
|
| export const VarBlockIcon: FC<BlockIconProps> = ({ |
| type, |
| className, |
| }) => { |
| return ( |
| <> |
| {getIcon(type, `w-3 h-3 ${className}`)} |
| </> |
| ) |
| } |
|
|
| export default memo(BlockIcon) |
|
|