loro-codemirror
Version:
A CodeMirror plugin for loro
98 lines (97 loc) • 4.52 kB
JavaScript
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;
}