UNPKG

@atlaskit/editor-plugin-editor-viewmode-effects

Version:

Editor-Viewmode effects plugin for @atlaskit/editor-core

145 lines (143 loc) 6.69 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.editorViewModeEffectsPlugin = void 0; var _safePlugin = require("@atlaskit/editor-common/safe-plugin"); var _state = require("@atlaskit/editor-prosemirror/state"); var _transform = require("@atlaskit/editor-prosemirror/transform"); var _platformFeatureFlags = require("@atlaskit/platform-feature-flags"); var _expValEquals = require("@atlaskit/tmp-editor-statsig/exp-val-equals"); var _viewModeStep = require("./pm-plugins/viewModeStep"); var createFilterStepsPlugin = function createFilterStepsPlugin(api) { return function () { return new _safePlugin.SafePlugin({ filterTransaction: function filterTransaction(tr) { var _api$editorViewMode; var mode = api === null || api === void 0 || (_api$editorViewMode = api.editorViewMode) === null || _api$editorViewMode === void 0 || (_api$editorViewMode = _api$editorViewMode.sharedState.currentState()) === null || _api$editorViewMode === void 0 ? void 0 : _api$editorViewMode.mode; if (mode !== 'view') { return true; } if ((0, _expValEquals.expValEquals)('platform_editor_are_nodes_equal_ignore_mark_order', 'isEnabled', true)) { if (tr.getMeta('isRemote') || tr.getMeta('replaceDocument') || tr.getMeta('allowViewModeTransaction') && (0, _platformFeatureFlags.fg)('platform_editor_allow_viewmode_transaction')) { return true; } } else { if (tr.getMeta('isRemote') || tr.getMeta('allowViewModeTransaction') && (0, _platformFeatureFlags.fg)('platform_editor_allow_viewmode_transaction')) { return true; } } var viewModeSteps = tr.steps.reduce(function (acc, s) { if (s instanceof _viewModeStep.ViewModeNodeStep || s instanceof _viewModeStep.ViewModeStep) { acc.push(s); } return acc; }, []); if (viewModeSteps.length === 0 || !api) { if (tr.docChanged && // Check if the transaction contains any steps that modify the document (view mode steps do not) tr.steps.filter(function (s) { return s instanceof _transform.ReplaceAroundStep || s instanceof _transform.ReplaceStep || s instanceof _transform.AddMarkStep || s instanceof _transform.AddNodeMarkStep || s instanceof _transform.RemoveMarkStep || s instanceof _transform.RemoveNodeMarkStep; }).length) { return false; } return true; return true; } viewModeSteps.forEach(function (step) { if (step.inverted || !step.mark) { return; } if (step.mark.type.name === 'annotation') { if (step instanceof _viewModeStep.ViewModeNodeStep) { var _api$collabEdit; (_api$collabEdit = api.collabEdit) === null || _api$collabEdit === void 0 || _api$collabEdit.actions.addInlineCommentNodeMark({ mark: step.mark, pos: step.pos }); } else if (step instanceof _viewModeStep.ViewModeStep) { var _api$collabEdit2; (_api$collabEdit2 = api.collabEdit) === null || _api$collabEdit2 === void 0 || _api$collabEdit2.actions.addInlineCommentMark({ mark: step.mark, from: step.from, to: step.to }); } } }); // Ignored via go/ees007 // eslint-disable-next-line @atlaskit/editor/enforce-todo-comment-format // TODO: Follow-up and improve annotation logic so we can filter out transactions here return true; } }); }; }; var createReplaceDocumentTransactionPlugin = function createReplaceDocumentTransactionPlugin(api) { return function () { return new _safePlugin.SafePlugin({ // Shouldn't need explicit types but sometimes TS can't infer them so 🤷 appendTransaction: function appendTransaction(transactions, _oldState, newState) { var _api$editorViewMode2; if (!api) { return; } var isViewMode = (api === null || api === void 0 || (_api$editorViewMode2 = api.editorViewMode) === null || _api$editorViewMode2 === void 0 || (_api$editorViewMode2 = _api$editorViewMode2.sharedState.currentState()) === null || _api$editorViewMode2 === void 0 ? void 0 : _api$editorViewMode2.mode) === 'view'; if (!isViewMode) { return; } var remoteReplaceDocumentTransaction = transactions.find(function (tr) { var _api$collabEdit3; return (_api$collabEdit3 = api.collabEdit) === null || _api$collabEdit3 === void 0 || (_api$collabEdit3 = _api$collabEdit3.actions) === null || _api$collabEdit3 === void 0 ? void 0 : _api$collabEdit3.isRemoteReplaceDocumentTransaction(tr); }); if (!remoteReplaceDocumentTransaction || !remoteReplaceDocumentTransaction.selectionSet) { return; } var doc = newState.doc; var nextTr = newState.tr; var emptySelection = new _state.TextSelection(doc.resolve(0)); nextTr.setSelection(emptySelection); return nextTr; } }); }; }; var editorViewModeEffectsPlugin = exports.editorViewModeEffectsPlugin = function editorViewModeEffectsPlugin(_ref) { var api = _ref.api; return { name: 'editorViewModeEffects', actions: { allowViewModeTransaction: function allowViewModeTransaction(tr) { tr.setMeta('allowViewModeTransaction', true); return tr; }, applyViewModeStepAt: function applyViewModeStepAt(tr) { var marksSteps = tr.steps.reduce(function (acc, s) { // Ignored via go/ees007 // eslint-disable-next-line @atlaskit/editor/enforce-todo-comment-format // TODO: We probably want to check the RemoveMarkStep flow too. if (s instanceof _transform.AddMarkStep || s instanceof _transform.AddNodeMarkStep) { acc.push(s); } return acc; }, []); if (marksSteps.length === 0) { return false; } marksSteps.reverse().map(function (s) { return s instanceof _transform.AddNodeMarkStep ? tr.step(_viewModeStep.ViewModeNodeStep.from(s)) : tr.step(_viewModeStep.ViewModeStep.from(s)); }); return true; } }, pmPlugins: function pmPlugins() { return [{ name: 'editorViewModeEffectsFilterSteps', plugin: createFilterStepsPlugin(api) }, { name: 'editorViewModeEffectsReplaceDocumentTransaction', plugin: createReplaceDocumentTransactionPlugin(api) }]; } }; };