add-variable-popup-with-position.tsx 3.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130
  1. import {
  2. memo,
  3. useCallback,
  4. useMemo,
  5. useRef,
  6. } from 'react'
  7. import { useClickAway } from 'ahooks'
  8. import { useStore } from '../../../store'
  9. import {
  10. useIsChatMode,
  11. useNodeDataUpdate,
  12. useWorkflow,
  13. useWorkflowVariables,
  14. } from '../../../hooks'
  15. import type {
  16. ValueSelector,
  17. Var,
  18. VarType,
  19. } from '../../../types'
  20. import { useVariableAssigner } from '../../variable-assigner/hooks'
  21. import { filterVar } from '../../variable-assigner/utils'
  22. import AddVariablePopup from './add-variable-popup'
  23. type AddVariablePopupWithPositionProps = {
  24. nodeId: string
  25. nodeData: any
  26. }
  27. const AddVariablePopupWithPosition = ({
  28. nodeId,
  29. nodeData,
  30. }: AddVariablePopupWithPositionProps) => {
  31. const ref = useRef(null)
  32. const showAssignVariablePopup = useStore(s => s.showAssignVariablePopup)
  33. const setShowAssignVariablePopup = useStore(s => s.setShowAssignVariablePopup)
  34. const { handleNodeDataUpdate } = useNodeDataUpdate()
  35. const { handleAddVariableInAddVariablePopupWithPosition } = useVariableAssigner()
  36. const isChatMode = useIsChatMode()
  37. const { getBeforeNodesInSameBranch } = useWorkflow()
  38. const { getNodeAvailableVars } = useWorkflowVariables()
  39. const outputType = useMemo(() => {
  40. if (!showAssignVariablePopup)
  41. return ''
  42. const groupEnabled = showAssignVariablePopup.variableAssignerNodeData.advanced_settings?.group_enabled
  43. if (!groupEnabled)
  44. return showAssignVariablePopup.variableAssignerNodeData.output_type
  45. const group = showAssignVariablePopup.variableAssignerNodeData.advanced_settings?.groups.find(group => group.groupId === showAssignVariablePopup.variableAssignerNodeHandleId)
  46. return group?.output_type || ''
  47. }, [showAssignVariablePopup])
  48. const availableVars = useMemo(() => {
  49. if (!showAssignVariablePopup)
  50. return []
  51. return getNodeAvailableVars({
  52. parentNode: showAssignVariablePopup.parentNode,
  53. beforeNodes: [
  54. ...getBeforeNodesInSameBranch(showAssignVariablePopup.nodeId),
  55. {
  56. id: showAssignVariablePopup.nodeId,
  57. data: showAssignVariablePopup.nodeData,
  58. } as any,
  59. ],
  60. hideEnv: true,
  61. hideChatVar: true,
  62. isChatMode,
  63. filterVar: filterVar(outputType as VarType),
  64. })
  65. .map(node => ({
  66. ...node,
  67. vars: node.isStartNode ? node.vars.filter(v => !v.variable.startsWith('sys.')) : node.vars,
  68. }))
  69. .filter(item => item.vars.length > 0)
  70. }, [showAssignVariablePopup, getNodeAvailableVars, getBeforeNodesInSameBranch, isChatMode, outputType])
  71. useClickAway(() => {
  72. if (nodeData._holdAddVariablePopup) {
  73. handleNodeDataUpdate({
  74. id: nodeId,
  75. data: {
  76. _holdAddVariablePopup: false,
  77. },
  78. })
  79. }
  80. else {
  81. handleNodeDataUpdate({
  82. id: nodeId,
  83. data: {
  84. _showAddVariablePopup: false,
  85. },
  86. })
  87. setShowAssignVariablePopup(undefined)
  88. }
  89. }, ref)
  90. const handleAddVariable = useCallback((value: ValueSelector, varDetail: Var) => {
  91. if (showAssignVariablePopup) {
  92. handleAddVariableInAddVariablePopupWithPosition(
  93. showAssignVariablePopup.nodeId,
  94. showAssignVariablePopup.variableAssignerNodeId,
  95. showAssignVariablePopup.variableAssignerNodeHandleId,
  96. value,
  97. varDetail,
  98. )
  99. }
  100. }, [showAssignVariablePopup, handleAddVariableInAddVariablePopupWithPosition])
  101. if (!showAssignVariablePopup)
  102. return null
  103. return (
  104. <div
  105. className='absolute z-10'
  106. style={{
  107. left: showAssignVariablePopup.x,
  108. top: showAssignVariablePopup.y,
  109. }}
  110. ref={ref}
  111. >
  112. <AddVariablePopup
  113. availableVars={availableVars}
  114. onSelect={handleAddVariable}
  115. />
  116. </div>
  117. )
  118. }
  119. export default memo(AddVariablePopupWithPosition)