Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

use-config.ts 5.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189
  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. }, [defaultConfig])
  48. const handleMethodChange = useCallback((method: Method) => {
  49. const newInputs = produce(inputs, (draft: HttpNodeType) => {
  50. draft.method = method
  51. })
  52. setInputs(newInputs)
  53. }, [inputs, setInputs])
  54. const handleUrlChange = useCallback((url: string) => {
  55. const newInputs = produce(inputs, (draft: HttpNodeType) => {
  56. draft.url = url
  57. })
  58. setInputs(newInputs)
  59. }, [inputs, setInputs])
  60. const handleFieldChange = useCallback((field: string) => {
  61. return (value: string) => {
  62. const newInputs = produce(inputs, (draft: HttpNodeType) => {
  63. (draft as any)[field] = value
  64. })
  65. setInputs(newInputs)
  66. }
  67. }, [inputs, setInputs])
  68. const {
  69. list: headers,
  70. setList: setHeaders,
  71. addItem: addHeader,
  72. isKeyValueEdit: isHeaderKeyValueEdit,
  73. toggleIsKeyValueEdit: toggleIsHeaderKeyValueEdit,
  74. } = useKeyValueList(inputs.headers, handleFieldChange('headers'))
  75. const {
  76. list: params,
  77. setList: setParams,
  78. addItem: addParam,
  79. isKeyValueEdit: isParamKeyValueEdit,
  80. toggleIsKeyValueEdit: toggleIsParamKeyValueEdit,
  81. } = useKeyValueList(inputs.params, handleFieldChange('params'))
  82. const setBody = useCallback((data: Body) => {
  83. const newInputs = produce(inputs, (draft: HttpNodeType) => {
  84. draft.body = data
  85. })
  86. setInputs(newInputs)
  87. }, [inputs, setInputs])
  88. // authorization
  89. const [isShowAuthorization, {
  90. setTrue: showAuthorization,
  91. setFalse: hideAuthorization,
  92. }] = useBoolean(false)
  93. const setAuthorization = useCallback((authorization: Authorization) => {
  94. const newInputs = produce(inputs, (draft: HttpNodeType) => {
  95. draft.authorization = authorization
  96. })
  97. setInputs(newInputs)
  98. }, [inputs, setInputs])
  99. const setTimeout = useCallback((timeout: Timeout) => {
  100. const newInputs = produce(inputs, (draft: HttpNodeType) => {
  101. draft.timeout = timeout
  102. })
  103. setInputs(newInputs)
  104. }, [inputs, setInputs])
  105. const filterVar = useCallback((varPayload: Var) => {
  106. return [VarType.string, VarType.number, VarType.secret].includes(varPayload.type)
  107. }, [])
  108. // curl import panel
  109. const [isShowCurlPanel, {
  110. setTrue: showCurlPanel,
  111. setFalse: hideCurlPanel,
  112. }] = useBoolean(false)
  113. const handleCurlImport = useCallback((newNode: HttpNodeType) => {
  114. const newInputs = produce(inputs, (draft: HttpNodeType) => {
  115. draft.method = newNode.method
  116. draft.url = newNode.url
  117. draft.headers = newNode.headers
  118. draft.params = newNode.params
  119. draft.body = newNode.body
  120. })
  121. setInputs(newInputs)
  122. }, [inputs, setInputs])
  123. const handleSSLVerifyChange = useCallback((checked: boolean) => {
  124. const newInputs = produce(inputs, (draft: HttpNodeType) => {
  125. draft.ssl_verify = checked
  126. })
  127. setInputs(newInputs)
  128. }, [inputs, setInputs])
  129. return {
  130. readOnly,
  131. isDataReady,
  132. inputs,
  133. handleVarListChange,
  134. handleAddVariable,
  135. filterVar,
  136. handleMethodChange,
  137. handleUrlChange,
  138. // headers
  139. headers,
  140. setHeaders,
  141. addHeader,
  142. isHeaderKeyValueEdit,
  143. toggleIsHeaderKeyValueEdit,
  144. // params
  145. params,
  146. setParams,
  147. addParam,
  148. isParamKeyValueEdit,
  149. toggleIsParamKeyValueEdit,
  150. // body
  151. setBody,
  152. // ssl verify
  153. handleSSLVerifyChange,
  154. // authorization
  155. isShowAuthorization,
  156. showAuthorization,
  157. hideAuthorization,
  158. setAuthorization,
  159. setTimeout,
  160. // curl import
  161. isShowCurlPanel,
  162. showCurlPanel,
  163. hideCurlPanel,
  164. handleCurlImport,
  165. }
  166. }
  167. export default useConfig