|
import { |
|
memo, |
|
useCallback, |
|
} from 'react' |
|
import { useNodes } from 'reactflow' |
|
import { useStore } from './store' |
|
import { |
|
useIsChatMode, |
|
useNodesReadOnly, |
|
useNodesSyncDraft, |
|
} from './hooks' |
|
import { type CommonNodeType, type InputVar, InputVarType, type Node } from './types' |
|
import useConfig from './nodes/start/use-config' |
|
import type { StartNodeType } from './nodes/start/types' |
|
import type { PromptVariable } from '@/models/debug' |
|
import NewFeaturePanel from '@/app/components/base/features/new-feature-panel' |
|
|
|
const Features = () => { |
|
const setShowFeaturesPanel = useStore(s => s.setShowFeaturesPanel) |
|
const isChatMode = useIsChatMode() |
|
const { nodesReadOnly } = useNodesReadOnly() |
|
const { handleSyncWorkflowDraft } = useNodesSyncDraft() |
|
const nodes = useNodes<CommonNodeType>() |
|
|
|
const startNode = nodes.find(node => node.data.type === 'start') |
|
const { id, data } = startNode as Node<StartNodeType> |
|
const { handleAddVariable } = useConfig(id, data) |
|
|
|
const handleAddOpeningStatementVariable = (variables: PromptVariable[]) => { |
|
const newVariable = variables[0] |
|
const startNodeVariable: InputVar = { |
|
variable: newVariable.key, |
|
label: newVariable.name, |
|
type: InputVarType.textInput, |
|
max_length: newVariable.max_length, |
|
required: newVariable.required || false, |
|
options: [], |
|
} |
|
handleAddVariable(startNodeVariable) |
|
} |
|
|
|
const handleFeaturesChange = useCallback(() => { |
|
handleSyncWorkflowDraft() |
|
setShowFeaturesPanel(true) |
|
}, [handleSyncWorkflowDraft, setShowFeaturesPanel]) |
|
|
|
return ( |
|
<NewFeaturePanel |
|
show |
|
isChatMode={isChatMode} |
|
disabled={nodesReadOnly} |
|
onChange={handleFeaturesChange} |
|
onClose={() => setShowFeaturesPanel(false)} |
|
onAutoAddPromptVariable={handleAddOpeningStatementVariable} |
|
workflowVariables={data.variables} |
|
/> |
|
) |
|
} |
|
|
|
export default memo(Features) |
|
|