use-config.ts 2.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100
  1. import { useCallback, useEffect } from 'react'
  2. import produce from 'immer'
  3. import useVarList from '../_base/hooks/use-var-list'
  4. import type { Var } 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 } = useNodeCrud<TemplateTransformNodeType>(id, payload)
  17. const { handleVarListChange, handleAddVariable } = useVarList<TemplateTransformNodeType>({
  18. inputs,
  19. setInputs,
  20. })
  21. useEffect(() => {
  22. if (inputs.template)
  23. return
  24. const isReady = defaultConfig && Object.keys(defaultConfig).length > 0
  25. if (isReady) {
  26. setInputs({
  27. ...inputs,
  28. ...defaultConfig,
  29. })
  30. }
  31. // eslint-disable-next-line react-hooks/exhaustive-deps
  32. }, [defaultConfig])
  33. const handleCodeChange = useCallback((template: string) => {
  34. const newInputs = produce(inputs, (draft: any) => {
  35. draft.template = template
  36. })
  37. setInputs(newInputs)
  38. }, [inputs, setInputs])
  39. // single run
  40. const {
  41. isShowSingleRun,
  42. hideSingleRun,
  43. toVarInputs,
  44. runningStatus,
  45. handleRun,
  46. handleStop,
  47. runInputData,
  48. setRunInputData,
  49. runResult,
  50. } = useOneStepRun<TemplateTransformNodeType>({
  51. id,
  52. data: inputs,
  53. defaultRunInputData: {},
  54. })
  55. const varInputs = toVarInputs(inputs.variables)
  56. const inputVarValues = (() => {
  57. const vars: Record<string, any> = {}
  58. Object.keys(runInputData)
  59. .forEach((key) => {
  60. vars[key] = runInputData[key]
  61. })
  62. return vars
  63. })()
  64. const setInputVarValues = useCallback((newPayload: Record<string, any>) => {
  65. setRunInputData(newPayload)
  66. }, [setRunInputData])
  67. const filterVar = useCallback((varPayload: Var) => {
  68. return [VarType.string, VarType.number, VarType.object, VarType.array, VarType.arrayNumber, VarType.arrayString, VarType.arrayObject].includes(varPayload.type)
  69. }, [])
  70. return {
  71. readOnly,
  72. inputs,
  73. handleVarListChange,
  74. handleAddVariable,
  75. handleCodeChange,
  76. filterVar,
  77. // single run
  78. isShowSingleRun,
  79. hideSingleRun,
  80. runningStatus,
  81. handleRun,
  82. handleStop,
  83. varInputs,
  84. inputVarValues,
  85. setInputVarValues,
  86. runResult,
  87. }
  88. }
  89. export default useConfig