use-config.ts 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114
  1. import { useCallback, useEffect, useRef } from 'react'
  2. import produce from 'immer'
  3. import useVarList from '../_base/hooks/use-var-list'
  4. import type { Var, Variable } from '../../types'
  5. import { VarType } from '../../types'
  6. import { useStore } from '../../store'
  7. import type { TemplateTransformNodeType } from './types'
  8. import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
  9. import useOneStepRun from '@/app/components/workflow/nodes/_base/hooks/use-one-step-run'
  10. import {
  11. useNodesReadOnly,
  12. } from '@/app/components/workflow/hooks'
  13. const useConfig = (id: string, payload: TemplateTransformNodeType) => {
  14. const { nodesReadOnly: readOnly } = useNodesReadOnly()
  15. const defaultConfig = useStore(s => s.nodesDefaultConfigs)[payload.type]
  16. const { inputs, setInputs: doSetInputs } = useNodeCrud<TemplateTransformNodeType>(id, payload)
  17. const inputsRef = useRef(inputs)
  18. const setInputs = useCallback((newPayload: TemplateTransformNodeType) => {
  19. doSetInputs(newPayload)
  20. inputsRef.current = newPayload
  21. }, [doSetInputs])
  22. const { handleVarListChange, handleAddVariable: handleAddEmptyVariable } = useVarList<TemplateTransformNodeType>({
  23. inputs,
  24. setInputs,
  25. })
  26. const handleAddVariable = useCallback((payload: Variable) => {
  27. const newInputs = produce(inputsRef.current, (draft: any) => {
  28. draft.variables.push(payload)
  29. })
  30. setInputs(newInputs)
  31. }, [setInputs])
  32. useEffect(() => {
  33. if (inputs.template)
  34. return
  35. const isReady = defaultConfig && Object.keys(defaultConfig).length > 0
  36. if (isReady) {
  37. setInputs({
  38. ...inputs,
  39. ...defaultConfig,
  40. })
  41. }
  42. // eslint-disable-next-line react-hooks/exhaustive-deps
  43. }, [defaultConfig])
  44. const handleCodeChange = useCallback((template: string) => {
  45. const newInputs = produce(inputsRef.current, (draft: any) => {
  46. draft.template = template
  47. })
  48. setInputs(newInputs)
  49. }, [setInputs])
  50. // single run
  51. const {
  52. isShowSingleRun,
  53. hideSingleRun,
  54. toVarInputs,
  55. runningStatus,
  56. handleRun,
  57. handleStop,
  58. runInputData,
  59. setRunInputData,
  60. runResult,
  61. } = useOneStepRun<TemplateTransformNodeType>({
  62. id,
  63. data: inputs,
  64. defaultRunInputData: {},
  65. })
  66. const varInputs = toVarInputs(inputs.variables)
  67. const inputVarValues = (() => {
  68. const vars: Record<string, any> = {}
  69. Object.keys(runInputData)
  70. .forEach((key) => {
  71. vars[key] = runInputData[key]
  72. })
  73. return vars
  74. })()
  75. const setInputVarValues = useCallback((newPayload: Record<string, any>) => {
  76. setRunInputData(newPayload)
  77. }, [setRunInputData])
  78. const filterVar = useCallback((varPayload: Var) => {
  79. return [VarType.string, VarType.number, VarType.object, VarType.array, VarType.arrayNumber, VarType.arrayString, VarType.arrayObject].includes(varPayload.type)
  80. }, [])
  81. return {
  82. readOnly,
  83. inputs,
  84. handleVarListChange,
  85. handleAddVariable,
  86. handleAddEmptyVariable,
  87. handleCodeChange,
  88. filterVar,
  89. // single run
  90. isShowSingleRun,
  91. hideSingleRun,
  92. runningStatus,
  93. handleRun,
  94. handleStop,
  95. varInputs,
  96. inputVarValues,
  97. setInputVarValues,
  98. runResult,
  99. }
  100. }
  101. export default useConfig