Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

use-config.ts 4.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. import { useCallback, useState } from 'react'
  2. import produce from 'immer'
  3. import { useBoolean } from 'ahooks'
  4. import type { StartNodeType } from './types'
  5. import { ChangeType } from '@/app/components/workflow/types'
  6. import type { InputVar, MoreInfo, ValueSelector } from '@/app/components/workflow/types'
  7. import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
  8. import {
  9. useIsChatMode,
  10. useNodesReadOnly,
  11. useWorkflow,
  12. } from '@/app/components/workflow/hooks'
  13. import useInspectVarsCrud from '../../hooks/use-inspect-vars-crud'
  14. import { hasDuplicateStr } from '@/utils/var'
  15. import Toast from '@/app/components/base/toast'
  16. import { useTranslation } from 'react-i18next'
  17. const useConfig = (id: string, payload: StartNodeType) => {
  18. const { t } = useTranslation()
  19. const { nodesReadOnly: readOnly } = useNodesReadOnly()
  20. const { handleOutVarRenameChange, isVarUsedInNodes, removeUsedVarInNodes } = useWorkflow()
  21. const isChatMode = useIsChatMode()
  22. const { inputs, setInputs } = useNodeCrud<StartNodeType>(id, payload)
  23. const {
  24. deleteNodeInspectorVars,
  25. renameInspectVarName,
  26. nodesWithInspectVars,
  27. deleteInspectVar,
  28. } = useInspectVarsCrud()
  29. const [isShowAddVarModal, {
  30. setTrue: showAddVarModal,
  31. setFalse: hideAddVarModal,
  32. }] = useBoolean(false)
  33. const [isShowRemoveVarConfirm, {
  34. setTrue: showRemoveVarConfirm,
  35. setFalse: hideRemoveVarConfirm,
  36. }] = useBoolean(false)
  37. const [removedVar, setRemovedVar] = useState<ValueSelector>([])
  38. const [removedIndex, setRemoveIndex] = useState(0)
  39. const handleVarListChange = useCallback((newList: InputVar[], moreInfo?: { index: number; payload: MoreInfo }) => {
  40. if (moreInfo?.payload?.type === ChangeType.remove) {
  41. const varId = nodesWithInspectVars.find(node => node.nodeId === id)?.vars.find((varItem) => {
  42. return varItem.name === moreInfo?.payload?.payload?.beforeKey
  43. })?.id
  44. if(varId)
  45. deleteInspectVar(id, varId)
  46. if (isVarUsedInNodes([id, moreInfo?.payload?.payload?.beforeKey || ''])) {
  47. showRemoveVarConfirm()
  48. setRemovedVar([id, moreInfo?.payload?.payload?.beforeKey || ''])
  49. setRemoveIndex(moreInfo?.index as number)
  50. return
  51. }
  52. }
  53. const newInputs = produce(inputs, (draft: any) => {
  54. draft.variables = newList
  55. })
  56. setInputs(newInputs)
  57. if (moreInfo?.payload?.type === ChangeType.changeVarName) {
  58. const changedVar = newList[moreInfo.index]
  59. handleOutVarRenameChange(id, [id, inputs.variables[moreInfo.index].variable], [id, changedVar.variable])
  60. renameInspectVarName(id, inputs.variables[moreInfo.index].variable, changedVar.variable)
  61. }
  62. else if(moreInfo?.payload?.type !== ChangeType.remove) { // edit var type
  63. deleteNodeInspectorVars(id)
  64. }
  65. }, [deleteInspectVar, deleteNodeInspectorVars, handleOutVarRenameChange, id, inputs, isVarUsedInNodes, nodesWithInspectVars, renameInspectVarName, setInputs, showRemoveVarConfirm])
  66. const removeVarInNode = useCallback(() => {
  67. const newInputs = produce(inputs, (draft) => {
  68. draft.variables.splice(removedIndex, 1)
  69. })
  70. setInputs(newInputs)
  71. removeUsedVarInNodes(removedVar)
  72. hideRemoveVarConfirm()
  73. }, [hideRemoveVarConfirm, inputs, removeUsedVarInNodes, removedIndex, removedVar, setInputs])
  74. const handleAddVariable = useCallback((payload: InputVar) => {
  75. const newInputs = produce(inputs, (draft: StartNodeType) => {
  76. draft.variables.push(payload)
  77. })
  78. const newList = newInputs.variables
  79. let errorMsgKey = ''
  80. let typeName = ''
  81. if(hasDuplicateStr(newList.map(item => item.variable))) {
  82. errorMsgKey = 'appDebug.varKeyError.keyAlreadyExists'
  83. typeName = 'appDebug.variableConfig.varName'
  84. }
  85. else if(hasDuplicateStr(newList.map(item => item.label as string))) {
  86. errorMsgKey = 'appDebug.varKeyError.keyAlreadyExists'
  87. typeName = 'appDebug.variableConfig.labelName'
  88. }
  89. if (errorMsgKey) {
  90. Toast.notify({
  91. type: 'error',
  92. message: t(errorMsgKey, { key: t(typeName) }),
  93. })
  94. return false
  95. }
  96. setInputs(newInputs)
  97. return true
  98. }, [inputs, setInputs])
  99. return {
  100. readOnly,
  101. isChatMode,
  102. inputs,
  103. isShowAddVarModal,
  104. showAddVarModal,
  105. hideAddVarModal,
  106. handleVarListChange,
  107. handleAddVariable,
  108. isShowRemoveVarConfirm,
  109. hideRemoveVarConfirm,
  110. onRemoveVarConfirm: removeVarInNode,
  111. }
  112. }
  113. export default useConfig