@atlaskit/editor-plugin-synced-block
Version:
SyncedBlock plugin for @atlaskit/editor-core
142 lines (139 loc) • 6.98 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.handleBodiedSyncBlockCreation = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _state = require("@atlaskit/editor-prosemirror/state");
var _types = require("../../types");
var _main = require("../main");
var _utils = require("./utils");
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
var onRetry = function onRetry(api, resourceId) {
return function () {
var _api$core, _api$core2;
api === null || api === void 0 || (_api$core = api.core) === null || _api$core === void 0 || _api$core.actions.focus();
api === null || api === void 0 || (_api$core2 = api.core) === null || _api$core2 === void 0 || _api$core2.actions.execute(function (_ref) {
var _api$syncedBlock, _api$syncedBlock2;
var tr = _ref.tr;
var pos = api === null || api === void 0 || (_api$syncedBlock = api.syncedBlock) === null || _api$syncedBlock === void 0 || (_api$syncedBlock = _api$syncedBlock.sharedState.currentState()) === null || _api$syncedBlock === void 0 || (_api$syncedBlock = _api$syncedBlock.retryCreationPosMap) === null || _api$syncedBlock === void 0 ? void 0 : _api$syncedBlock.get(resourceId);
var from = pos === null || pos === void 0 ? void 0 : pos.from;
var to = pos === null || pos === void 0 ? void 0 : pos.to;
if (from === undefined || to === undefined) {
return tr;
}
tr.setSelection(_state.TextSelection.create(tr.doc, from, to)).setMeta(_main.syncedBlockPluginKey, {
activeFlag: false
});
api === null || api === void 0 || (_api$syncedBlock2 = api.syncedBlock) === null || _api$syncedBlock2 === void 0 || _api$syncedBlock2.commands.insertSyncedBlock()({
tr: tr
});
return tr;
});
};
};
var getRevertCreationPos = function getRevertCreationPos(api, doc, resourceId) {
var _api$syncedBlock3;
var retryCreationPos = api === null || api === void 0 || (_api$syncedBlock3 = api.syncedBlock) === null || _api$syncedBlock3 === void 0 || (_api$syncedBlock3 = _api$syncedBlock3.sharedState.currentState()) === null || _api$syncedBlock3 === void 0 || (_api$syncedBlock3 = _api$syncedBlock3.retryCreationPosMap) === null || _api$syncedBlock3 === void 0 ? void 0 : _api$syncedBlock3.get(resourceId);
if (retryCreationPos) {
return retryCreationPos;
}
// Fallback to find the positions in case BE call returns before plugin state becomes available
// which is highly unlikely
var currentPos;
doc.descendants(function (node, pos) {
if (currentPos) {
return false;
}
if (node.type.name === 'bodiedSyncBlock' && resourceId === node.attrs.resourceId) {
currentPos = {
from: pos,
to: pos + node.nodeSize
};
return false;
}
});
return currentPos;
};
var buildRevertCreationTr = function buildRevertCreationTr(tr, pos) {
var _tr$doc$nodeAt;
var content = (_tr$doc$nodeAt = tr.doc.nodeAt(pos.from)) === null || _tr$doc$nodeAt === void 0 ? void 0 : _tr$doc$nodeAt.content;
if (content) {
tr.replaceWith(pos.from, pos.to, content);
var contentFrom = tr.mapping.map(pos.from);
tr.setSelection(_state.TextSelection.create(tr.doc, contentFrom, contentFrom + content.size));
} else {
tr.delete(pos.from, pos.to);
}
return tr;
};
/**
*
* Save the new bodiedSyncBlock to backend with empty content and handles revert (if failed) and retry flow
*/
var handleBodiedSyncBlockCreation = exports.handleBodiedSyncBlockCreation = function handleBodiedSyncBlockCreation(bodiedSyncBlockAdded, editorState, api) {
var syncBlockStore = _main.syncedBlockPluginKey.getState(editorState).syncBlockStore;
bodiedSyncBlockAdded.forEach(function (node) {
if (node.from === undefined || node.to === undefined) {
return;
}
var retryCreationPos = {
from: node.from,
to: node.to
};
var resourceId = node.attrs.resourceId;
(0, _utils.deferDispatch)(function () {
var _api$core3;
api === null || api === void 0 || (_api$core3 = api.core) === null || _api$core3 === void 0 || _api$core3.actions.execute(function (_ref2) {
var tr = _ref2.tr;
return tr.setMeta(_main.syncedBlockPluginKey, {
retryCreationPos: {
resourceId: resourceId,
pos: retryCreationPos
}
});
});
});
syncBlockStore.sourceManager.createBodiedSyncBlockNode(node.attrs, node.node, function (success) {
if (success) {
var _api$core4, _api$core5;
api === null || api === void 0 || (_api$core4 = api.core) === null || _api$core4 === void 0 || _api$core4.actions.execute(function (_ref3) {
var tr = _ref3.tr;
return tr.setMeta(_main.syncedBlockPluginKey, {
retryCreationPos: {
resourceId: resourceId,
pos: undefined
}
});
});
api === null || api === void 0 || (_api$core5 = api.core) === null || _api$core5 === void 0 || _api$core5.actions.focus();
} else {
var _api$core6;
api === null || api === void 0 || (_api$core6 = api.core) === null || _api$core6 === void 0 || _api$core6.actions.execute(function (_ref4) {
var tr = _ref4.tr;
var revertCreationPos = getRevertCreationPos(api, tr.doc, resourceId);
if (!revertCreationPos) {
return tr;
}
var revertTr = buildRevertCreationTr(tr, revertCreationPos);
return revertTr.setMeta('isConfirmedSyncBlockDeletion', true).setMeta('addToHistory', false).setMeta(_main.syncedBlockPluginKey, {
activeFlag: {
id: _types.FLAG_ID.CANNOT_CREATE_SYNC_BLOCK,
onRetry: onRetry(api, resourceId),
onDismissed: function onDismissed(tr) {
return tr.setMeta(_main.syncedBlockPluginKey, _objectSpread(_objectSpread({}, tr.getMeta(_main.syncedBlockPluginKey)), {}, {
retryCreationPos: {
resourceId: resourceId,
pos: undefined
}
}));
}
}
});
});
}
});
});
};