Du kannst nicht mehr als 25 Themen auswählen Themen müssen mit entweder einem Buchstaben oder einer Ziffer beginnen. Sie können Bindestriche („-“) enthalten und bis zu 35 Zeichen lang sein.

use-config.ts 3.0KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. import { useCallback, useEffect, useRef } from 'react'
  2. import produce from 'immer'
  3. import useVarList from '../_base/hooks/use-var-list'
  4. import type { Var, Variable } from '../../types'
  5. import { VarType } from '../../types'
  6. import { useStore } from '../../store'
  7. import type { TemplateTransformNodeType } from './types'
  8. import useNodeCrud from '@/app/components/workflow/nodes/_base/hooks/use-node-crud'
  9. import {
  10. useNodesReadOnly,
  11. } from '@/app/components/workflow/hooks'
  12. import useAvailableVarList from '@/app/components/workflow/nodes/_base/hooks/use-available-var-list'
  13. const useConfig = (id: string, payload: TemplateTransformNodeType) => {
  14. const { nodesReadOnly: readOnly } = useNodesReadOnly()
  15. const defaultConfig = useStore(s => s.nodesDefaultConfigs)[payload.type]
  16. const { inputs, setInputs: doSetInputs } = useNodeCrud<TemplateTransformNodeType>(id, payload)
  17. const inputsRef = useRef(inputs)
  18. const setInputs = useCallback((newPayload: TemplateTransformNodeType) => {
  19. doSetInputs(newPayload)
  20. inputsRef.current = newPayload
  21. }, [doSetInputs])
  22. const { availableVars } = useAvailableVarList(id, {
  23. onlyLeafNodeVar: false,
  24. filterVar: () => true,
  25. })
  26. const { handleAddVariable: handleAddEmptyVariable } = useVarList<TemplateTransformNodeType>({
  27. inputs,
  28. setInputs,
  29. })
  30. const handleVarListChange = useCallback((newList: Variable[]) => {
  31. const newInputs = produce(inputsRef.current, (draft: any) => {
  32. draft.variables = newList
  33. })
  34. setInputs(newInputs)
  35. }, [setInputs])
  36. const handleAddVariable = useCallback((payload: Variable) => {
  37. const newInputs = produce(inputsRef.current, (draft: any) => {
  38. draft.variables.push(payload)
  39. })
  40. setInputs(newInputs)
  41. }, [setInputs])
  42. // rename var in code
  43. const handleVarNameChange = useCallback((oldName: string, newName: string) => {
  44. const newInputs = produce(inputsRef.current, (draft: any) => {
  45. draft.template = draft.template.replaceAll(`{{ ${oldName} }}`, `{{ ${newName} }}`)
  46. })
  47. setInputs(newInputs)
  48. }, [setInputs])
  49. useEffect(() => {
  50. if (inputs.template)
  51. return
  52. const isReady = defaultConfig && Object.keys(defaultConfig).length > 0
  53. if (isReady) {
  54. setInputs({
  55. ...inputs,
  56. ...defaultConfig,
  57. })
  58. }
  59. }, [defaultConfig])
  60. const handleCodeChange = useCallback((template: string) => {
  61. const newInputs = produce(inputsRef.current, (draft: any) => {
  62. draft.template = template
  63. })
  64. setInputs(newInputs)
  65. }, [setInputs])
  66. const filterVar = useCallback((varPayload: Var) => {
  67. return [VarType.string, VarType.number, VarType.boolean, VarType.object, VarType.array, VarType.arrayNumber, VarType.arrayString, VarType.arrayBoolean, VarType.arrayObject].includes(varPayload.type)
  68. }, [])
  69. return {
  70. readOnly,
  71. inputs,
  72. availableVars,
  73. handleVarListChange,
  74. handleVarNameChange,
  75. handleAddVariable,
  76. handleAddEmptyVariable,
  77. handleCodeChange,
  78. filterVar,
  79. }
  80. }
  81. export default useConfig