use-config.ts 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. import { useCallback, useEffect, useState } from 'react'
  2. import produce from 'immer'
  3. import useVarList from './components/var-list/use-var-list'
  4. import type { VariableAssignerNodeType } from './types'
  5. import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
  6. import type { ValueSelector, Var } from '@/app/components/workflow/types'
  7. import { BlockEnum, VarType } from '@/app/components/workflow/types'
  8. import {
  9. useNodesReadOnly,
  10. useWorkflow,
  11. } from '@/app/components/workflow/hooks'
  12. const useConfig = (id: string, payload: VariableAssignerNodeType) => {
  13. const { nodesReadOnly: readOnly } = useNodesReadOnly()
  14. const { inputs, setInputs } = useNodeCrud<VariableAssignerNodeType>(id, payload)
  15. const { getBeforeNodeById } = useWorkflow()
  16. const beforeNodes = getBeforeNodeById(id)
  17. useEffect(() => {
  18. if (beforeNodes.length !== 1 || inputs.variables.length > 0)
  19. return
  20. const beforeNode = beforeNodes[0]
  21. if (beforeNode.data.type === BlockEnum.KnowledgeRetrieval) {
  22. const newInputs = produce(inputs, (draft: VariableAssignerNodeType) => {
  23. draft.output_type = VarType.array
  24. draft.variables[0] = [beforeNode.id, 'result']
  25. })
  26. setInputs(newInputs)
  27. }
  28. // eslint-disable-next-line react-hooks/exhaustive-deps
  29. }, [beforeNodes, inputs.variables])
  30. const handleOutputTypeChange = useCallback((outputType: string) => {
  31. const newInputs = produce(inputs, (draft: VariableAssignerNodeType) => {
  32. draft.output_type = outputType as VarType
  33. })
  34. setInputs(newInputs)
  35. }, [inputs, setInputs])
  36. const { handleVarListChange, handleAddVariable } = useVarList({
  37. id,
  38. inputs,
  39. setInputs,
  40. })
  41. const { variables } = inputs
  42. const [currVarIndex, setCurrVarIndex] = useState(-1)
  43. const currVar = variables[currVarIndex]
  44. const handleOnVarOpen = useCallback((index: number) => {
  45. setCurrVarIndex(index)
  46. }, [])
  47. const filterVar = useCallback((varPayload: Var, valueSelector: ValueSelector) => {
  48. const type = varPayload.type
  49. if ((inputs.output_type !== VarType.array && type !== inputs.output_type) || (
  50. inputs.output_type === VarType.array && ![VarType.array, VarType.arrayString, VarType.arrayNumber, VarType.arrayObject].includes(type)
  51. ))
  52. return false
  53. // can not choose the same node
  54. if (!currVar)
  55. return true
  56. const selectNodeId = valueSelector[0]
  57. if (selectNodeId !== currVar[0] && variables.find(v => v[0] === selectNodeId))
  58. return false
  59. return true
  60. }, [currVar, inputs.output_type, variables])
  61. return {
  62. readOnly,
  63. inputs,
  64. handleOutputTypeChange,
  65. handleVarListChange,
  66. handleAddVariable,
  67. handleOnVarOpen,
  68. filterVar,
  69. }
  70. }
  71. export default useConfig