diff --git a/packages/lexical-react/src/LexicalCollaborationPlugin.tsx b/packages/lexical-react/src/LexicalCollaborationPlugin.tsx index d38cbe549..f5ef13406 100644 --- a/packages/lexical-react/src/LexicalCollaborationPlugin.tsx +++ b/packages/lexical-react/src/LexicalCollaborationPlugin.tsx @@ -19,6 +19,7 @@ import { createBinding, ExcludedProperties, Provider, + SyncCursorPositionsFn, } from '@lexical/yjs'; import {LexicalEditor} from 'lexical'; import {useEffect, useRef, useState} from 'react'; @@ -46,6 +47,7 @@ type Props = { excludedProperties?: ExcludedProperties; // `awarenessData` parameter allows arbitrary data to be added to the awareness. awarenessData?: object; + syncCursorPositionsFn?: SyncCursorPositionsFn; }; export function CollaborationPlugin({ @@ -58,6 +60,7 @@ export function CollaborationPlugin({ initialEditorState, excludedProperties, awarenessData, + syncCursorPositionsFn, }: Props): JSX.Element { const isBindingInitialized = useRef(false); const isProviderInitialized = useRef(false); @@ -145,6 +148,7 @@ export function CollaborationPlugin({ setDoc={setDoc} shouldBootstrap={shouldBootstrap} yjsDocMap={yjsDocMap} + syncCursorPositionsFn={syncCursorPositionsFn} /> ); } @@ -163,6 +167,7 @@ function YjsCollaborationCursors({ collabContext, binding, setDoc, + syncCursorPositionsFn, }: { editor: LexicalEditor; id: string; @@ -177,6 +182,7 @@ function YjsCollaborationCursors({ initialEditorState?: InitialEditorStateType | undefined; awarenessData?: object; collabContext: CollaborationContextType; + syncCursorPositionsFn?: SyncCursorPositionsFn; }) { const cursors = useYjsCollaboration( editor, @@ -191,6 +197,7 @@ function YjsCollaborationCursors({ cursorsContainerRef, initialEditorState, awarenessData, + syncCursorPositionsFn, ); collabContext.clientID = binding.clientID; diff --git a/packages/lexical-yjs/src/SyncCursors.ts b/packages/lexical-yjs/src/SyncCursors.ts index a559865c2..8827dc299 100644 --- a/packages/lexical-yjs/src/SyncCursors.ts +++ b/packages/lexical-yjs/src/SyncCursors.ts @@ -413,13 +413,30 @@ function getCollabNodeAndOffset( export type SyncCursorPositionsFn = ( binding: Binding, provider: Provider, + options?: SyncCursorPositionsOptions, ) => void; +export type SyncCursorPositionsOptions = { + getAwarenessStates?: ( + binding: Binding, + provider: Provider, + ) => Map; +}; + +function getAwarenessStatesDefault( + _binding: Binding, + provider: Provider, +): Map { + return provider.awareness.getStates(); +} + export function syncCursorPositions( binding: Binding, provider: Provider, + options?: SyncCursorPositionsOptions, ): void { - const awarenessStates = Array.from(provider.awareness.getStates()); + const {getAwarenessStates = getAwarenessStatesDefault} = options ?? {}; + const awarenessStates = Array.from(getAwarenessStates(binding, provider)); const localClientID = binding.clientID; const cursors = binding.cursors; const editor = binding.editor;