libs/designer/src/lib/ui/panel/nodeDetailsPanel/tabs/parametersTab/connectionInline.tsx (116 lines of code) (raw):

import { useCallback, useEffect, useMemo, useState } from 'react'; import { CreateConnectionInternal, type CreatedConnectionPayload, } from '../../../connectionsPanel/createConnection/createConnectionWrapper'; import { useDispatch, useSelector } from 'react-redux'; import { getConnectionMetadata, reloadParametersTab, updateNodeConnection } from '../../../../../core/actions/bjsworkflow/connections'; import { useConnectorByNodeId, useNodeConnectionId } from '../../../../../core/state/connection/connectionSelector'; import { useConnectionPanelSelectedNodeIds, useOperationPanelSelectedNodeId } from '../../../../../core/state/panel/panelSelectors'; import { useOperationManifest } from '../../../../../core/state/selectors/actionMetadataSelector'; import { getAssistedConnectionProps } from '../../../../../core/utils/connectors/connections'; import type { AppDispatch, RootState } from '../../../../../core'; import { useOperationInfo } from '../../../../../core'; import { useIntl } from 'react-intl'; import { useConnectionsForConnector } from '../../../../../core/queries/connections'; import { isNullOrUndefined } from '@microsoft/logic-apps-shared'; import { Button, Text } from '@fluentui/react-components'; interface ConnectionInlineProps { setShowSubComponent?: React.Dispatch<React.SetStateAction<boolean>>; showSubComponent?: boolean; } export const ConnectionInline: React.FC<ConnectionInlineProps> = ({ showSubComponent, setShowSubComponent }) => { const intl = useIntl(); const dispatch = useDispatch<AppDispatch>(); const nodeId: string = useOperationPanelSelectedNodeId(); const nodeIds = useConnectionPanelSelectedNodeIds(); const connector = useConnectorByNodeId(nodeId); const operationInfo = useOperationInfo(nodeId); const { data: operationManifest } = useOperationManifest(operationInfo); const connectionMetadata = getConnectionMetadata(operationManifest); const existingReferences = useSelector((state: RootState) => Object.keys(state.connections.connectionReferences)); const connectionQuery = useConnectionsForConnector(connector?.id ?? ''); const connections = useMemo(() => connectionQuery?.data ?? [], [connectionQuery]); const hasExistingConnections = connections.length > 0; const [showCreateConnection, setShowCreation] = useState(hasExistingConnections); const currentConnectionId = useNodeConnectionId(nodeId); const selectedConnection = useMemo( () => connections.find((connection) => connection.id === currentConnectionId), [connections, currentConnectionId] ); const setConnection = useCallback(() => { setShowCreation(true); }, [setShowCreation]); const assistedConnectionProps = useMemo( () => (connector ? getAssistedConnectionProps(connector, operationManifest) : undefined), [connector, operationManifest] ); useEffect(() => { setShowCreation(hasExistingConnections); }, [hasExistingConnections]); const intlText = useMemo( () => ({ CONNECT: intl.formatMessage({ defaultMessage: 'Connect', id: 'F0rSr0', description: 'Text to show that the user can create the connection', }), NO_CONNECTION_SELECTED: intl.formatMessage({ defaultMessage: 'No connection has been selected', id: 'WtO4Wv', description: 'Text to show that no connection has been selected', }), CURRENT_CONNECTION: intl.formatMessage({ defaultMessage: 'Current connection: ', id: 'y3bDyD', description: 'Current connection title', }), }), [intl] ); const updateConnectionInState = useCallback( (payload: CreatedConnectionPayload) => { for (const nodeId of nodeIds) { dispatch(updateNodeConnection({ ...payload, nodeId })); } }, [dispatch, nodeIds] ); if (!showSubComponent && hasExistingConnections) { const connectionText = isNullOrUndefined(selectedConnection) ? intlText.NO_CONNECTION_SELECTED : `${intlText.CURRENT_CONNECTION}${selectedConnection.properties.displayName}`; return <Text style={{ fontSize: 12 }}>{connectionText} </Text>; } return showCreateConnection ? ( <CreateConnectionInternal connectorId={connector?.id ?? ''} operationType={operationInfo?.type} existingReferences={existingReferences} nodeIds={nodeIds} assistedConnectionProps={assistedConnectionProps} connectionMetadata={connectionMetadata} showActionBar={false} hideCancelButton={false} updateConnectionInState={updateConnectionInState} onConnectionCreated={() => dispatch(reloadParametersTab())} onConnectionCancelled={() => { if (hasExistingConnections) { setShowSubComponent && setShowSubComponent(false); } else { setShowCreation(false); } }} /> ) : ( <Button className="change-connection-button" id="change-connection-button" size="small" appearance="subtle" onClick={setConnection} style={{ color: 'var(--colorBrandForeground1)' }} aria-label={`${intlText.CONNECT}, ${connector?.id}`} > {intlText.CONNECT} </Button> ); };