@atlaskit/editor-plugin-synced-block
Version:
SyncedBlock plugin for @atlaskit/editor-core
164 lines (162 loc) • 10.2 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
var _typeof = require("@babel/runtime/helpers/typeof");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.getToolbarConfig = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _react = _interopRequireDefault(require("react"));
var _analytics = require("@atlaskit/editor-common/analytics");
var _messages = _interopRequireWildcard(require("@atlaskit/editor-common/messages"));
var _ui = require("@atlaskit/editor-common/ui");
var _utils = require("@atlaskit/editor-prosemirror/utils");
var _consts = require("@atlaskit/editor-shared-styles/consts");
var _editorSyncedBlockProvider = require("@atlaskit/editor-synced-block-provider");
var _copy = _interopRequireDefault(require("@atlaskit/icon/core/copy"));
var _delete = _interopRequireDefault(require("@atlaskit/icon/core/delete"));
var _edit = _interopRequireDefault(require("@atlaskit/icon/core/edit"));
var _linkBroken = _interopRequireDefault(require("@atlaskit/icon/core/link-broken"));
var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
var _editorCommands = require("../editor-commands");
var _utils2 = require("../pm-plugins/utils/utils");
var _types = require("../types");
var _SyncedLocationDropdown = require("./SyncedLocationDropdown");
function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
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 getToolbarConfig = exports.getToolbarConfig = function getToolbarConfig(state, intl, api, syncBlockStore) {
var _syncBlockInstance$er, _api$decorations, _api$connectivity;
var syncBlockObject = (0, _utils2.findSyncBlockOrBodiedSyncBlock)(state.schema, state.selection);
if (!syncBlockObject) {
return;
}
if (syncBlockStore.sourceManager.isPendingCreation(syncBlockObject.node.attrs.resourceId)) {
return;
}
var syncBlockInstance = syncBlockStore.referenceManager.getFromCache(syncBlockObject.node.attrs.resourceId);
var isUnsyncedBlock = (syncBlockInstance === null || syncBlockInstance === void 0 || (_syncBlockInstance$er = syncBlockInstance.error) === null || _syncBlockInstance$er === void 0 ? void 0 : _syncBlockInstance$er.type) === _editorSyncedBlockProvider.SyncBlockError.NotFound;
var isErroredBlock = syncBlockInstance === null || syncBlockInstance === void 0 ? void 0 : syncBlockInstance.error;
var bodiedSyncBlock = state.schema.nodes.bodiedSyncBlock;
var isBodiedSyncBlock = (0, _utils2.isBodiedSyncBlockNode)(syncBlockObject.node, bodiedSyncBlock);
var _syncBlockObject$node = syncBlockObject.node.attrs,
resourceId = _syncBlockObject$node.resourceId,
localId = _syncBlockObject$node.localId;
var formatMessage = intl.formatMessage;
var nodeType = syncBlockObject.node.type;
var hoverDecoration = api === null || api === void 0 || (_api$decorations = api.decorations) === null || _api$decorations === void 0 ? void 0 : _api$decorations.actions.hoverDecoration;
var hoverDecorationProps = function hoverDecorationProps(nodeType, className) {
return {
onMouseEnter: hoverDecoration === null || hoverDecoration === void 0 ? void 0 : hoverDecoration(nodeType, true, className),
onMouseLeave: hoverDecoration === null || hoverDecoration === void 0 ? void 0 : hoverDecoration(nodeType, false, className),
onFocus: hoverDecoration === null || hoverDecoration === void 0 ? void 0 : hoverDecoration(nodeType, true, className),
onBlur: hoverDecoration === null || hoverDecoration === void 0 ? void 0 : hoverDecoration(nodeType, false, className)
};
};
var items = [];
if (isUnsyncedBlock) {
var deleteButton = _objectSpread({
type: 'button',
title: formatMessage(_messages.default.delete),
onClick: (0, _editorCommands.removeSyncedBlock)(api),
icon: _delete.default,
testId: _types.SYNCED_BLOCK_BUTTON_TEST_ID.syncedBlockToolbarReferenceDelete
}, hoverDecorationProps(nodeType, _consts.akEditorSelectedNodeClassName));
items.push(deleteButton);
} else {
if (!isErroredBlock) {
var syncedLocation = {
type: 'custom',
fallback: [],
render: function render() {
return /*#__PURE__*/_react.default.createElement(_SyncedLocationDropdown.SyncedLocationDropdown, {
syncBlockStore: syncBlockStore,
resourceId: resourceId,
localId: localId,
intl: intl,
isSource: isBodiedSyncBlock,
api: api
});
}
};
var unsyncButton = {
type: 'custom',
fallback: [],
render: function render(view) {
var _syncBlockInstance$da;
return /*#__PURE__*/_react.default.createElement(_ui.FloatingToolbarButton, {
areAnyNewToolbarFlagsEnabled: true,
disabled: (0, _platformFeatureFlags.fg)('platform_synced_block_patch_8') ? (syncBlockInstance === null || syncBlockInstance === void 0 || (_syncBlockInstance$da = syncBlockInstance.data) === null || _syncBlockInstance$da === void 0 ? void 0 : _syncBlockInstance$da.status) === 'unpublished' : false,
icon: /*#__PURE__*/_react.default.createElement(_linkBroken.default, {
label: ""
}),
title: formatMessage(_messages.syncBlockMessages.unsyncButton)
// eslint-disable-next-line @atlassian/perf-linting/no-unstable-inline-props -- Ignored via go/ees017 (to be fixed)
,
onClick: function onClick() {
return (0, _editorCommands.unsync)(syncBlockStore, isBodiedSyncBlock, view);
},
testId: isBodiedSyncBlock ? _types.SYNCED_BLOCK_BUTTON_TEST_ID.syncedBlockToolbarSourceUnsync : _types.SYNCED_BLOCK_BUTTON_TEST_ID.syncedBlockToolbarReferenceUnsync
});
}
};
items.push(syncedLocation, unsyncButton);
}
var copyButton = _objectSpread({
id: 'editor.syncedBlock.copy',
type: 'button',
appearance: 'subtle',
icon: _copy.default,
title: formatMessage(_messages.syncBlockMessages.copySyncBlockLabel),
showTitle: false,
tooltipContent: formatMessage(_messages.syncBlockMessages.copySyncedBlockTooltip),
onClick: (0, _editorCommands.copySyncedBlockReferenceToClipboard)(syncBlockStore, _analytics.INPUT_METHOD.SYNCED_BLOCK_TB, api)
}, hoverDecorationProps(nodeType, _consts.akEditorSelectedNodeClassName));
items.push(copyButton);
var disabled = !syncBlockStore.referenceManager.getSyncBlockURL(syncBlockObject.node.attrs.resourceId);
if (!isBodiedSyncBlock) {
var editSourceButton = _objectSpread({
id: 'editor.syncedBlock.editSource',
type: 'button',
disabled: disabled,
appearance: 'subtle',
icon: _edit.default,
title: formatMessage(_messages.syncBlockMessages.editSourceLabel),
showTitle: false,
tooltipContent: disabled ? formatMessage(_messages.syncBlockMessages.editSourceTooltipDisabled) : formatMessage(_messages.syncBlockMessages.editSourceTooltip),
onClick: (0, _editorCommands.editSyncedBlockSource)(syncBlockStore, api)
}, hoverDecorationProps(nodeType, _consts.akEditorSelectedNodeClassName));
items.push(editSourceButton);
}
// testId is required to show focus on trigger button on ESC key press
// see hideOnEsc in platform/packages/editor/editor-plugin-floating-toolbar/src/ui/Dropdown.tsx
var testId = 'synced-block-overflow-dropdown-trigger';
var overflowMenuConfig = [{
type: 'overflow-dropdown',
testId: testId,
options: [_objectSpread({
title: formatMessage(_messages.default.delete),
onClick: (0, _editorCommands.removeSyncedBlock)(api),
icon: /*#__PURE__*/_react.default.createElement(_delete.default, {
label: ""
}),
testId: isBodiedSyncBlock ? _types.SYNCED_BLOCK_BUTTON_TEST_ID.syncedBlockToolbarSourceDelete : _types.SYNCED_BLOCK_BUTTON_TEST_ID.syncedBlockToolbarReferenceDelete
}, hoverDecorationProps(nodeType))]
}];
items.push.apply(items, overflowMenuConfig);
}
var getDomRef = function getDomRef(editorView) {
var domAtPos = editorView.domAtPos.bind(editorView);
var element = (0, _utils.findDomRefAtPos)(syncBlockObject.pos, domAtPos);
return element;
};
return {
title: 'Synced Block floating controls',
getDomRef: getDomRef,
nodeType: nodeType,
items: items,
scrollable: true,
groupLabel: formatMessage(_messages.syncBlockMessages.syncBlockGroup),
visible: (api === null || api === void 0 || (_api$connectivity = api.connectivity) === null || _api$connectivity === void 0 || (_api$connectivity = _api$connectivity.sharedState.currentState()) === null || _api$connectivity === void 0 ? void 0 : _api$connectivity.mode) !== 'offline'
};
};