123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130 |
- import {
- memo,
- useCallback,
- useMemo,
- useRef,
- } from 'react'
- import { useClickAway } from 'ahooks'
- import { useStore } from '../../../store'
- import {
- useIsChatMode,
- useNodeDataUpdate,
- useWorkflow,
- useWorkflowVariables,
- } from '../../../hooks'
- import type {
- ValueSelector,
- Var,
- VarType,
- } from '../../../types'
- import { useVariableAssigner } from '../../variable-assigner/hooks'
- import { filterVar } from '../../variable-assigner/utils'
- import AddVariablePopup from './add-variable-popup'
- type AddVariablePopupWithPositionProps = {
- nodeId: string
- nodeData: any
- }
- const AddVariablePopupWithPosition = ({
- nodeId,
- nodeData,
- }: AddVariablePopupWithPositionProps) => {
- const ref = useRef(null)
- const showAssignVariablePopup = useStore(s => s.showAssignVariablePopup)
- const setShowAssignVariablePopup = useStore(s => s.setShowAssignVariablePopup)
- const { handleNodeDataUpdate } = useNodeDataUpdate()
- const { handleAddVariableInAddVariablePopupWithPosition } = useVariableAssigner()
- const isChatMode = useIsChatMode()
- const { getBeforeNodesInSameBranch } = useWorkflow()
- const { getNodeAvailableVars } = useWorkflowVariables()
- const outputType = useMemo(() => {
- if (!showAssignVariablePopup)
- return ''
- const groupEnabled = showAssignVariablePopup.variableAssignerNodeData.advanced_settings?.group_enabled
- if (!groupEnabled)
- return showAssignVariablePopup.variableAssignerNodeData.output_type
- const group = showAssignVariablePopup.variableAssignerNodeData.advanced_settings?.groups.find(group => group.groupId === showAssignVariablePopup.variableAssignerNodeHandleId)
- return group?.output_type || ''
- }, [showAssignVariablePopup])
- const availableVars = useMemo(() => {
- if (!showAssignVariablePopup)
- return []
- return getNodeAvailableVars({
- parentNode: showAssignVariablePopup.parentNode,
- beforeNodes: [
- ...getBeforeNodesInSameBranch(showAssignVariablePopup.nodeId),
- {
- id: showAssignVariablePopup.nodeId,
- data: showAssignVariablePopup.nodeData,
- } as any,
- ],
- hideEnv: true,
- hideChatVar: true,
- isChatMode,
- filterVar: filterVar(outputType as VarType),
- })
- .map(node => ({
- ...node,
- vars: node.isStartNode ? node.vars.filter(v => !v.variable.startsWith('sys.')) : node.vars,
- }))
- .filter(item => item.vars.length > 0)
- }, [showAssignVariablePopup, getNodeAvailableVars, getBeforeNodesInSameBranch, isChatMode, outputType])
- useClickAway(() => {
- if (nodeData._holdAddVariablePopup) {
- handleNodeDataUpdate({
- id: nodeId,
- data: {
- _holdAddVariablePopup: false,
- },
- })
- }
- else {
- handleNodeDataUpdate({
- id: nodeId,
- data: {
- _showAddVariablePopup: false,
- },
- })
- setShowAssignVariablePopup(undefined)
- }
- }, ref)
- const handleAddVariable = useCallback((value: ValueSelector, varDetail: Var) => {
- if (showAssignVariablePopup) {
- handleAddVariableInAddVariablePopupWithPosition(
- showAssignVariablePopup.nodeId,
- showAssignVariablePopup.variableAssignerNodeId,
- showAssignVariablePopup.variableAssignerNodeHandleId,
- value,
- varDetail,
- )
- }
- }, [showAssignVariablePopup, handleAddVariableInAddVariablePopupWithPosition])
- if (!showAssignVariablePopup)
- return null
- return (
- <div
- className='absolute z-10'
- style={{
- left: showAssignVariablePopup.x,
- top: showAssignVariablePopup.y,
- }}
- ref={ref}
- >
- <AddVariablePopup
- availableVars={availableVars}
- onSelect={handleAddVariable}
- />
- </div>
- )
- }
- export default memo(AddVariablePopupWithPosition)
|