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

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125
  1. import {
  2. memo,
  3. useCallback,
  4. useMemo,
  5. useRef,
  6. } from 'react'
  7. import { useClickAway } from 'ahooks'
  8. import { useTranslation } from 'react-i18next'
  9. import { useStore } from '../../../store'
  10. import {
  11. useIsChatMode,
  12. useNodeDataUpdate,
  13. useWorkflow,
  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. import { toNodeAvailableVars } from '@/app/components/workflow/nodes/_base/components/variable/utils'
  24. type AddVariablePopupWithPositionProps = {
  25. nodeId: string
  26. nodeData: any
  27. }
  28. const AddVariablePopupWithPosition = ({
  29. nodeId,
  30. nodeData,
  31. }: AddVariablePopupWithPositionProps) => {
  32. const { t } = useTranslation()
  33. const ref = useRef(null)
  34. const showAssignVariablePopup = useStore(s => s.showAssignVariablePopup)
  35. const setShowAssignVariablePopup = useStore(s => s.setShowAssignVariablePopup)
  36. const { handleNodeDataUpdate } = useNodeDataUpdate()
  37. const { handleAddVariableInAddVariablePopupWithPosition } = useVariableAssigner()
  38. const isChatMode = useIsChatMode()
  39. const { getBeforeNodesInSameBranch } = useWorkflow()
  40. const outputType = useMemo(() => {
  41. if (!showAssignVariablePopup)
  42. return ''
  43. const groupEnabled = showAssignVariablePopup.variableAssignerNodeData.advanced_settings?.group_enabled
  44. if (!groupEnabled)
  45. return showAssignVariablePopup.variableAssignerNodeData.output_type
  46. const group = showAssignVariablePopup.variableAssignerNodeData.advanced_settings?.groups.find(group => group.groupId === showAssignVariablePopup.variableAssignerNodeHandleId)
  47. return group?.output_type || ''
  48. }, [showAssignVariablePopup])
  49. const availableVars = useMemo(() => {
  50. if (!showAssignVariablePopup)
  51. return []
  52. return toNodeAvailableVars({
  53. parentNode: showAssignVariablePopup.parentNode,
  54. t,
  55. beforeNodes: [
  56. ...getBeforeNodesInSameBranch(showAssignVariablePopup.nodeId),
  57. {
  58. id: showAssignVariablePopup.nodeId,
  59. data: showAssignVariablePopup.nodeData,
  60. } as any,
  61. ],
  62. isChatMode,
  63. filterVar: filterVar(outputType as VarType),
  64. })
  65. }, [getBeforeNodesInSameBranch, isChatMode, showAssignVariablePopup, t, outputType])
  66. useClickAway(() => {
  67. if (nodeData._holdAddVariablePopup) {
  68. handleNodeDataUpdate({
  69. id: nodeId,
  70. data: {
  71. _holdAddVariablePopup: false,
  72. },
  73. })
  74. }
  75. else {
  76. handleNodeDataUpdate({
  77. id: nodeId,
  78. data: {
  79. _showAddVariablePopup: false,
  80. },
  81. })
  82. setShowAssignVariablePopup(undefined)
  83. }
  84. }, ref)
  85. const handleAddVariable = useCallback((value: ValueSelector, varDetail: Var) => {
  86. if (showAssignVariablePopup) {
  87. handleAddVariableInAddVariablePopupWithPosition(
  88. showAssignVariablePopup.nodeId,
  89. showAssignVariablePopup.variableAssignerNodeId,
  90. showAssignVariablePopup.variableAssignerNodeHandleId,
  91. value,
  92. varDetail,
  93. )
  94. }
  95. }, [showAssignVariablePopup, handleAddVariableInAddVariablePopupWithPosition])
  96. if (!showAssignVariablePopup)
  97. return null
  98. return (
  99. <div
  100. className='absolute z-10'
  101. style={{
  102. left: showAssignVariablePopup.x,
  103. top: showAssignVariablePopup.y,
  104. }}
  105. ref={ref}
  106. >
  107. <AddVariablePopup
  108. availableVars={availableVars}
  109. onSelect={handleAddVariable}
  110. />
  111. </div>
  112. )
  113. }
  114. export default memo(AddVariablePopupWithPosition)