|
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) |
|
|