117 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
		
		
			
		
	
	
			117 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
| 
								 | 
							
								/**
							 | 
						||
| 
								 | 
							
								 * Copyright (c) Meta Platforms, Inc. and affiliates.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 * This source code is licensed under the MIT license found in the
							 | 
						||
| 
								 | 
							
								 * LICENSE file in the root directory of this source tree.
							 | 
						||
| 
								 | 
							
								 *
							 | 
						||
| 
								 | 
							
								 */
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import type {Binding} from './Bindings';
							 | 
						||
| 
								 | 
							
								import type {LexicalCommand} from 'lexical';
							 | 
						||
| 
								 | 
							
								import type {Doc, RelativePosition, UndoManager, XmlText} from 'yjs';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								import {createCommand} from 'lexical';
							 | 
						||
| 
								 | 
							
								import {UndoManager as YjsUndoManager} from 'yjs';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								export type UserState = {
							 | 
						||
| 
								 | 
							
								  anchorPos: null | RelativePosition;
							 | 
						||
| 
								 | 
							
								  color: string;
							 | 
						||
| 
								 | 
							
								  focusing: boolean;
							 | 
						||
| 
								 | 
							
								  focusPos: null | RelativePosition;
							 | 
						||
| 
								 | 
							
								  name: string;
							 | 
						||
| 
								 | 
							
								  awarenessData: object;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								export const CONNECTED_COMMAND: LexicalCommand<boolean> =
							 | 
						||
| 
								 | 
							
								  createCommand('CONNECTED_COMMAND');
							 | 
						||
| 
								 | 
							
								export const TOGGLE_CONNECT_COMMAND: LexicalCommand<boolean> = createCommand(
							 | 
						||
| 
								 | 
							
								  'TOGGLE_CONNECT_COMMAND',
							 | 
						||
| 
								 | 
							
								);
							 | 
						||
| 
								 | 
							
								export type ProviderAwareness = {
							 | 
						||
| 
								 | 
							
								  getLocalState: () => UserState | null;
							 | 
						||
| 
								 | 
							
								  getStates: () => Map<number, UserState>;
							 | 
						||
| 
								 | 
							
								  off: (type: 'update', cb: () => void) => void;
							 | 
						||
| 
								 | 
							
								  on: (type: 'update', cb: () => void) => void;
							 | 
						||
| 
								 | 
							
								  setLocalState: (arg0: UserState) => void;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								declare interface Provider {
							 | 
						||
| 
								 | 
							
								  awareness: ProviderAwareness;
							 | 
						||
| 
								 | 
							
								  connect(): void | Promise<void>;
							 | 
						||
| 
								 | 
							
								  disconnect(): void;
							 | 
						||
| 
								 | 
							
								  off(type: 'sync', cb: (isSynced: boolean) => void): void;
							 | 
						||
| 
								 | 
							
								  off(type: 'update', cb: (arg0: unknown) => void): void;
							 | 
						||
| 
								 | 
							
								  off(type: 'status', cb: (arg0: {status: string}) => void): void;
							 | 
						||
| 
								 | 
							
								  off(type: 'reload', cb: (doc: Doc) => void): void;
							 | 
						||
| 
								 | 
							
								  on(type: 'sync', cb: (isSynced: boolean) => void): void;
							 | 
						||
| 
								 | 
							
								  on(type: 'status', cb: (arg0: {status: string}) => void): void;
							 | 
						||
| 
								 | 
							
								  on(type: 'update', cb: (arg0: unknown) => void): void;
							 | 
						||
| 
								 | 
							
								  on(type: 'reload', cb: (doc: Doc) => void): void;
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								export type Operation = {
							 | 
						||
| 
								 | 
							
								  attributes: {
							 | 
						||
| 
								 | 
							
								    __type: string;
							 | 
						||
| 
								 | 
							
								  };
							 | 
						||
| 
								 | 
							
								  insert: string | Record<string, unknown>;
							 | 
						||
| 
								 | 
							
								};
							 | 
						||
| 
								 | 
							
								export type Delta = Array<Operation>;
							 | 
						||
| 
								 | 
							
								export type YjsNode = Record<string, unknown>;
							 | 
						||
| 
								 | 
							
								export type YjsEvent = Record<string, unknown>;
							 | 
						||
| 
								 | 
							
								export type {Provider};
							 | 
						||
| 
								 | 
							
								export type {Binding, ClientID, ExcludedProperties} from './Bindings';
							 | 
						||
| 
								 | 
							
								export {createBinding} from './Bindings';
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								export function createUndoManager(
							 | 
						||
| 
								 | 
							
								  binding: Binding,
							 | 
						||
| 
								 | 
							
								  root: XmlText,
							 | 
						||
| 
								 | 
							
								): UndoManager {
							 | 
						||
| 
								 | 
							
								  return new YjsUndoManager(root, {
							 | 
						||
| 
								 | 
							
								    trackedOrigins: new Set([binding, null]),
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								export function initLocalState(
							 | 
						||
| 
								 | 
							
								  provider: Provider,
							 | 
						||
| 
								 | 
							
								  name: string,
							 | 
						||
| 
								 | 
							
								  color: string,
							 | 
						||
| 
								 | 
							
								  focusing: boolean,
							 | 
						||
| 
								 | 
							
								  awarenessData: object,
							 | 
						||
| 
								 | 
							
								): void {
							 | 
						||
| 
								 | 
							
								  provider.awareness.setLocalState({
							 | 
						||
| 
								 | 
							
								    anchorPos: null,
							 | 
						||
| 
								 | 
							
								    awarenessData,
							 | 
						||
| 
								 | 
							
								    color,
							 | 
						||
| 
								 | 
							
								    focusPos: null,
							 | 
						||
| 
								 | 
							
								    focusing: focusing,
							 | 
						||
| 
								 | 
							
								    name,
							 | 
						||
| 
								 | 
							
								  });
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								export function setLocalStateFocus(
							 | 
						||
| 
								 | 
							
								  provider: Provider,
							 | 
						||
| 
								 | 
							
								  name: string,
							 | 
						||
| 
								 | 
							
								  color: string,
							 | 
						||
| 
								 | 
							
								  focusing: boolean,
							 | 
						||
| 
								 | 
							
								  awarenessData: object,
							 | 
						||
| 
								 | 
							
								): void {
							 | 
						||
| 
								 | 
							
								  const {awareness} = provider;
							 | 
						||
| 
								 | 
							
								  let localState = awareness.getLocalState();
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  if (localState === null) {
							 | 
						||
| 
								 | 
							
								    localState = {
							 | 
						||
| 
								 | 
							
								      anchorPos: null,
							 | 
						||
| 
								 | 
							
								      awarenessData,
							 | 
						||
| 
								 | 
							
								      color,
							 | 
						||
| 
								 | 
							
								      focusPos: null,
							 | 
						||
| 
								 | 
							
								      focusing: focusing,
							 | 
						||
| 
								 | 
							
								      name,
							 | 
						||
| 
								 | 
							
								    };
							 | 
						||
| 
								 | 
							
								  }
							 | 
						||
| 
								 | 
							
								
							 | 
						||
| 
								 | 
							
								  localState.focusing = focusing;
							 | 
						||
| 
								 | 
							
								  awareness.setLocalState(localState);
							 | 
						||
| 
								 | 
							
								}
							 | 
						||
| 
								 | 
							
								export {syncCursorPositions} from './SyncCursors';
							 | 
						||
| 
								 | 
							
								export {
							 | 
						||
| 
								 | 
							
								  syncLexicalUpdateToYjs,
							 | 
						||
| 
								 | 
							
								  syncYjsChangesToLexical,
							 | 
						||
| 
								 | 
							
								} from './SyncEditorStates';
							 |