UNPKG

loro-codemirror

Version:
98 lines (97 loc) 4.52 kB
import { Prec } from "@codemirror/state"; import { Awareness, EphemeralStore, LoroDoc, LoroText, UndoManager } from "loro-crdt"; import { createCursorLayer as createAwarenessCursorLayer, createSelectionLayer as createAwarenessSelectionLayer, AwarenessPlugin, remoteAwarenessStateField, RemoteAwarenessPlugin, loroCursorTheme, } from "./awareness.js"; import { LoroSyncPluginValue } from "./sync.js"; import { keymap, ViewPlugin } from "@codemirror/view"; import { undoKeyMap, undoManagerStateField, UndoPluginValue } from "./undo.js"; import { defaultGetTextFromDoc } from "./utils.js"; import { createCursorLayer, createSelectionLayer, EphemeralPlugin, ephemeralStateField } from "./ephemeral.js"; export { undo, redo } from "./undo.js"; export { defaultGetTextFromDoc as getTextFromDoc }; /** * It is used to sync the document with the remote users. * * @param doc - LoroDoc instance * @returns Extension */ export const LoroSyncPlugin = (doc, getTextFromDoc) => { return ViewPlugin.define((view) => new LoroSyncPluginValue(view, doc, getTextFromDoc !== null && getTextFromDoc !== void 0 ? getTextFromDoc : defaultGetTextFromDoc)); }; /** * @deprecated Use LoroEphemeralPlugin instead * LoroAwarenessPlugin is a plugin that adds awareness to the editor. * It is used to sync the cursor position and selection of the editor with the remote users. * * @param doc - LoroDoc instance * @param awareness - Awareness instance * @param user - User info * @param getUserId - Function to get the user id. If not provided, the doc's peerId will be used. * @returns Extension[] */ export const LoroAwarenessPlugin = (doc, awareness, user, getUserId, getTextFromDoc) => { return [ remoteAwarenessStateField, createAwarenessCursorLayer(), createAwarenessSelectionLayer(), ViewPlugin.define((view) => new AwarenessPlugin(view, doc, user, awareness, getUserId, getTextFromDoc !== null && getTextFromDoc !== void 0 ? getTextFromDoc : defaultGetTextFromDoc)), ViewPlugin.define((view) => new RemoteAwarenessPlugin(view, doc, awareness)), loroCursorTheme, ]; }; /** * LoroEphemeralPlugin is a plugin that adds ephemeral to the editor. * It is used to sync the cursor position and selection of the editor with the remote users. * * @param doc - LoroDoc instance * @param ephemeral - EphemeralStore instance * @param user - User info * @param getTextFromDoc - Function to get the text from the doc. If not provided, the defaultGetTextFromDoc will be used. * @returns Extension[] */ export const LoroEphemeralPlugin = (doc, ephemeral, user, getTextFromDoc) => { return [ ephemeralStateField, createCursorLayer(), createSelectionLayer(), ViewPlugin.define((view) => new EphemeralPlugin(view, doc, user, ephemeral, getTextFromDoc !== null && getTextFromDoc !== void 0 ? getTextFromDoc : defaultGetTextFromDoc)), loroCursorTheme, ]; }; /** * LoroUndoPlugin is a plugin that adds undo/redo to the editor. * * @param doc - LoroDoc instance * @param undoManager - UndoManager instance * @returns Extension[] */ export const LoroUndoPlugin = (doc, undoManager, getTextFromDoc) => { getTextFromDoc = getTextFromDoc !== null && getTextFromDoc !== void 0 ? getTextFromDoc : defaultGetTextFromDoc; return [ undoManagerStateField.init(() => undoManager), Prec.high(keymap.of([...undoKeyMap])), ViewPlugin.define((view) => new UndoPluginValue(view, doc, undoManager, getTextFromDoc)), ]; }; export function LoroExtensions(doc, ephemeral, undoManager, getTextFromDoc) { getTextFromDoc = getTextFromDoc !== null && getTextFromDoc !== void 0 ? getTextFromDoc : defaultGetTextFromDoc; let extension = [ ViewPlugin.define((view) => new LoroSyncPluginValue(view, doc, getTextFromDoc)).extension, ]; if (undoManager) { extension = extension.concat([ undoManagerStateField.init(() => undoManager), Prec.high(keymap.of([...undoKeyMap])), ViewPlugin.define((view) => new UndoPluginValue(view, doc, undoManager, getTextFromDoc)).extension, ]); } if (ephemeral) { extension = extension.concat([ ephemeralStateField, createCursorLayer(), createSelectionLayer(), ViewPlugin.define((view) => new EphemeralPlugin(view, doc, ephemeral.user, ephemeral.ephemeral, getTextFromDoc)), loroCursorTheme, ]); } return extension; }