您最多选择25个主题 主题必须以字母或数字开头,可以包含连字符 (-),并且长度不得超过35个字符

use-config.ts 5.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181
  1. import { useCallback, useEffect, useState } 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, type Body, BodyType, type HttpNodeType, type Method, type Timeout } from './types'
  9. import useKeyValueList from './hooks/use-key-value-list'
  10. import { transformToBodyPayload } from './utils'
  11. import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
  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. const [isDataReady, setIsDataReady] = useState(false)
  24. useEffect(() => {
  25. const isReady = defaultConfig && Object.keys(defaultConfig).length > 0
  26. if (isReady) {
  27. const newInputs = {
  28. ...defaultConfig,
  29. ...inputs,
  30. }
  31. const bodyData = newInputs.body.data
  32. if (typeof bodyData === 'string') {
  33. newInputs.body = {
  34. ...newInputs.body,
  35. data: transformToBodyPayload(bodyData, [BodyType.formData, BodyType.xWwwFormUrlencoded].includes(newInputs.body.type)),
  36. }
  37. }
  38. else if (!bodyData) {
  39. newInputs.body = {
  40. ...newInputs.body,
  41. data: [],
  42. }
  43. }
  44. setInputs(newInputs)
  45. setIsDataReady(true)
  46. }
  47. // eslint-disable-next-line react-hooks/exhaustive-deps
  48. }, [defaultConfig])
  49. const handleMethodChange = useCallback((method: Method) => {
  50. const newInputs = produce(inputs, (draft: HttpNodeType) => {
  51. draft.method = method
  52. })
  53. setInputs(newInputs)
  54. }, [inputs, setInputs])
  55. const handleUrlChange = useCallback((url: string) => {
  56. const newInputs = produce(inputs, (draft: HttpNodeType) => {
  57. draft.url = url
  58. })
  59. setInputs(newInputs)
  60. }, [inputs, setInputs])
  61. const handleFieldChange = useCallback((field: string) => {
  62. return (value: string) => {
  63. const newInputs = produce(inputs, (draft: HttpNodeType) => {
  64. (draft as any)[field] = value
  65. })
  66. setInputs(newInputs)
  67. }
  68. }, [inputs, setInputs])
  69. const {
  70. list: headers,
  71. setList: setHeaders,
  72. addItem: addHeader,
  73. isKeyValueEdit: isHeaderKeyValueEdit,
  74. toggleIsKeyValueEdit: toggleIsHeaderKeyValueEdit,
  75. } = useKeyValueList(inputs.headers, handleFieldChange('headers'))
  76. const {
  77. list: params,
  78. setList: setParams,
  79. addItem: addParam,
  80. isKeyValueEdit: isParamKeyValueEdit,
  81. toggleIsKeyValueEdit: toggleIsParamKeyValueEdit,
  82. } = useKeyValueList(inputs.params, handleFieldChange('params'))
  83. const setBody = useCallback((data: Body) => {
  84. const newInputs = produce(inputs, (draft: HttpNodeType) => {
  85. draft.body = data
  86. })
  87. setInputs(newInputs)
  88. }, [inputs, setInputs])
  89. // authorization
  90. const [isShowAuthorization, {
  91. setTrue: showAuthorization,
  92. setFalse: hideAuthorization,
  93. }] = useBoolean(false)
  94. const setAuthorization = useCallback((authorization: Authorization) => {
  95. const newInputs = produce(inputs, (draft: HttpNodeType) => {
  96. draft.authorization = authorization
  97. })
  98. setInputs(newInputs)
  99. }, [inputs, setInputs])
  100. const setTimeout = useCallback((timeout: Timeout) => {
  101. const newInputs = produce(inputs, (draft: HttpNodeType) => {
  102. draft.timeout = timeout
  103. })
  104. setInputs(newInputs)
  105. }, [inputs, setInputs])
  106. const filterVar = useCallback((varPayload: Var) => {
  107. return [VarType.string, VarType.number, VarType.secret].includes(varPayload.type)
  108. }, [])
  109. // curl import panel
  110. const [isShowCurlPanel, {
  111. setTrue: showCurlPanel,
  112. setFalse: hideCurlPanel,
  113. }] = useBoolean(false)
  114. const handleCurlImport = useCallback((newNode: HttpNodeType) => {
  115. const newInputs = produce(inputs, (draft: HttpNodeType) => {
  116. draft.method = newNode.method
  117. draft.url = newNode.url
  118. draft.headers = newNode.headers
  119. draft.params = newNode.params
  120. draft.body = newNode.body
  121. })
  122. setInputs(newInputs)
  123. }, [inputs, setInputs])
  124. return {
  125. readOnly,
  126. isDataReady,
  127. inputs,
  128. handleVarListChange,
  129. handleAddVariable,
  130. filterVar,
  131. handleMethodChange,
  132. handleUrlChange,
  133. // headers
  134. headers,
  135. setHeaders,
  136. addHeader,
  137. isHeaderKeyValueEdit,
  138. toggleIsHeaderKeyValueEdit,
  139. // params
  140. params,
  141. setParams,
  142. addParam,
  143. isParamKeyValueEdit,
  144. toggleIsParamKeyValueEdit,
  145. // body
  146. setBody,
  147. // authorization
  148. isShowAuthorization,
  149. showAuthorization,
  150. hideAuthorization,
  151. setAuthorization,
  152. setTimeout,
  153. // curl import
  154. isShowCurlPanel,
  155. showCurlPanel,
  156. hideCurlPanel,
  157. handleCurlImport,
  158. }
  159. }
  160. export default useConfig