UNPKG

@atlaskit/editor-plugin-synced-block

Version:

SyncedBlock plugin for @atlaskit/editor-core

142 lines (139 loc) 6.98 kB
"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 } })); } } }); }); } }); }); };