use-config.ts 4.1 KB

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