marshall-y-slate
Version:
Yjs bindings for Slate.
73 lines • 7.12 kB
JavaScript
import * as Y from 'yjs';
import { YjsEditor } from './yjs-editor';
import { absolutePositionToRelativePosition, relativePositionToAbsolutePosition } from '../cursor/utils';
import { Editor, Transforms } from 'slate';
export function withUndoManager(editor, options = {
trackedOrigins: [],
captureTimeout: 300,
deleteFilter: () => true
}) {
const e = editor;
const { onChange } = e;
let previousSelection;
const undoManager = new Y.UndoManager(e.sharedType, Object.assign(Object.assign({}, options), { trackedOrigins: new Set([editor].concat(options.trackedOrigins)) }));
e.onChange = () => {
onChange();
if (!YjsEditor.isRemote(e)) {
try {
const lastOperation = e.operations[e.operations.length - 1];
if (lastOperation && lastOperation.type === 'set_selection' && lastOperation.newProperties) {
const { anchor, focus } = lastOperation.newProperties;
const anchorRelative = anchor && absolutePositionToRelativePosition(e.sharedType, anchor);
const focusRelative = focus && absolutePositionToRelativePosition(e.sharedType, focus);
if (anchorRelative && focusRelative) {
previousSelection = {
anchorRelative,
focusRelative
};
}
}
}
catch (error) {
const e = editor;
if (e.onError) {
e.onError({ code: 10004, name: 'get previous relative', nativeError: error });
}
}
}
};
undoManager.on('stack-item-added', (event) => {
if (event.changedParentTypes.has(e.sharedType) && previousSelection) {
event.stackItem.meta.set(e, previousSelection);
previousSelection = null;
}
});
undoManager.on('stack-item-popped', (event) => {
const selection = event.stackItem.meta.get(e);
if (selection) {
const anchor = relativePositionToAbsolutePosition(e.sharedType, selection.anchorRelative);
const focus = relativePositionToAbsolutePosition(e.sharedType, selection.focusRelative);
if ((anchor === null || anchor === void 0 ? void 0 : anchor.path) && (focus === null || focus === void 0 ? void 0 : focus.path) && Editor.hasPath(e, anchor.path) && Editor.hasPath(e, focus.path)) {
Transforms.setSelection(e, {
anchor: anchor,
focus: focus
});
}
}
});
e.undoManager = undoManager;
e.undo = () => {
YjsEditor.asUndo(e, () => {
e.undoManager.undo();
});
Promise.resolve().then(() => Editor.normalize(editor));
};
e.redo = () => {
YjsEditor.asUndo(e, () => {
e.undoManager.redo();
});
Promise.resolve().then(() => Editor.normalize(editor));
};
return e;
}
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidW5kby1tYW5hZ2UuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi8uLi9zcmMvcGx1Z2luL3VuZG8tbWFuYWdlLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUNBLE9BQU8sS0FBSyxDQUFDLE1BQU0sS0FBSyxDQUFDO0FBQ3pCLE9BQU8sRUFBRSxTQUFTLEVBQUUsTUFBTSxjQUFjLENBQUM7QUFDekMsT0FBTyxFQUFFLGtDQUFrQyxFQUFFLGtDQUFrQyxFQUFFLE1BQU0saUJBQWlCLENBQUM7QUFDekcsT0FBTyxFQUF5QixNQUFNLEVBQVEsVUFBVSxFQUFFLE1BQU0sT0FBTyxDQUFDO0FBUXhFLE1BQU0sVUFBVSxlQUFlLENBQzdCLE1BQVMsRUFDVCxPQUFPLEdBQUc7SUFDUixjQUFjLEVBQUUsRUFBRTtJQUNsQixjQUFjLEVBQUUsR0FBRztJQUNuQixZQUFZLEVBQUUsR0FBRyxFQUFFLENBQUMsSUFBSTtDQUN6QjtJQUVELE1BQU0sQ0FBQyxHQUFHLE1BQTJCLENBQUM7SUFDdEMsTUFBTSxFQUFFLFFBQVEsRUFBRSxHQUFHLENBQUMsQ0FBQztJQUN2QixJQUFJLGlCQUFtRyxDQUFDO0lBQ3hHLE1BQU0sV0FBVyxHQUFHLElBQUksQ0FBQyxDQUFDLFdBQVcsQ0FBQyxDQUFDLENBQUMsVUFBVSxrQ0FDN0MsT0FBTyxLQUNWLGNBQWMsRUFBRSxJQUFJLEdBQUcsQ0FBQyxDQUFDLE1BQU0sQ0FBQyxDQUFDLE1BQU0sQ0FBQyxPQUFPLENBQUMsY0FBYyxDQUFDLENBQUMsSUFDaEUsQ0FBQztJQUVILENBQUMsQ0FBQyxRQUFRLEdBQUcsR0FBRyxFQUFFO1FBQ2hCLFFBQVEsRUFBRSxDQUFDO1FBQ1gsSUFBSSxDQUFDLFNBQVMsQ0FBQyxRQUFRLENBQUMsQ0FBQyxDQUFDLEVBQUU7WUFDMUIsSUFBSTtnQkFDRixNQUFNLGFBQWEsR0FBRyxDQUFDLENBQUMsVUFBVSxDQUFDLENBQUMsQ0FBQyxVQUFVLENBQUMsTUFBTSxHQUFHLENBQUMsQ0FB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