You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. import { useCallback, useMemo } from 'react'
  2. import produce from 'immer'
  3. import { useStoreApi } from 'reactflow'
  4. import { VarType } from '../../types'
  5. import type { ValueSelector, Var } from '../../types'
  6. import { WriteMode } from './types'
  7. import type { AssignerNodeOperation, AssignerNodeType } from './types'
  8. import { writeModeTypesNum } from './types'
  9. import { useGetAvailableVars } from './hooks'
  10. import { convertV1ToV2 } from './utils'
  11. import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
  12. import {
  13. useIsChatMode,
  14. useNodesReadOnly,
  15. useWorkflow,
  16. useWorkflowVariables,
  17. } from '@/app/components/workflow/hooks'
  18. const useConfig = (id: string, rawPayload: AssignerNodeType) => {
  19. const payload = useMemo(() => convertV1ToV2(rawPayload), [rawPayload])
  20. const { nodesReadOnly: readOnly } = useNodesReadOnly()
  21. const isChatMode = useIsChatMode()
  22. const getAvailableVars = useGetAvailableVars()
  23. const filterVar = (varType: VarType) => {
  24. return (v: Var) => {
  25. if (varType === VarType.any)
  26. return true
  27. if (v.type === VarType.any)
  28. return true
  29. return v.type === varType
  30. }
  31. }
  32. const store = useStoreApi()
  33. const { getBeforeNodesInSameBranchIncludeParent } = useWorkflow()
  34. const {
  35. getNodes,
  36. } = store.getState()
  37. const currentNode = getNodes().find(n => n.id === id)
  38. const isInIteration = payload.isInIteration
  39. const iterationNode = isInIteration ? getNodes().find(n => n.id === currentNode!.parentId) : null
  40. const availableNodes = useMemo(() => {
  41. return getBeforeNodesInSameBranchIncludeParent(id)
  42. }, [getBeforeNodesInSameBranchIncludeParent, id])
  43. const { inputs, setInputs } = useNodeCrud<AssignerNodeType>(id, payload)
  44. const newSetInputs = useCallback((newInputs: AssignerNodeType) => {
  45. const finalInputs = produce(newInputs, (draft) => {
  46. if (draft.version !== '2')
  47. draft.version = '2'
  48. })
  49. setInputs(finalInputs)
  50. }, [setInputs])
  51. const { getCurrentVariableType } = useWorkflowVariables()
  52. const getAssignedVarType = useCallback((valueSelector: ValueSelector) => {
  53. return getCurrentVariableType({
  54. parentNode: isInIteration ? iterationNode : null,
  55. valueSelector: valueSelector || [],
  56. availableNodes,
  57. isChatMode,
  58. isConstant: false,
  59. })
  60. }, [getCurrentVariableType, isInIteration, iterationNode, availableNodes, isChatMode])
  61. const handleOperationListChanges = useCallback((items: AssignerNodeOperation[]) => {
  62. const newInputs = produce(inputs, (draft) => {
  63. draft.items = [...items]
  64. })
  65. newSetInputs(newInputs)
  66. }, [inputs, newSetInputs])
  67. const writeModeTypesArr = [WriteMode.overwrite, WriteMode.clear, WriteMode.append, WriteMode.extend, WriteMode.removeFirst, WriteMode.removeLast]
  68. const writeModeTypes = [WriteMode.overwrite, WriteMode.clear, WriteMode.set]
  69. const getToAssignedVarType = useCallback((assignedVarType: VarType, write_mode: WriteMode) => {
  70. if (write_mode === WriteMode.overwrite || write_mode === WriteMode.increment || write_mode === WriteMode.decrement
  71. || write_mode === WriteMode.multiply || write_mode === WriteMode.divide || write_mode === WriteMode.extend)
  72. return assignedVarType
  73. if (write_mode === WriteMode.append) {
  74. if (assignedVarType === VarType.arrayString)
  75. return VarType.string
  76. if (assignedVarType === VarType.arrayNumber)
  77. return VarType.number
  78. if (assignedVarType === VarType.arrayObject)
  79. return VarType.object
  80. }
  81. return VarType.string
  82. }, [])
  83. const filterAssignedVar = useCallback((varPayload: Var, selector: ValueSelector) => {
  84. if (varPayload.isLoopVariable)
  85. return true
  86. return selector.join('.').startsWith('conversation')
  87. }, [])
  88. const filterToAssignedVar = useCallback((varPayload: Var, assignedVarType: VarType, write_mode: WriteMode) => {
  89. if (write_mode === WriteMode.overwrite || write_mode === WriteMode.extend || write_mode === WriteMode.increment
  90. || write_mode === WriteMode.decrement || write_mode === WriteMode.multiply || write_mode === WriteMode.divide) {
  91. return varPayload.type === assignedVarType
  92. }
  93. else if (write_mode === WriteMode.append) {
  94. switch (assignedVarType) {
  95. case VarType.arrayString:
  96. return varPayload.type === VarType.string
  97. case VarType.arrayNumber:
  98. return varPayload.type === VarType.number
  99. case VarType.arrayObject:
  100. return varPayload.type === VarType.object
  101. default:
  102. return false
  103. }
  104. }
  105. return true
  106. }, [])
  107. return {
  108. readOnly,
  109. inputs,
  110. handleOperationListChanges,
  111. getAssignedVarType,
  112. getToAssignedVarType,
  113. writeModeTypes,
  114. writeModeTypesArr,
  115. writeModeTypesNum,
  116. filterAssignedVar,
  117. filterToAssignedVar,
  118. getAvailableVars,
  119. filterVar,
  120. }
  121. }
  122. export default useConfig