@atlaskit/editor-plugin-editor-viewmode-effects
Version:
Editor-Viewmode effects plugin for @atlaskit/editor-core
145 lines (143 loc) • 6.69 kB
JavaScript
"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)
}];
}
};
};