You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

use-single-run-form-params.ts 5.3KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. import type { MutableRefObject } from 'react'
  2. import type { InputVar, ValueSelector, Variable } from '@/app/components/workflow/types'
  3. import { useCallback } from 'react'
  4. import type { CaseItem, Condition, IfElseNodeType } from './types'
  5. type Params = {
  6. id: string,
  7. payload: IfElseNodeType,
  8. runInputData: Record<string, any>
  9. runInputDataRef: MutableRefObject<Record<string, any>>
  10. getInputVars: (textList: string[]) => InputVar[]
  11. setRunInputData: (data: Record<string, any>) => void
  12. toVarInputs: (variables: Variable[]) => InputVar[]
  13. varSelectorsToVarInputs: (variables: ValueSelector[]) => InputVar[]
  14. }
  15. const useSingleRunFormParams = ({
  16. payload,
  17. runInputData,
  18. setRunInputData,
  19. getInputVars,
  20. varSelectorsToVarInputs,
  21. }: Params) => {
  22. const setInputVarValues = useCallback((newPayload: Record<string, any>) => {
  23. setRunInputData(newPayload)
  24. }, [setRunInputData])
  25. const inputVarValues = (() => {
  26. const vars: Record<string, any> = {}
  27. Object.keys(runInputData)
  28. .forEach((key) => {
  29. vars[key] = runInputData[key]
  30. })
  31. return vars
  32. })()
  33. const getVarSelectorsFromCase = (caseItem: CaseItem): ValueSelector[] => {
  34. const vars: ValueSelector[] = []
  35. if (caseItem.conditions && caseItem.conditions.length) {
  36. caseItem.conditions.forEach((condition) => {
  37. // eslint-disable-next-line ts/no-use-before-define
  38. const conditionVars = getVarSelectorsFromCondition(condition)
  39. vars.push(...conditionVars)
  40. })
  41. }
  42. return vars
  43. }
  44. const getVarSelectorsFromCondition = (condition: Condition) => {
  45. const vars: ValueSelector[] = []
  46. if (condition.variable_selector)
  47. vars.push(condition.variable_selector)
  48. if (condition.sub_variable_condition && condition.sub_variable_condition.conditions?.length)
  49. vars.push(...getVarSelectorsFromCase(condition.sub_variable_condition))
  50. return vars
  51. }
  52. const getInputVarsFromCase = (caseItem: CaseItem): InputVar[] => {
  53. const vars: InputVar[] = []
  54. if (caseItem.conditions && caseItem.conditions.length) {
  55. caseItem.conditions.forEach((condition) => {
  56. // eslint-disable-next-line ts/no-use-before-define
  57. const conditionVars = getInputVarsFromConditionValue(condition)
  58. vars.push(...conditionVars)
  59. })
  60. }
  61. return vars
  62. }
  63. const getInputVarsFromConditionValue = (condition: Condition): InputVar[] => {
  64. const vars: InputVar[] = []
  65. if (condition.value && typeof condition.value === 'string') {
  66. const inputVars = getInputVars([condition.value])
  67. vars.push(...inputVars)
  68. }
  69. if (condition.sub_variable_condition && condition.sub_variable_condition.conditions?.length)
  70. vars.push(...getInputVarsFromCase(condition.sub_variable_condition))
  71. return vars
  72. }
  73. const forms = (() => {
  74. const allInputs: ValueSelector[] = []
  75. const inputVarsFromValue: InputVar[] = []
  76. if (payload.cases && payload.cases.length) {
  77. payload.cases.forEach((caseItem) => {
  78. const caseVars = getVarSelectorsFromCase(caseItem)
  79. allInputs.push(...caseVars)
  80. inputVarsFromValue.push(...getInputVarsFromCase(caseItem))
  81. })
  82. }
  83. if (payload.conditions && payload.conditions.length) {
  84. payload.conditions.forEach((condition) => {
  85. const conditionVars = getVarSelectorsFromCondition(condition)
  86. allInputs.push(...conditionVars)
  87. inputVarsFromValue.push(...getInputVarsFromConditionValue(condition))
  88. })
  89. }
  90. const varInputs = [...varSelectorsToVarInputs(allInputs), ...inputVarsFromValue]
  91. // remove duplicate inputs
  92. const existVarsKey: Record<string, boolean> = {}
  93. const uniqueVarInputs: InputVar[] = []
  94. varInputs.forEach((input) => {
  95. if(!input)
  96. return
  97. if (!existVarsKey[input.variable]) {
  98. existVarsKey[input.variable] = true
  99. uniqueVarInputs.push(input)
  100. }
  101. })
  102. return [
  103. {
  104. inputs: uniqueVarInputs,
  105. values: inputVarValues,
  106. onChange: setInputVarValues,
  107. },
  108. ]
  109. })()
  110. const getVarFromCaseItem = (caseItem: CaseItem): ValueSelector[] => {
  111. const vars: ValueSelector[] = []
  112. if (caseItem.conditions && caseItem.conditions.length) {
  113. caseItem.conditions.forEach((condition) => {
  114. // eslint-disable-next-line ts/no-use-before-define
  115. const conditionVars = getVarFromCondition(condition)
  116. vars.push(...conditionVars)
  117. })
  118. }
  119. return vars
  120. }
  121. const getVarFromCondition = (condition: Condition): ValueSelector[] => {
  122. const vars: ValueSelector[] = []
  123. if (condition.variable_selector)
  124. vars.push(condition.variable_selector)
  125. if(condition.sub_variable_condition && condition.sub_variable_condition.conditions?.length)
  126. vars.push(...getVarFromCaseItem(condition.sub_variable_condition))
  127. return vars
  128. }
  129. const getDependentVars = () => {
  130. const vars: ValueSelector[] = []
  131. if (payload.cases && payload.cases.length) {
  132. payload.cases.forEach((caseItem) => {
  133. const caseVars = getVarFromCaseItem(caseItem)
  134. vars.push(...caseVars)
  135. })
  136. }
  137. if (payload.conditions && payload.conditions.length) {
  138. payload.conditions.forEach((condition) => {
  139. const conditionVars = getVarFromCondition(condition)
  140. vars.push(...conditionVars)
  141. })
  142. }
  143. return vars
  144. }
  145. return {
  146. forms,
  147. getDependentVars,
  148. }
  149. }
  150. export default useSingleRunFormParams