use-config.ts 4.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. import { useCallback, useEffect } from 'react'
  2. import produce from 'immer'
  3. import { useBoolean } from 'ahooks'
  4. import useVarList from '../_base/hooks/use-var-list'
  5. import { VarType } from '../../types'
  6. import type { Var } from '../../types'
  7. import { useStore } from '../../store'
  8. import type { Authorization, Body, HttpNodeType, Method, Timeout } from './types'
  9. import useKeyValueList from './hooks/use-key-value-list'
  10. import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
  11. import useOneStepRun from '@/app/components/workflow/nodes/_base/hooks/use-one-step-run'
  12. import {
  13. useNodesReadOnly,
  14. } from '@/app/components/workflow/hooks'
  15. const useConfig = (id: string, payload: HttpNodeType) => {
  16. const { nodesReadOnly: readOnly } = useNodesReadOnly()
  17. const defaultConfig = useStore(s => s.nodesDefaultConfigs)[payload.type]
  18. const { inputs, setInputs } = useNodeCrud<HttpNodeType>(id, payload)
  19. const { handleVarListChange, handleAddVariable } = useVarList<HttpNodeType>({
  20. inputs,
  21. setInputs,
  22. })
  23. useEffect(() => {
  24. const isReady = defaultConfig && Object.keys(defaultConfig).length > 0
  25. if (isReady) {
  26. setInputs({
  27. ...defaultConfig,
  28. ...inputs,
  29. })
  30. }
  31. // eslint-disable-next-line react-hooks/exhaustive-deps
  32. }, [defaultConfig])
  33. const handleMethodChange = useCallback((method: Method) => {
  34. const newInputs = produce(inputs, (draft: HttpNodeType) => {
  35. draft.method = method
  36. })
  37. setInputs(newInputs)
  38. }, [inputs, setInputs])
  39. const handleUrlChange = useCallback((url: string) => {
  40. const newInputs = produce(inputs, (draft: HttpNodeType) => {
  41. draft.url = url
  42. })
  43. setInputs(newInputs)
  44. }, [inputs, setInputs])
  45. const handleFieldChange = useCallback((field: string) => {
  46. return (value: string) => {
  47. const newInputs = produce(inputs, (draft: HttpNodeType) => {
  48. (draft as any)[field] = value
  49. })
  50. setInputs(newInputs)
  51. }
  52. }, [inputs, setInputs])
  53. const {
  54. list: headers,
  55. setList: setHeaders,
  56. addItem: addHeader,
  57. isKeyValueEdit: isHeaderKeyValueEdit,
  58. toggleIsKeyValueEdit: toggleIsHeaderKeyValueEdit,
  59. } = useKeyValueList(inputs.headers, handleFieldChange('headers'))
  60. const {
  61. list: params,
  62. setList: setParams,
  63. addItem: addParam,
  64. isKeyValueEdit: isParamKeyValueEdit,
  65. toggleIsKeyValueEdit: toggleIsParamKeyValueEdit,
  66. } = useKeyValueList(inputs.params, handleFieldChange('params'))
  67. const setBody = useCallback((data: Body) => {
  68. const newInputs = produce(inputs, (draft: HttpNodeType) => {
  69. draft.body = data
  70. })
  71. setInputs(newInputs)
  72. }, [inputs, setInputs])
  73. // authorization
  74. const [isShowAuthorization, {
  75. setTrue: showAuthorization,
  76. setFalse: hideAuthorization,
  77. }] = useBoolean(false)
  78. const setAuthorization = useCallback((authorization: Authorization) => {
  79. const newInputs = produce(inputs, (draft: HttpNodeType) => {
  80. draft.authorization = authorization
  81. })
  82. setInputs(newInputs)
  83. }, [inputs, setInputs])
  84. const setTimeout = useCallback((timeout: Timeout) => {
  85. const newInputs = produce(inputs, (draft: HttpNodeType) => {
  86. draft.timeout = timeout
  87. })
  88. setInputs(newInputs)
  89. }, [inputs, setInputs])
  90. const filterVar = useCallback((varPayload: Var) => {
  91. return [VarType.string, VarType.number].includes(varPayload.type)
  92. }, [])
  93. // single run
  94. const {
  95. isShowSingleRun,
  96. hideSingleRun,
  97. getInputVars,
  98. runningStatus,
  99. handleRun,
  100. handleStop,
  101. runInputData,
  102. setRunInputData,
  103. runResult,
  104. } = useOneStepRun<HttpNodeType>({
  105. id,
  106. data: inputs,
  107. defaultRunInputData: {},
  108. })
  109. const varInputs = getInputVars([
  110. inputs.url,
  111. inputs.headers,
  112. inputs.params,
  113. inputs.body.data,
  114. ])
  115. const inputVarValues = (() => {
  116. const vars: Record<string, any> = {}
  117. Object.keys(runInputData)
  118. .forEach((key) => {
  119. vars[key] = runInputData[key]
  120. })
  121. return vars
  122. })()
  123. const setInputVarValues = useCallback((newPayload: Record<string, any>) => {
  124. setRunInputData(newPayload)
  125. }, [setRunInputData])
  126. return {
  127. readOnly,
  128. inputs,
  129. handleVarListChange,
  130. handleAddVariable,
  131. filterVar,
  132. handleMethodChange,
  133. handleUrlChange,
  134. // headers
  135. headers,
  136. setHeaders,
  137. addHeader,
  138. isHeaderKeyValueEdit,
  139. toggleIsHeaderKeyValueEdit,
  140. // params
  141. params,
  142. setParams,
  143. addParam,
  144. isParamKeyValueEdit,
  145. toggleIsParamKeyValueEdit,
  146. // body
  147. setBody,
  148. // authorization
  149. isShowAuthorization,
  150. showAuthorization,
  151. hideAuthorization,
  152. setAuthorization,
  153. setTimeout,
  154. // single run
  155. isShowSingleRun,
  156. hideSingleRun,
  157. runningStatus,
  158. handleRun,
  159. handleStop,
  160. varInputs,
  161. inputVarValues,
  162. setInputVarValues,
  163. runResult,
  164. }
  165. }
  166. export default useConfig