diff --git a/.changeset/tender-jobs-kneel.md b/.changeset/tender-jobs-kneel.md new file mode 100644 index 00000000..8fb3b0f2 --- /dev/null +++ b/.changeset/tender-jobs-kneel.md @@ -0,0 +1,5 @@ +--- +'@xyflow/react': minor +--- + +Added optional selector for useConnection hook diff --git a/packages/react/src/hooks/useConnection.ts b/packages/react/src/hooks/useConnection.ts index 46784c4f..94db5140 100644 --- a/packages/react/src/hooks/useConnection.ts +++ b/packages/react/src/hooks/useConnection.ts @@ -4,17 +4,34 @@ import { ConnectionState, pointToRendererPoint } from '@xyflow/system'; import { useStore } from './useStore'; import type { InternalNode, Node, ReactFlowStore } from '../types'; -const selector = (s: ReactFlowStore) => { +function storeSelector(s: ReactFlowStore) { return s.connection.inProgress ? { ...s.connection, to: pointToRendererPoint(s.connection.to, s.transform) } : { ...s.connection }; -}; +} + +function getSelector>>( + connectionSelector?: (connection: ConnectionState>) => SelectorReturn +): (s: ReactFlowStore) => SelectorReturn | ConnectionState { + if (connectionSelector) { + const combinedSelector = (s: ReactFlowStore) => { + const connection = storeSelector(s) as ConnectionState>; + return connectionSelector(connection); + }; + return combinedSelector; + } + + return storeSelector; +} /** * Hook for accessing the connection state. * * @public * @returns ConnectionState */ -export function useConnection(): ConnectionState> { - return useStore(selector, shallow) as ConnectionState>; +export function useConnection>>( + connectionSelector?: (connection: ConnectionState>) => SelectorReturn +): SelectorReturn { + const combinedSelector = getSelector(connectionSelector); + return useStore(combinedSelector, shallow) as SelectorReturn; }