| import type { FC } from 'react' |
| import React from 'react' |
| import { useTranslation } from 'react-i18next' |
| import type { NodeProps } from 'reactflow' |
| import InfoPanel from '../_base/components/info-panel' |
| import { NodeSourceHandle } from '../_base/components/node-handle' |
| import type { QuestionClassifierNodeType } from './types' |
| import { |
| useTextGenerationCurrentProviderAndModelAndModelList, |
| } from '@/app/components/header/account-setting/model-provider-page/hooks' |
| import ModelSelector from '@/app/components/header/account-setting/model-provider-page/model-selector' |
|
|
| const i18nPrefix = 'workflow.nodes.questionClassifiers' |
|
|
| const Node: FC<NodeProps<QuestionClassifierNodeType>> = (props) => { |
| const { t } = useTranslation() |
|
|
| const { data } = props |
| const { provider, name: modelId } = data.model |
| |
| const topics = data.classes |
| const { |
| textGenerationModelList, |
| } = useTextGenerationCurrentProviderAndModelAndModelList() |
| const hasSetModel = provider && modelId |
|
|
| if (!hasSetModel && !topics.length) |
| return null |
|
|
| return ( |
| <div className='mb-1 px-3 py-1'> |
| {hasSetModel && ( |
| <ModelSelector |
| defaultModel={{ provider, model: modelId }} |
| modelList={textGenerationModelList} |
| readonly |
| /> |
| )} |
| { |
| !!topics.length && ( |
| <div className='mt-2 space-y-0.5'> |
| {topics.map((topic, index) => ( |
| <div |
| key={index} |
| className='relative' |
| > |
| <InfoPanel |
| title={`${t(`${i18nPrefix}.class`)} ${index + 1}`} |
| content={topic.name} |
| /> |
| <NodeSourceHandle |
| {...props} |
| handleId={topic.id} |
| handleClassName='!top-1/2 !-translate-y-1/2 !-right-[21px]' |
| /> |
| </div> |
| ))} |
| </div> |
| ) |
| } |
| </div> |
| ) |
| } |
|
|
| export default React.memo(Node) |
|
|