use-config.ts 2.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576
  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. const useConfig = (id: string, payload: StartNodeType) => {
  14. const { nodesReadOnly: readOnly } = useNodesReadOnly()
  15. const { handleOutVarRenameChange, isVarUsedInNodes, removeUsedVarInNodes } = useWorkflow()
  16. const isChatMode = useIsChatMode()
  17. const { inputs, setInputs } = useNodeCrud<StartNodeType>(id, payload)
  18. const [isShowAddVarModal, {
  19. setTrue: showAddVarModal,
  20. setFalse: hideAddVarModal,
  21. }] = useBoolean(false)
  22. const [isShowRemoveVarConfirm, {
  23. setTrue: showRemoveVarConfirm,
  24. setFalse: hideRemoveVarConfirm,
  25. }] = useBoolean(false)
  26. const [removedVar, setRemovedVar] = useState<ValueSelector>([])
  27. const handleVarListChange = useCallback((newList: InputVar[], moreInfo?: { index: number; payload: MoreInfo }) => {
  28. if (moreInfo?.payload?.type === ChangeType.remove) {
  29. if (isVarUsedInNodes([id, moreInfo?.payload?.payload?.beforeKey || ''])) {
  30. showRemoveVarConfirm()
  31. setRemovedVar([id, moreInfo?.payload?.payload?.beforeKey || ''])
  32. return
  33. }
  34. }
  35. const newInputs = produce(inputs, (draft: any) => {
  36. draft.variables = newList
  37. })
  38. setInputs(newInputs)
  39. if (moreInfo?.payload?.type === ChangeType.changeVarName) {
  40. const changedVar = newList[moreInfo.index]
  41. handleOutVarRenameChange(id, [id, inputs.variables[moreInfo.index].variable], [id, changedVar.variable])
  42. }
  43. }, [handleOutVarRenameChange, id, inputs, isVarUsedInNodes, setInputs, showRemoveVarConfirm])
  44. const removeVarInNode = useCallback(() => {
  45. removeUsedVarInNodes(removedVar)
  46. hideRemoveVarConfirm()
  47. }, [hideRemoveVarConfirm, removeUsedVarInNodes, removedVar])
  48. const handleAddVariable = useCallback((payload: InputVar) => {
  49. const newInputs = produce(inputs, (draft: StartNodeType) => {
  50. draft.variables.push(payload)
  51. })
  52. setInputs(newInputs)
  53. }, [inputs, setInputs])
  54. return {
  55. readOnly,
  56. isChatMode,
  57. inputs,
  58. isShowAddVarModal,
  59. showAddVarModal,
  60. hideAddVarModal,
  61. handleVarListChange,
  62. handleAddVariable,
  63. isShowRemoveVarConfirm,
  64. hideRemoveVarConfirm,
  65. onRemoveVarConfirm: removeVarInNode,
  66. }
  67. }
  68. export default useConfig