Commit 43768139 authored by Joel's avatar Joel

feat: get and set data use context

parent ccd3e519
import type { FC } from 'react' import type { FC } from 'react'
import type { CodeNodeType } from './types'
import type { NodeProps } from '@/app/components/workflow/types'
const Node: FC = () => { const Node: FC<NodeProps<CodeNodeType>> = () => {
return ( return (
// No summary content // No summary content
<div></div> <div></div>
......
import type { FC } from 'react' import type { FC } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import useConfig from './use-config' import useConfig from './use-config'
import { mockData } from './mock' import type { CodeNodeType } from './types'
import { CodeLanguage } from './types' import { CodeLanguage } from './types'
import VarList from '@/app/components/workflow/nodes/_base/components/variable/var-list' import VarList from '@/app/components/workflow/nodes/_base/components/variable/var-list'
import OutputVarList from '@/app/components/workflow/nodes/_base/components/variable/output-var-list' import OutputVarList from '@/app/components/workflow/nodes/_base/components/variable/output-var-list'
...@@ -10,6 +10,8 @@ import Field from '@/app/components/workflow/nodes/_base/components/field' ...@@ -10,6 +10,8 @@ import Field from '@/app/components/workflow/nodes/_base/components/field'
import Split from '@/app/components/workflow/nodes/_base/components/split' import Split from '@/app/components/workflow/nodes/_base/components/split'
import CodeEditor from '@/app/components/workflow/nodes/_base/components/editor/code-editor' import CodeEditor from '@/app/components/workflow/nodes/_base/components/editor/code-editor'
import TypeSelector from '@/app/components/workflow/nodes/_base/components/selector' import TypeSelector from '@/app/components/workflow/nodes/_base/components/selector'
import type { NodeProps } from '@/app/components/workflow/types'
const i18nPrefix = 'workflow.nodes.code' const i18nPrefix = 'workflow.nodes.code'
const codeLanguages = [ const codeLanguages = [
...@@ -22,7 +24,10 @@ const codeLanguages = [ ...@@ -22,7 +24,10 @@ const codeLanguages = [
value: CodeLanguage.javascript, value: CodeLanguage.javascript,
}, },
] ]
const Panel: FC = () => { const Panel: FC<NodeProps<CodeNodeType>> = ({
id,
data,
}) => {
const { t } = useTranslation() const { t } = useTranslation()
const readOnly = false const readOnly = false
...@@ -34,7 +39,7 @@ const Panel: FC = () => { ...@@ -34,7 +39,7 @@ const Panel: FC = () => {
handleCodeLanguageChange, handleCodeLanguageChange,
handleOutputVarListChange, handleOutputVarListChange,
handleAddOutputVariable, handleAddOutputVariable,
} = useConfig(mockData) } = useConfig(id, data)
return ( return (
<div className='mt-2'> <div className='mt-2'>
<div className='px-4 pb-4 space-y-4'> <div className='px-4 pb-4 space-y-4'>
......
import { useCallback, useState } from 'react' import { useCallback } from 'react'
import produce from 'immer'
import useVarList from '../_base/hooks/use-var-list' import useVarList from '../_base/hooks/use-var-list'
import useOutputVarList from '../_base/hooks/use-output-var-list' import useOutputVarList from '../_base/hooks/use-output-var-list'
import type { CodeLanguage, CodeNodeType } from './types' import type { CodeLanguage, CodeNodeType } from './types'
import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
const useConfig = (initInputs: CodeNodeType) => { const useConfig = (id: string, payload: CodeNodeType) => {
const [inputs, setInputs] = useState<CodeNodeType>(initInputs) const { inputs, setInputs } = useNodeCrud<CodeNodeType>(id, payload)
const { handleVarListChange, handleAddVariable } = useVarList<CodeNodeType>({ const { handleVarListChange, handleAddVariable } = useVarList<CodeNodeType>({
inputs, inputs,
setInputs, setInputs,
}) })
const handleCodeChange = useCallback((code: string) => { const handleCodeChange = useCallback((code: string) => {
setInputs(prev => ({ ...prev, code })) const newInputs = produce(inputs, (draft) => {
draft.code = code
})
setInputs(newInputs)
}, [setInputs]) }, [setInputs])
const handleCodeLanguageChange = useCallback((codeLanguage: CodeLanguage) => { const handleCodeLanguageChange = useCallback((codeLanguage: CodeLanguage) => {
setInputs(prev => ({ ...prev, code_language: codeLanguage })) const newInputs = produce(inputs, (draft) => {
draft.code_language = codeLanguage
})
setInputs(newInputs)
}, [setInputs]) }, [setInputs])
const { handleVarListChange: handleOutputVarListChange, handleAddVariable: handleAddOutputVariable } = useOutputVarList<CodeNodeType>({ const { handleVarListChange: handleOutputVarListChange, handleAddVariable: handleAddOutputVariable } = useOutputVarList<CodeNodeType>({
......
import type { FC } from 'react' import type { FC } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import InfoPanel from '../_base/components/info-panel' import InfoPanel from '../_base/components/info-panel'
import { mockData } from './mock' import type { DirectAnswerNodeType } from './types'
import type { NodeProps } from '@/app/components/workflow/types'
const Node: FC = () => { const Node: FC<NodeProps<DirectAnswerNodeType>> = ({
data,
}) => {
const { t } = useTranslation() const { t } = useTranslation()
return ( return (
<div className='px-3'> <div className='px-3'>
<InfoPanel title={t('workflow.nodes.directAnswer.answer')} content={mockData.answer} /> <InfoPanel title={t('workflow.nodes.directAnswer.answer')} content={data.answer} />
</div> </div>
) )
} }
......
import type { FC } from 'react' import type { FC } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import useConfig from './use-config' import useConfig from './use-config'
import { mockData } from './mock' import type { DirectAnswerNodeType } from './types'
import VarList from '@/app/components/workflow/nodes/_base/components/variable/var-list' import VarList from '@/app/components/workflow/nodes/_base/components/variable/var-list'
import Field from '@/app/components/workflow/nodes/_base/components/field' import Field from '@/app/components/workflow/nodes/_base/components/field'
import AddButton from '@/app/components/base/button/add-button' import AddButton from '@/app/components/base/button/add-button'
import Split from '@/app/components/workflow/nodes/_base/components/split' import Split from '@/app/components/workflow/nodes/_base/components/split'
import Editor from '@/app/components/workflow/nodes/_base/components/prompt/editor' import Editor from '@/app/components/workflow/nodes/_base/components/prompt/editor'
import type { NodeProps } from '@/app/components/workflow/types'
const i18nPrefix = 'workflow.nodes.directAnswer' const i18nPrefix = 'workflow.nodes.directAnswer'
const Panel: FC = () => { const Panel: FC<NodeProps<DirectAnswerNodeType>> = ({
id,
data,
}) => {
const { t } = useTranslation() const { t } = useTranslation()
const readOnly = false const readOnly = false
...@@ -18,7 +23,7 @@ const Panel: FC = () => { ...@@ -18,7 +23,7 @@ const Panel: FC = () => {
handleVarListChange, handleVarListChange,
handleAddVariable, handleAddVariable,
handleAnswerChange, handleAnswerChange,
} = useConfig(mockData) } = useConfig(id, data)
return ( return (
<div className='mt-2 px-4 space-y-4'> <div className='mt-2 px-4 space-y-4'>
......
import { useCallback, useState } from 'react' import { useCallback } from 'react'
import produce from 'immer' import produce from 'immer'
import useVarList from '../_base/hooks/use-var-list' import useVarList from '../_base/hooks/use-var-list'
import type { DirectAnswerNodeType } from './types' import type { DirectAnswerNodeType } from './types'
import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
const useConfig = (initInputs: DirectAnswerNodeType) => { const useConfig = (id: string, payload: DirectAnswerNodeType) => {
const [inputs, setInputs] = useState<DirectAnswerNodeType>(initInputs) const { inputs, setInputs } = useNodeCrud<DirectAnswerNodeType>(id, payload)
// variables // variables
const { handleVarListChange, handleAddVariable } = useVarList<DirectAnswerNodeType>({ const { handleVarListChange, handleAddVariable } = useVarList<DirectAnswerNodeType>({
inputs, inputs,
......
import type { FC } from 'react' import type { FC } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import { mockData } from './mock' import type { EndNodeType } from './types'
import type { NodeProps } from '@/app/components/workflow/types'
const i18nPrefix = 'workflow.nodes.end' const i18nPrefix = 'workflow.nodes.end'
const Node: FC = () => { const Node: FC<NodeProps<EndNodeType>> = ({
data,
}) => {
const { t } = useTranslation() const { t } = useTranslation()
const { outputs } = mockData const { outputs } = data
return ( return (
<div className='px-3'> <div className='px-3'>
<div className='flex items-center h-6 justify-between bg-gray-100 rounded-md px-1 space-x-1 text-xs font-normal text-gray-700'> <div className='flex items-center h-6 justify-between bg-gray-100 rounded-md px-1 space-x-1 text-xs font-normal text-gray-700'>
......
...@@ -3,11 +3,13 @@ import { useTranslation } from 'react-i18next' ...@@ -3,11 +3,13 @@ import { useTranslation } from 'react-i18next'
import cn from 'classnames' import cn from 'classnames'
import VarReferencePicker from '../_base/components/variable/var-reference-picker' import VarReferencePicker from '../_base/components/variable/var-reference-picker'
import useConfig from './use-config' import useConfig from './use-config'
import { mockData } from './mock' import type { EndNodeType } from './types'
import { EndVarType } from './types' import { EndVarType } from './types'
import VarList from '@/app/components/workflow/nodes/_base/components/variable/var-list' import VarList from '@/app/components/workflow/nodes/_base/components/variable/var-list'
import Field from '@/app/components/workflow/nodes/_base/components/field' import Field from '@/app/components/workflow/nodes/_base/components/field'
import AddButton from '@/app/components/base/button/add-button' import AddButton from '@/app/components/base/button/add-button'
import type { NodeProps } from '@/app/components/workflow/types'
const i18nPrefix = 'workflow.nodes.end' const i18nPrefix = 'workflow.nodes.end'
const TypeItem = ({ type, current, onClick }: { type: EndVarType; current: EndVarType; onClick: (type: EndVarType) => void }) => { const TypeItem = ({ type, current, onClick }: { type: EndVarType; current: EndVarType; onClick: (type: EndVarType) => void }) => {
...@@ -33,7 +35,10 @@ const TypeItem = ({ type, current, onClick }: { type: EndVarType; current: EndVa ...@@ -33,7 +35,10 @@ const TypeItem = ({ type, current, onClick }: { type: EndVarType; current: EndVa
const allTypes = [EndVarType.plainText, EndVarType.structured, EndVarType.none] const allTypes = [EndVarType.plainText, EndVarType.structured, EndVarType.none]
const Panel: FC = () => { const Panel: FC<NodeProps<EndNodeType>> = ({
id,
data,
}) => {
const { t } = useTranslation() const { t } = useTranslation()
const readOnly = false const readOnly = false
...@@ -43,7 +48,7 @@ const Panel: FC = () => { ...@@ -43,7 +48,7 @@ const Panel: FC = () => {
handleVarListChange, handleVarListChange,
handelPlainTextSelectorChange, handelPlainTextSelectorChange,
handleAddVariable, handleAddVariable,
} = useConfig(mockData) } = useConfig(id, data)
const outputs = inputs.outputs const outputs = inputs.outputs
return ( return (
......
import produce from 'immer' import produce from 'immer'
import { useCallback, useState } from 'react' import { useCallback } from 'react'
import useVarList from '../_base/hooks/use-var-list' import useVarList from '../_base/hooks/use-var-list'
import type { EndNodeType, EndVarType, OutPuts } from './types' import type { EndNodeType, EndVarType, OutPuts } from './types'
import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
const useConfig = (initInputs: EndNodeType) => { const useConfig = (id: string, payload: EndNodeType) => {
const [inputs, setInputs] = useState<EndNodeType>(initInputs) const { inputs, setInputs } = useNodeCrud<EndNodeType>(id, payload)
const handleOutputTypeChange = useCallback((type: EndVarType) => { const handleOutputTypeChange = useCallback((type: EndVarType) => {
const newInputs = produce(inputs, (draft: any) => { const newInputs = produce(inputs, (draft: any) => {
draft.outputs.type = type draft.outputs.type = type
......
...@@ -13,7 +13,7 @@ const i18nPrefix = 'workflow.nodes.http.authorization' ...@@ -13,7 +13,7 @@ const i18nPrefix = 'workflow.nodes.http.authorization'
type Props = { type Props = {
payload: AuthorizationPayloadType payload: AuthorizationPayloadType
onChange: (newPayload: AuthorizationPayloadType) => void onChange: (payload: AuthorizationPayloadType) => void
isShow: boolean isShow: boolean
onHide: () => void onHide: () => void
} }
......
...@@ -13,7 +13,7 @@ import CodeEditor from '../../../_base/components/editor/code-editor' ...@@ -13,7 +13,7 @@ import CodeEditor from '../../../_base/components/editor/code-editor'
type Props = { type Props = {
readonly: boolean readonly: boolean
payload: Body payload: Body
onChange: (newPayload: Body) => void onChange: (payload: Body) => void
} }
const allTypes = [ const allTypes = [
......
import type { FC } from 'react' import type { FC } from 'react'
import { mockData } from './mock' import type { HttpNodeType } from './types'
import type { NodeProps } from '@/app/components/workflow/types'
const Node: FC = () => { const Node: FC<NodeProps<HttpNodeType>> = ({
const { method, url } = mockData data,
}) => {
const { method, url } = data
return ( return (
<div className='px-3'> <div className='px-3'>
<div className='flex items-center p-1 rounded-md bg-gray-100'> <div className='flex items-center p-1 rounded-md bg-gray-100'>
......
import type { FC } from 'react' import type { FC } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import useConfig from './use-config' import useConfig from './use-config'
import { mockData } from './mock'
import ApiInput from './components/api-input' import ApiInput from './components/api-input'
import KeyValue from './components/key-value' import KeyValue from './components/key-value'
import EditBody from './components/edit-body' import EditBody from './components/edit-body'
import AuthorizationModal from './components/authorization' import AuthorizationModal from './components/authorization'
import type { HttpNodeType } from './types'
import VarList from '@/app/components/workflow/nodes/_base/components/variable/var-list' import VarList from '@/app/components/workflow/nodes/_base/components/variable/var-list'
import Field from '@/app/components/workflow/nodes/_base/components/field' import Field from '@/app/components/workflow/nodes/_base/components/field'
import AddButton from '@/app/components/base/button/add-button' import AddButton from '@/app/components/base/button/add-button'
import Split from '@/app/components/workflow/nodes/_base/components/split' import Split from '@/app/components/workflow/nodes/_base/components/split'
import OutputVars, { VarItem } from '@/app/components/workflow/nodes/_base/components/output-vars' import OutputVars, { VarItem } from '@/app/components/workflow/nodes/_base/components/output-vars'
import { Settings01 } from '@/app/components/base/icons/src/vender/line/general' import { Settings01 } from '@/app/components/base/icons/src/vender/line/general'
import type { NodeProps } from '@/app/components/workflow/types'
const i18nPrefix = 'workflow.nodes.http' const i18nPrefix = 'workflow.nodes.http'
const Panel: FC = () => { const Panel: FC<NodeProps<HttpNodeType>> = ({
id,
data,
}) => {
const { t } = useTranslation() const { t } = useTranslation()
const readOnly = false const readOnly = false
...@@ -39,7 +43,7 @@ const Panel: FC = () => { ...@@ -39,7 +43,7 @@ const Panel: FC = () => {
showAuthorization, showAuthorization,
hideAuthorization, hideAuthorization,
setAuthorization, setAuthorization,
} = useConfig(mockData) } = useConfig(id, data)
return ( return (
<div className='mt-2'> <div className='mt-2'>
......
import { useCallback, useState } from 'react' import { useCallback } from 'react'
import produce from 'immer' import produce from 'immer'
import { useBoolean } from 'ahooks' import { useBoolean } from 'ahooks'
import useVarList from '../_base/hooks/use-var-list' import useVarList from '../_base/hooks/use-var-list'
import type { Authorization, Body, HttpNodeType, Method } from './types' import type { Authorization, Body, HttpNodeType, Method } from './types'
import useKeyValueList from './hooks/use-key-value-list' import useKeyValueList from './hooks/use-key-value-list'
const useConfig = (initInputs: HttpNodeType) => { import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
const [inputs, setInputs] = useState<HttpNodeType>(initInputs)
const useConfig = (id: string, payload: HttpNodeType) => {
const { inputs, setInputs } = useNodeCrud<HttpNodeType>(id, payload)
const { handleVarListChange, handleAddVariable } = useVarList<HttpNodeType>({ const { handleVarListChange, handleAddVariable } = useVarList<HttpNodeType>({
inputs, inputs,
...@@ -13,17 +15,17 @@ const useConfig = (initInputs: HttpNodeType) => { ...@@ -13,17 +15,17 @@ const useConfig = (initInputs: HttpNodeType) => {
}) })
const handleMethodChange = useCallback((method: Method) => { const handleMethodChange = useCallback((method: Method) => {
setInputs(prev => ({ const newInputs = produce(inputs, (draft: HttpNodeType) => {
...prev, draft.method = method
method, })
})) setInputs(newInputs)
}, []) }, [])
const handleUrlChange = useCallback((url: string) => { const handleUrlChange = useCallback((url: string) => {
setInputs(prev => ({ const newInputs = produce(inputs, (draft: HttpNodeType) => {
...prev, draft.url = url
url, })
})) setInputs(newInputs)
}, []) }, [])
const { const {
......
...@@ -2,14 +2,15 @@ import type { FC } from 'react' ...@@ -2,14 +2,15 @@ import type { FC } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import type { NodeProps } from 'reactflow' import type { NodeProps } from 'reactflow'
import { NodeSourceHandle } from '../_base/components/node-handle' import { NodeSourceHandle } from '../_base/components/node-handle'
import { mockData } from './mock'
import { isComparisonOperatorNeedTranslate, isEmptyRelatedOperator } from './utils' import { isComparisonOperatorNeedTranslate, isEmptyRelatedOperator } from './utils'
import type { IfElseNodeType } from './types'
import { Variable02 } from '@/app/components/base/icons/src/vender/solid/development' import { Variable02 } from '@/app/components/base/icons/src/vender/solid/development'
const i18nPrefix = 'workflow.nodes.ifElse' const i18nPrefix = 'workflow.nodes.ifElse'
const IfElseNode: FC<Pick<NodeProps, 'id' | 'data'>> = (props) => { const IfElseNode: FC<NodeProps<IfElseNodeType>> = (props) => {
const { id, data } = props
const { t } = useTranslation() const { t } = useTranslation()
const { conditions, logical_operator } = mockData const { conditions, logical_operator } = data
return ( return (
<div className='px-3'> <div className='px-3'>
......
...@@ -3,12 +3,16 @@ import { useTranslation } from 'react-i18next' ...@@ -3,12 +3,16 @@ import { useTranslation } from 'react-i18next'
import Split from '../_base/components/split' import Split from '../_base/components/split'
import AddButton from '../_base/components/add-button' import AddButton from '../_base/components/add-button'
import useConfig from './use-config' import useConfig from './use-config'
import { mockData } from './mock'
import ConditionList from './components/condition-list' import ConditionList from './components/condition-list'
import type { IfElseNodeType } from './types'
import Field from '@/app/components/workflow/nodes/_base/components/field' import Field from '@/app/components/workflow/nodes/_base/components/field'
import type { NodeProps } from '@/app/components/workflow/types'
const i18nPrefix = 'workflow.nodes.ifElse' const i18nPrefix = 'workflow.nodes.ifElse'
const Panel: FC = () => { const Panel: FC<NodeProps<IfElseNodeType>> = ({
id,
data,
}) => {
const { t } = useTranslation() const { t } = useTranslation()
const readOnly = false const readOnly = false
...@@ -17,7 +21,7 @@ const Panel: FC = () => { ...@@ -17,7 +21,7 @@ const Panel: FC = () => {
handleConditionsChange, handleConditionsChange,
handleAddCondition, handleAddCondition,
handleLogicalOperatorToggle, handleLogicalOperatorToggle,
} = useConfig(mockData) } = useConfig(id, data)
return ( return (
<div className='mt-2'> <div className='mt-2'>
<div className='px-4 pb-4 space-y-4'> <div className='px-4 pb-4 space-y-4'>
......
import { useCallback, useState } from 'react' import { useCallback } from 'react'
import produce from 'immer' import produce from 'immer'
import { ComparisonOperator, LogicalOperator } from './types' import { ComparisonOperator, LogicalOperator } from './types'
import type { Condition, IfElseNodeType } from './types' import type { Condition, IfElseNodeType } from './types'
import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
const useConfig = (initInputs: IfElseNodeType) => { const useConfig = (id: string, payload: IfElseNodeType) => {
const [inputs, setInputs] = useState<IfElseNodeType>(initInputs) const { inputs, setInputs } = useNodeCrud<IfElseNodeType>(id, payload)
const handleConditionsChange = useCallback((newConditions: Condition[]) => { const handleConditionsChange = useCallback((newConditions: Condition[]) => {
setInputs((prev) => { const newInputs = produce(inputs, (draft) => {
return { draft.conditions = newConditions
...prev,
conditions: newConditions,
}
}) })
setInputs(newInputs)
}, []) }, [])
const handleAddCondition = useCallback(() => { const handleAddCondition = useCallback(() => {
......
import type { FC } from 'react' import { type FC, useEffect, useState } from 'react'
import type { KnowledgeRetrievalNodeType } from './types'
import { Folder } from '@/app/components/base/icons/src/vender/solid/files' import { Folder } from '@/app/components/base/icons/src/vender/solid/files'
import type { NodeProps } from '@/app/components/workflow/types'
import { fetchDatasets } from '@/service/datasets'
import type { DataSet } from '@/models/datasets'
const Node: FC = () => { const Node: FC<NodeProps<KnowledgeRetrievalNodeType>> = ({
data,
}) => {
const [selectedDatasets, setSelectedDatasets] = useState<DataSet[]>([])
useEffect(() => {
(async () => {
if (data.dataset_ids?.length > 0) {
const { data: dataSetsWithDetail } = await fetchDatasets({ url: '/datasets', params: { page: 1, ids: data.dataset_ids } })
setSelectedDatasets(dataSetsWithDetail)
}
else {
setSelectedDatasets([])
}
})()
}, [data.dataset_ids])
return ( return (
<div className='px-3'> <div className='px-3'>
<div className='space-y-0.5'> <div className='space-y-0.5'>
{['product Doc', 'Text completion'].map(name => ( {selectedDatasets.map(({ id, name }) => (
<div key={name} className='flex items-center h-[26px] bg-gray-100 rounded-md px-1 text-xs font-normal text-gray-700'> <div key={id} className='flex items-center h-[26px] bg-gray-100 rounded-md px-1 text-xs font-normal text-gray-700'>
<div className='mr-1 shrink-0 p-1 bg-[#F5F8FF] rounded-md border-[0.5px] border-[#E0EAFF]'> <div className='mr-1 shrink-0 p-1 bg-[#F5F8FF] rounded-md border-[0.5px] border-[#E0EAFF]'>
<Folder className='w-3 h-3 text-[#444CE7]' /> <Folder className='w-3 h-3 text-[#444CE7]' />
</div> </div>
......
...@@ -2,17 +2,21 @@ import type { FC } from 'react' ...@@ -2,17 +2,21 @@ import type { FC } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import VarReferencePicker from '../_base/components/variable/var-reference-picker' import VarReferencePicker from '../_base/components/variable/var-reference-picker'
import useConfig from './use-config' import useConfig from './use-config'
import { mockData } from './mock'
import RetrievalConfig from './components/retrieval-config' import RetrievalConfig from './components/retrieval-config'
import AddKnowledge from './components/add-dataset' import AddKnowledge from './components/add-dataset'
import DatasetList from './components/dataset-list' import DatasetList from './components/dataset-list'
import type { KnowledgeRetrievalNodeType } from './types'
import Field from '@/app/components/workflow/nodes/_base/components/field' import Field from '@/app/components/workflow/nodes/_base/components/field'
import Split from '@/app/components/workflow/nodes/_base/components/split' import Split from '@/app/components/workflow/nodes/_base/components/split'
import OutputVars, { VarItem } from '@/app/components/workflow/nodes/_base/components/output-vars' import OutputVars, { VarItem } from '@/app/components/workflow/nodes/_base/components/output-vars'
import type { NodeProps } from '@/app/components/workflow/types'
const i18nPrefix = 'workflow.nodes.knowledgeRetrieval' const i18nPrefix = 'workflow.nodes.knowledgeRetrieval'
const Panel: FC = () => { const Panel: FC<NodeProps<KnowledgeRetrievalNodeType>> = ({
id,
data,
}) => {
const { t } = useTranslation() const { t } = useTranslation()
const readOnly = false const readOnly = false
...@@ -23,7 +27,7 @@ const Panel: FC = () => { ...@@ -23,7 +27,7 @@ const Panel: FC = () => {
handleMultipleRetrievalConfigChange, handleMultipleRetrievalConfigChange,
selectedDatasets, selectedDatasets,
handleOnDatasetsChange, handleOnDatasetsChange,
} = useConfig(mockData) } = useConfig(id, data)
return ( return (
<div className='mt-2'> <div className='mt-2'>
......
...@@ -5,9 +5,10 @@ import type { KnowledgeRetrievalNodeType, MultipleRetrievalConfig } from './type ...@@ -5,9 +5,10 @@ import type { KnowledgeRetrievalNodeType, MultipleRetrievalConfig } from './type
import type { RETRIEVE_TYPE } from '@/types/app' import type { RETRIEVE_TYPE } from '@/types/app'
import type { DataSet } from '@/models/datasets' import type { DataSet } from '@/models/datasets'
import { fetchDatasets } from '@/service/datasets' import { fetchDatasets } from '@/service/datasets'
import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
const useConfig = (initInputs: KnowledgeRetrievalNodeType) => { const useConfig = (id: string, payload: KnowledgeRetrievalNodeType) => {
const [inputs, setInputs] = useState<KnowledgeRetrievalNodeType>(initInputs) const { inputs, setInputs } = useNodeCrud<KnowledgeRetrievalNodeType>(id, payload)
const handleQueryVarChange = useCallback((newVar: ValueSelector) => { const handleQueryVarChange = useCallback((newVar: ValueSelector) => {
const newInputs = produce(inputs, (draft) => { const newInputs = produce(inputs, (draft) => {
draft.query_variable_selector = newVar draft.query_variable_selector = newVar
...@@ -38,6 +39,10 @@ const useConfig = (initInputs: KnowledgeRetrievalNodeType) => { ...@@ -38,6 +39,10 @@ const useConfig = (initInputs: KnowledgeRetrievalNodeType) => {
const { data: dataSetsWithDetail } = await fetchDatasets({ url: '/datasets', params: { page: 1, ids: datasetIds } }) const { data: dataSetsWithDetail } = await fetchDatasets({ url: '/datasets', params: { page: 1, ids: datasetIds } })
setSelectedDatasets(dataSetsWithDetail) setSelectedDatasets(dataSetsWithDetail)
} }
const newInputs = produce(inputs, (draft) => {
draft.dataset_ids = datasetIds
})
setInputs(newInputs)
})() })()
}, []) }, [])
......
import type { FC } from 'react' import type { FC } from 'react'
import { mockData } from './mock' import type { LLMNodeType } from './types'
import { import {
useTextGenerationCurrentProviderAndModelAndModelList, useTextGenerationCurrentProviderAndModelAndModelList,
} from '@/app/components/header/account-setting/model-provider-page/hooks' } from '@/app/components/header/account-setting/model-provider-page/hooks'
import ModelSelector from '@/app/components/header/account-setting/model-provider-page/model-selector' import ModelSelector from '@/app/components/header/account-setting/model-provider-page/model-selector'
import type { NodeProps } from '@/app/components/workflow/types'
const Node: FC = () => { const Node: FC<NodeProps<LLMNodeType>> = ({
const { provider, name: modelId } = mockData.model data,
}) => {
const { provider, name: modelId } = data.model
const { const {
textGenerationModelList, textGenerationModelList,
} = useTextGenerationCurrentProviderAndModelAndModelList() } = useTextGenerationCurrentProviderAndModelAndModelList()
......
...@@ -3,18 +3,22 @@ import { useTranslation } from 'react-i18next' ...@@ -3,18 +3,22 @@ import { useTranslation } from 'react-i18next'
import MemoryConfig from '../_base/components/memory-config' import MemoryConfig from '../_base/components/memory-config'
import VarReferencePicker from '../_base/components/variable/var-reference-picker' import VarReferencePicker from '../_base/components/variable/var-reference-picker'
import useConfig from './use-config' import useConfig from './use-config'
import { mockData } from './mock'
import ResolutionPicker from './components/resolution-picker' import ResolutionPicker from './components/resolution-picker'
import type { LLMNodeType } from './types'
import VarList from '@/app/components/workflow/nodes/_base/components/variable/var-list' import VarList from '@/app/components/workflow/nodes/_base/components/variable/var-list'
import Field from '@/app/components/workflow/nodes/_base/components/field' import Field from '@/app/components/workflow/nodes/_base/components/field'
import AddButton from '@/app/components/base/button/add-button' import AddButton from '@/app/components/base/button/add-button'
import Split from '@/app/components/workflow/nodes/_base/components/split' import Split from '@/app/components/workflow/nodes/_base/components/split'
import ModelParameterModal from '@/app/components/header/account-setting/model-provider-page/model-parameter-modal' import ModelParameterModal from '@/app/components/header/account-setting/model-provider-page/model-parameter-modal'
import OutputVars, { VarItem } from '@/app/components/workflow/nodes/_base/components/output-vars' import OutputVars, { VarItem } from '@/app/components/workflow/nodes/_base/components/output-vars'
import type { NodeProps } from '@/app/components/workflow/types'
const i18nPrefix = 'workflow.nodes.llm' const i18nPrefix = 'workflow.nodes.llm'
const Panel: FC = () => { const Panel: FC<NodeProps<LLMNodeType>> = ({
id,
data,
}) => {
const { t } = useTranslation() const { t } = useTranslation()
const readOnly = false const readOnly = false
...@@ -28,7 +32,8 @@ const Panel: FC = () => { ...@@ -28,7 +32,8 @@ const Panel: FC = () => {
handleContextVarChange, handleContextVarChange,
handleMemoryChange, handleMemoryChange,
handleVisionResolutionChange, handleVisionResolutionChange,
} = useConfig(mockData) } = useConfig(id, data)
const isChatApp = true // TODO: get from app context const isChatApp = true // TODO: get from app context
const model = inputs.model const model = inputs.model
const modelMode = inputs.model?.mode const modelMode = inputs.model?.mode
......
import { useCallback, useState } from 'react' import { useCallback } from 'react'
import produce from 'immer' import produce from 'immer'
import useVarList from '../_base/hooks/use-var-list' import useVarList from '../_base/hooks/use-var-list'
import type { Memory, ValueSelector } from '../../types' import type { Memory, ValueSelector } from '../../types'
...@@ -6,9 +6,10 @@ import type { LLMNodeType } from './types' ...@@ -6,9 +6,10 @@ import type { LLMNodeType } from './types'
import type { Resolution } from '@/types/app' import type { Resolution } from '@/types/app'
import { useTextGenerationCurrentProviderAndModelAndModelList } from '@/app/components/header/account-setting/model-provider-page/hooks' import { useTextGenerationCurrentProviderAndModelAndModelList } from '@/app/components/header/account-setting/model-provider-page/hooks'
import { ModelFeatureEnum } from '@/app/components/header/account-setting/model-provider-page/declarations' import { ModelFeatureEnum } from '@/app/components/header/account-setting/model-provider-page/declarations'
import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
const useConfig = (initInputs: LLMNodeType) => { const useConfig = (id: string, payload: LLMNodeType) => {
const [inputs, setInputs] = useState<LLMNodeType>(initInputs) const { inputs, setInputs } = useNodeCrud<LLMNodeType>(id, payload)
// model // model
const model = inputs.model const model = inputs.model
......
...@@ -3,16 +3,18 @@ import { useState } from 'react' ...@@ -3,16 +3,18 @@ import { useState } from 'react'
import type { NodeProps } from 'reactflow' import type { NodeProps } from 'reactflow'
import InfoPanel from '../_base/components/info-panel' import InfoPanel from '../_base/components/info-panel'
import { NodeSourceHandle } from '../_base/components/node-handle' import { NodeSourceHandle } from '../_base/components/node-handle'
import { mockData } from './mock'
import type { QuestionClassifierNodeType } from './types'
import { import {
useTextGenerationCurrentProviderAndModelAndModelList, useTextGenerationCurrentProviderAndModelAndModelList,
} from '@/app/components/header/account-setting/model-provider-page/hooks' } from '@/app/components/header/account-setting/model-provider-page/hooks'
import ModelSelector from '@/app/components/header/account-setting/model-provider-page/model-selector' import ModelSelector from '@/app/components/header/account-setting/model-provider-page/model-selector'
const Node: FC<Pick<NodeProps, 'id' | 'data'>> = (props) => { const Node: FC<NodeProps<QuestionClassifierNodeType>> = (props) => {
const { provider, name: modelId } = mockData.model const { data } = props
const tempTopics = mockData.topics const { provider, name: modelId } = data.model
const [topics, setTopics] = useState(tempTopics) // const tempTopics = data.topics
const [topics, setTopics] = useState(data.topics)
const { const {
textGenerationModelList, textGenerationModelList,
} = useTextGenerationCurrentProviderAndModelAndModelList() } = useTextGenerationCurrentProviderAndModelAndModelList()
......
...@@ -2,14 +2,19 @@ import type { FC } from 'react' ...@@ -2,14 +2,19 @@ import type { FC } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import VarReferencePicker from '../_base/components/variable/var-reference-picker' import VarReferencePicker from '../_base/components/variable/var-reference-picker'
import useConfig from './use-config' import useConfig from './use-config'
import { mockData } from './mock'
import ClassList from './components/class-list' import ClassList from './components/class-list'
import AdvancedSetting from './components/advanced-setting' import AdvancedSetting from './components/advanced-setting'
import type { QuestionClassifierNodeType } from './types'
import Field from '@/app/components/workflow/nodes/_base/components/field' import Field from '@/app/components/workflow/nodes/_base/components/field'
import ModelParameterModal from '@/app/components/header/account-setting/model-provider-page/model-parameter-modal' import ModelParameterModal from '@/app/components/header/account-setting/model-provider-page/model-parameter-modal'
import type { NodeProps } from '@/app/components/workflow/types'
const i18nPrefix = 'workflow.nodes.questionClassifiers' const i18nPrefix = 'workflow.nodes.questionClassifiers'
const Panel: FC = () => { const Panel: FC<NodeProps<QuestionClassifierNodeType>> = ({
id,
data,
}) => {
const { t } = useTranslation() const { t } = useTranslation()
const readOnly = false const readOnly = false
...@@ -21,7 +26,8 @@ const Panel: FC = () => { ...@@ -21,7 +26,8 @@ const Panel: FC = () => {
handleTopicsChange, handleTopicsChange,
handleInstructionChange, handleInstructionChange,
handleMemoryChange, handleMemoryChange,
} = useConfig(mockData) } = useConfig(id, data)
const model = inputs.model const model = inputs.model
return ( return (
......
import { useCallback, useState } from 'react' import { useCallback } from 'react'
import produce from 'immer' import produce from 'immer'
import type { Memory, ValueSelector } from '../../types' import type { Memory, ValueSelector } from '../../types'
import type { QuestionClassifierNodeType } from './types' import type { QuestionClassifierNodeType } from './types'
import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
const useConfig = (initInputs: QuestionClassifierNodeType) => { const useConfig = (id: string, payload: QuestionClassifierNodeType) => {
const [inputs, setInputs] = useState<QuestionClassifierNodeType>(initInputs) const { inputs, setInputs } = useNodeCrud<QuestionClassifierNodeType>(id, payload)
// model // model
const handleModelChanged = useCallback((model: { provider: string; modelId: string; mode?: string }) => { const handleModelChanged = useCallback((model: { provider: string; modelId: string; mode?: string }) => {
......
...@@ -8,7 +8,7 @@ import Field from '@/app/components/workflow/nodes/_base/components/field' ...@@ -8,7 +8,7 @@ import Field from '@/app/components/workflow/nodes/_base/components/field'
import OutputVars, { VarItem } from '@/app/components/workflow/nodes/_base/components/output-vars' import OutputVars, { VarItem } from '@/app/components/workflow/nodes/_base/components/output-vars'
import AddButton from '@/app/components/base/button/add-button' import AddButton from '@/app/components/base/button/add-button'
import ConfigVarModal from '@/app/components/app/configuration/config-var/config-modal' import ConfigVarModal from '@/app/components/app/configuration/config-var/config-modal'
import type { NodeProps } from '@/app/components/workflow/types' import type { InputVar, NodeProps } from '@/app/components/workflow/types'
const i18nPrefix = 'workflow.nodes.start' const i18nPrefix = 'workflow.nodes.start'
...@@ -27,6 +27,11 @@ const Panel: FC<NodeProps<StartNodeType>> = ({ ...@@ -27,6 +27,11 @@ const Panel: FC<NodeProps<StartNodeType>> = ({
handleVarListChange, handleVarListChange,
} = useConfig(id, data) } = useConfig(id, data)
const handleAddVarConfirm = (payload: InputVar) => {
handleAddVariable(payload)
hideAddVarModal()
}
return ( return (
<div className='mt-2'> <div className='mt-2'>
<div className='px-4 pb-4 space-y-4'> <div className='px-4 pb-4 space-y-4'>
...@@ -83,10 +88,7 @@ const Panel: FC<NodeProps<StartNodeType>> = ({ ...@@ -83,10 +88,7 @@ const Panel: FC<NodeProps<StartNodeType>> = ({
isCreate isCreate
isShow={isShowAddVarModal} isShow={isShowAddVarModal}
onClose={hideAddVarModal} onClose={hideAddVarModal}
onConfirm={(payload) => { onConfirm={handleAddVarConfirm}
handleAddVariable(payload)
hideAddVarModal()
}}
/> />
)} )}
</div> </div>
......
...@@ -22,7 +22,7 @@ const useConfig = (id: string, payload: StartNodeType) => { ...@@ -22,7 +22,7 @@ const useConfig = (id: string, payload: StartNodeType) => {
const handleAddVariable = useCallback((payload: InputVar) => { const handleAddVariable = useCallback((payload: InputVar) => {
const newInputs = produce(inputs, (draft: any) => { const newInputs = produce(inputs, (draft: any) => {
draft.variables.push(payload) draft.variables.push(`${Date.now()}`, payload)
}) })
setInputs(newInputs) setInputs(newInputs)
}, [inputs, setInputs]) }, [inputs, setInputs])
......
import type { FC } from 'react' import type { FC } from 'react'
import type { TemplateTransformNodeType } from './types'
import type { NodeProps } from '@/app/components/workflow/types'
const Node: FC = () => { const Node: FC<NodeProps<TemplateTransformNodeType>> = () => {
return ( return (
// No summary content // No summary content
<div></div> <div></div>
......
import type { FC } from 'react' import type { FC } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import useConfig from './use-config' import useConfig from './use-config'
import { mockData } from './mock' import type { TemplateTransformNodeType } from './types'
import VarList from '@/app/components/workflow/nodes/_base/components/variable/var-list' import VarList from '@/app/components/workflow/nodes/_base/components/variable/var-list'
import AddButton from '@/app/components/base/button/add-button' import AddButton from '@/app/components/base/button/add-button'
import Field from '@/app/components/workflow/nodes/_base/components/field' import Field from '@/app/components/workflow/nodes/_base/components/field'
...@@ -9,10 +9,14 @@ import Split from '@/app/components/workflow/nodes/_base/components/split' ...@@ -9,10 +9,14 @@ import Split from '@/app/components/workflow/nodes/_base/components/split'
import CodeEditor from '@/app/components/workflow/nodes/_base/components/editor/code-editor' import CodeEditor from '@/app/components/workflow/nodes/_base/components/editor/code-editor'
import OutputVars, { VarItem } from '@/app/components/workflow/nodes/_base/components/output-vars' import OutputVars, { VarItem } from '@/app/components/workflow/nodes/_base/components/output-vars'
import { HelpCircle } from '@/app/components/base/icons/src/vender/line/general' import { HelpCircle } from '@/app/components/base/icons/src/vender/line/general'
import type { NodeProps } from '@/app/components/workflow/types'
const i18nPrefix = 'workflow.nodes.templateTransform' const i18nPrefix = 'workflow.nodes.templateTransform'
const Panel: FC = () => { const Panel: FC<NodeProps<TemplateTransformNodeType>> = ({
id,
data,
}) => {
const { t } = useTranslation() const { t } = useTranslation()
const readOnly = false const readOnly = false
...@@ -21,7 +25,8 @@ const Panel: FC = () => { ...@@ -21,7 +25,8 @@ const Panel: FC = () => {
handleVarListChange, handleVarListChange,
handleAddVariable, handleAddVariable,
handleCodeChange, handleCodeChange,
} = useConfig(mockData) } = useConfig(id, data)
return ( return (
<div className='mt-2'> <div className='mt-2'>
<div className='px-4 pb-4 space-y-4'> <div className='px-4 pb-4 space-y-4'>
......
import { useCallback, useState } from 'react' import { useCallback } from 'react'
import produce from 'immer'
import useVarList from '../_base/hooks/use-var-list' import useVarList from '../_base/hooks/use-var-list'
import type { TemplateTransformNodeType } from './types' import type { TemplateTransformNodeType } from './types'
import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
const useConfig = (initInputs: TemplateTransformNodeType) => { const useConfig = (id: string, payload: TemplateTransformNodeType) => {
const [inputs, setInputs] = useState<TemplateTransformNodeType>(initInputs) const { inputs, setInputs } = useNodeCrud<TemplateTransformNodeType>(id, payload)
const { handleVarListChange, handleAddVariable } = useVarList<TemplateTransformNodeType>({ const { handleVarListChange, handleAddVariable } = useVarList<TemplateTransformNodeType>({
inputs, inputs,
setInputs, setInputs,
}) })
const handleCodeChange = useCallback((template: string) => { const handleCodeChange = useCallback((template: string) => {
setInputs(prev => ({ ...prev, template })) const newInputs = produce(inputs, (draft: any) => {
draft.template = template
})
setInputs(newInputs)
}, [setInputs]) }, [setInputs])
return { return {
......
import type { FC } from 'react' import type { FC } from 'react'
import { mockData } from './mock' import type { ToolNodeType } from './types'
import { VarType } from './types' import { VarType } from './types'
import { Variable02 } from '@/app/components/base/icons/src/vender/solid/development' import { Variable02 } from '@/app/components/base/icons/src/vender/solid/development'
import type { NodeProps } from '@/app/components/workflow/types'
const Node: FC = () => { const Node: FC<NodeProps<ToolNodeType>> = ({
const { tool_inputs } = mockData data,
}) => {
const { tool_inputs } = data
return ( return (
<div className='px-3'> <div className='px-3'>
......
import type { FC } from 'react' import type { FC } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import Split from '../_base/components/split' import Split from '../_base/components/split'
import type { ToolNodeType } from './types'
import Button from '@/app/components/base/button' import Button from '@/app/components/base/button'
import Field from '@/app/components/workflow/nodes/_base/components/field' import Field from '@/app/components/workflow/nodes/_base/components/field'
import type { NodeProps } from '@/app/components/workflow/types'
const i18nPrefix = 'workflow.nodes.tool' const i18nPrefix = 'workflow.nodes.tool'
const Panel: FC = () => { const Panel: FC<NodeProps<ToolNodeType>> = ({
id,
data,
}) => {
const { t } = useTranslation() const { t } = useTranslation()
const readOnly = false const readOnly = false
......
...@@ -3,16 +3,17 @@ import { useState } from 'react' ...@@ -3,16 +3,17 @@ import { useState } from 'react'
import type { NodeProps } from 'reactflow' import type { NodeProps } from 'reactflow'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import { NodeTargetHandle } from '../_base/components/node-handle' import { NodeTargetHandle } from '../_base/components/node-handle'
import { mockData } from './mock' import type { VariableAssignerNodeType } from './types'
import { getNodeInfoById } from '@/app/components/workflow/nodes/_base/components/variable/var-reference-picker' import { getNodeInfoById } from '@/app/components/workflow/nodes/_base/components/variable/var-reference-picker'
import { VarBlockIcon } from '@/app/components/workflow/block-icon' import { VarBlockIcon } from '@/app/components/workflow/block-icon'
import { Line3 } from '@/app/components/base/icons/src/public/common' import { Line3 } from '@/app/components/base/icons/src/public/common'
import { Variable02 } from '@/app/components/base/icons/src/vender/solid/development' import { Variable02 } from '@/app/components/base/icons/src/vender/solid/development'
const i18nPrefix = 'workflow.nodes.variableAssigner' const i18nPrefix = 'workflow.nodes.variableAssigner'
const Node: FC<Pick<NodeProps, 'id' | 'data'>> = (props) => { const Node: FC<NodeProps<VariableAssignerNodeType>> = (props) => {
const { t } = useTranslation() const { t } = useTranslation()
const { variables: tempVar, output_type } = mockData const { data } = props
const { variables: tempVar, output_type } = data
const [variables, setVariables] = useState(tempVar) const [variables, setVariables] = useState(tempVar)
// TODO: get var type through node and value // TODO: get var type through node and value
......
import type { FC } from 'react' import type { FC } from 'react'
import { useTranslation } from 'react-i18next' import { useTranslation } from 'react-i18next'
import useConfig from './use-config' import useConfig from './use-config'
import { mockData } from './mock'
import VarList from './components/var-list' import VarList from './components/var-list'
import type { VariableAssignerNodeType } from './types'
import Field from '@/app/components/workflow/nodes/_base/components/field' import Field from '@/app/components/workflow/nodes/_base/components/field'
import Selector from '@/app/components/workflow/nodes/_base/components/selector' import Selector from '@/app/components/workflow/nodes/_base/components/selector'
import AddButton from '@/app/components/base/button/add-button' import AddButton from '@/app/components/base/button/add-button'
import { ChevronDown } from '@/app/components/base/icons/src/vender/line/arrows' import { ChevronDown } from '@/app/components/base/icons/src/vender/line/arrows'
import type { NodeProps } from '@/app/components/workflow/types'
const i18nPrefix = 'workflow.nodes.variableAssigner' const i18nPrefix = 'workflow.nodes.variableAssigner'
const Panel: FC = () => { const Panel: FC<NodeProps<VariableAssignerNodeType>> = ({
id,
data,
}) => {
const { t } = useTranslation() const { t } = useTranslation()
const readOnly = false const readOnly = false
...@@ -18,7 +22,7 @@ const Panel: FC = () => { ...@@ -18,7 +22,7 @@ const Panel: FC = () => {
handleOutputTypeChange, handleOutputTypeChange,
handleVarListChange, handleVarListChange,
handleAddVariable, handleAddVariable,
} = useConfig(mockData) } = useConfig(id, data)
const typeOptions = [ const typeOptions = [
{ label: t(`${i18nPrefix}.type.string`), value: 'string' }, { label: t(`${i18nPrefix}.type.string`), value: 'string' },
......
import { useCallback, useState } from 'react' import { useCallback } from 'react'
import produce from 'immer' import produce from 'immer'
import useVarList from './components/var-list/use-var-list' import useVarList from './components/var-list/use-var-list'
import type { VariableAssignerNodeType } from './types' import type { VariableAssignerNodeType } from './types'
import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
const useConfig = (initInputs: VariableAssignerNodeType) => { const useConfig = (id: string, payload: VariableAssignerNodeType) => {
const [inputs, setInputs] = useState<VariableAssignerNodeType>(initInputs) const { inputs, setInputs } = useNodeCrud<VariableAssignerNodeType>(id, payload)
const handleOutputTypeChange = useCallback((outputType: string) => { const handleOutputTypeChange = useCallback((outputType: string) => {
const newInputs = produce(inputs, (draft) => { const newInputs = produce(inputs, (draft: VariableAssignerNodeType) => {
draft.output_type = outputType draft.output_type = outputType
}) })
setInputs(newInputs) setInputs(newInputs)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment