UNPKG

@atlaskit/editor-plugin-collab-edit

Version:

Collab Edit plugin for @atlaskit/editor-core

104 lines (102 loc) 3.59 kB
// Ignored via go/ees005 // eslint-disable-next-line import/no-namespace import * as allAdfSchemaSteps from '@atlaskit/adf-schema/steps'; // Ignored via go/ees005 // eslint-disable-next-line import/no-namespace import * as allAtlaskitCustomSteps from '@atlaskit/custom-steps'; import { AllSelection, NodeSelection } from '@atlaskit/editor-prosemirror/state'; import { Step } from '@atlaskit/editor-prosemirror/transform'; import { receiveTransaction } from '@atlaskit/prosemirror-collab'; import { replaceDocument } from './utils'; /* * This is a non-op function to force ProseMirror to load and register all custom steps in the same bundle */ export var registerAllCustomSteps = function registerAllCustomSteps() { Object.entries(allAtlaskitCustomSteps).forEach(function () {}); Object.entries(allAdfSchemaSteps).forEach(function () {}); }; export var handleInit = function handleInit(initData, view, options, editorAnalyticsApi) { var doc = initData.doc, json = initData.json, version = initData.version, reserveCursor = initData.reserveCursor; if (doc) { var state = view.state; var tr = replaceDocument(doc, state, version, options, reserveCursor, editorAnalyticsApi); tr.setMeta('isRemote', true); view.dispatch(tr); } else if (json) { applyRemoteSteps(json, view); } }; export var handleConnection = function handleConnection(connectionData, view) { var tr = view.state.tr; view.dispatch(tr.setMeta('sessionId', connectionData)); }; export var handlePresence = function handlePresence(presenceData, view) { var tr = view.state.tr; view.dispatch(tr.setMeta('presence', presenceData)); }; export var applyRemoteData = function applyRemoteData(remoteData, view, options) { var json = remoteData.json, _remoteData$userIds = remoteData.userIds, userIds = _remoteData$userIds === void 0 ? [] : _remoteData$userIds; if (json) { applyRemoteSteps(json, view, userIds, options); } }; export var applyRemoteSteps = function applyRemoteSteps(json, view, userIds, options) { if (!json || !json.length) { return; } var state = view.state, schema = view.state.schema; var steps = json.map(function (step) { return Step.fromJSON(schema, step); }); var tr; if (options && options.useNativePlugin && userIds) { tr = receiveTransaction(state, steps, userIds, { mapSelectionBackward: true }); } else { tr = state.tr; steps.forEach(function (step) { return tr.step(step); }); } if (tr) { tr.setMeta('addToHistory', false); tr.setMeta('isRemote', true); /* * Persist marks across transactions. Fixes an issue where * marks are lost if remote transactions are dispatched * between a user creating the mark and typing. */ if (state.tr.storedMarks) { tr.setStoredMarks(state.tr.storedMarks); } view.dispatch(tr); } }; export var handleTelePointer = function handleTelePointer(telepointerData, view) { var tr = view.state.tr; view.dispatch(tr.setMeta('telepointer', telepointerData)); }; function isAllSelection(selection) { return selection instanceof AllSelection; } function isNodeSelection(selection) { return selection instanceof NodeSelection; } export var getSendableSelection = function getSendableSelection(selection) { /** * <kbd>CMD + A</kbd> triggers a AllSelection * <kbd>escape</kbd> triggers a NodeSelection */ return { type: 'textSelection', anchor: selection.anchor, head: isAllSelection(selection) || isNodeSelection(selection) ? selection.head - 1 : selection.head }; };