@atlaskit/editor-plugin-block-controls
Version:
Block controls plugin for @atlaskit/editor-core
169 lines (168 loc) • 10.4 kB
JavaScript
import _toConsumableArray from "@babel/runtime/helpers/toConsumableArray";
import _defineProperty from "@babel/runtime/helpers/defineProperty";
import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
var _excluded = ["isHidden"];
function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t.return || t.return(); } finally { if (u) throw o; } } }; }
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
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) { _defineProperty(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; }
import React, { createContext, useContext, useMemo } from 'react';
import { BLOCK_CONTROL_UI_CONTEXT } from '@atlaskit/editor-common/block-controls/block-control-ui-context';
import { BLOCK_CONTROLS_LEFT_GROUP, BLOCK_CONTROLS_LEFT_SECTION, BLOCK_CONTROLS_LEFT_SURFACE, BLOCK_CONTROLS_RIGHT_GROUP, BLOCK_CONTROLS_RIGHT_SECTION, BLOCK_CONTROLS_RIGHT_SURFACE } from '@atlaskit/editor-common/block-controls/surface-keys';
import { createSurfaceContext } from '@atlaskit/editor-ui-control-model/create-surface-context';
import { getComponentIdentity, resolveSurface } from '@atlaskit/editor-ui-control-model/surface-renderer';
import { isExperimentEnabled } from '@atlaskit/platform-feature-experiments/is-experiment-enabled';
import { partitionComponentsByPersistence } from './utils/partition-components-by-persistence';
import { VisibilityWrapper } from './visibility-container';
var BlockControlsVisibilityContext = /*#__PURE__*/createContext({
shouldHideHoverControls: false,
useCssStyles: false
});
var BlockControlItem = function BlockControlItem(_ref) {
var children = _ref.children;
return /*#__PURE__*/React.createElement("div", {
"data-editor-block-control-item": true
}, children);
};
var HoverBlockControlItem = function HoverBlockControlItem(_ref2) {
var children = _ref2.children;
var _useContext = useContext(BlockControlsVisibilityContext),
shouldHideHoverControls = _useContext.shouldHideHoverControls,
useCssStyles = _useContext.useCssStyles;
return /*#__PURE__*/React.createElement(BlockControlItem, null, /*#__PURE__*/React.createElement(VisibilityWrapper, {
shouldHide: shouldHideHoverControls,
useCssStyles: useCssStyles
}, children));
};
var PersistentBlockControlItem = function PersistentBlockControlItem(_ref3) {
var children = _ref3.children;
var _useContext2 = useContext(BlockControlsVisibilityContext),
useCssStyles = _useContext2.useCssStyles;
return /*#__PURE__*/React.createElement(BlockControlItem, null, /*#__PURE__*/React.createElement(VisibilityWrapper, {
shouldHide: false,
useCssStyles: useCssStyles
}, children));
};
export var BlockControlsVisibilityProvider = function BlockControlsVisibilityProvider(_ref4) {
var children = _ref4.children,
shouldHideHoverControls = _ref4.shouldHideHoverControls,
useCssStyles = _ref4.useCssStyles;
var value = useMemo(function () {
return {
shouldHideHoverControls: shouldHideHoverControls,
useCssStyles: useCssStyles
};
}, [shouldHideHoverControls, useCssStyles]);
return /*#__PURE__*/React.createElement(BlockControlsVisibilityContext.Provider, {
value: value
}, children);
};
var withoutVisibilityPredicate = function withoutVisibilityPredicate(component) {
var _isHidden = component.isHidden,
visibleComponent = _objectWithoutProperties(component, _excluded);
return visibleComponent;
};
var withControlVisibility = function withControlVisibility(surfaceContext, controlVisibility) {
var context = surfaceContext.get(BLOCK_CONTROL_UI_CONTEXT);
if (!context) {
return surfaceContext;
}
var controlContext = createSurfaceContext(BLOCK_CONTROL_UI_CONTEXT, _objectSpread(_objectSpread({}, context), {}, {
controlVisibility: new Map(controlVisibility)
}));
return {
get: function get(token) {
var _controlContext$get;
return (_controlContext$get = controlContext.get(token)) !== null && _controlContext$get !== void 0 ? _controlContext$get : surfaceContext.get(token);
}
};
};
/**
* Replaces the shared surface group with one stable wrapper group per visible control. The wrappers
* inherit each control's rank, so SurfaceRenderer keeps the registry order without re-evaluating
* the controls' visibility predicates.
*/
var getBlockControlsSurfaceComponents = function getBlockControlsSurfaceComponents(components, _ref5, surfaceContext) {
var _resolvedSurface$chil;
var group = _ref5.group,
section = _ref5.section,
surface = _ref5.surface;
var resolvedSurface = resolveSurface(components, surface);
var groupIdentity = getComponentIdentity(group);
var controls = (_resolvedSurface$chil = resolvedSurface.childrenMap.get(groupIdentity)) !== null && _resolvedSurface$chil !== void 0 ? _resolvedSurface$chil : [];
var visibleControls = [];
var controlVisibility = isExperimentEnabled('platform_editor_remix_control_priority') ? new Map() : undefined;
var _iterator = _createForOfIteratorHelper(controls),
_step;
try {
for (_iterator.s(); !(_step = _iterator.n()).done;) {
var _control$isHidden, _control$isHidden2;
var control = _step.value;
var isHidden = (_control$isHidden = (_control$isHidden2 = control.isHidden) === null || _control$isHidden2 === void 0 ? void 0 : _control$isHidden2.call(control, {
surfaceContext: controlVisibility ? withControlVisibility(surfaceContext, controlVisibility) : surfaceContext
})) !== null && _control$isHidden !== void 0 ? _control$isHidden : false;
controlVisibility === null || controlVisibility === void 0 || controlVisibility.set(control.key, isHidden);
if (!isHidden) {
visibleControls.push(control);
}
}
} catch (err) {
_iterator.e(err);
} finally {
_iterator.f();
}
if (!resolvedSurface.root || visibleControls.length === 0) {
return undefined;
}
var controlIdentities = new Set(controls.map(getComponentIdentity));
var visibleControlIdentities = new Set(visibleControls.map(getComponentIdentity));
var _partitionComponentsB = partitionComponentsByPersistence(resolvedSurface.components.filter(function (component) {
var identity = getComponentIdentity(component);
return !controlIdentities.has(identity) || visibleControlIdentities.has(identity);
}), surface, surfaceContext),
persistentComponents = _partitionComponentsB.persistentComponents;
var persistentIdentities = new Set(persistentComponents.map(getComponentIdentity));
var structuralComponents = resolvedSurface.components.filter(function (component) {
var identity = getComponentIdentity(component);
return identity !== groupIdentity && !controlIdentities.has(identity);
}).map(withoutVisibilityPredicate);
var wrappedControls = visibleControls.flatMap(function (control) {
var _control$parents$find, _control$parents;
var identity = getComponentIdentity(control);
var rank = (_control$parents$find = (_control$parents = control.parents) === null || _control$parents === void 0 || (_control$parents = _control$parents.find(function (parent) {
return getComponentIdentity(parent) === groupIdentity;
})) === null || _control$parents === void 0 ? void 0 : _control$parents.rank) !== null && _control$parents$find !== void 0 ? _control$parents$find : 0;
var wrapper = {
component: persistentIdentities.has(identity) ? PersistentBlockControlItem : HoverBlockControlItem,
key: "block-control-item:".concat(identity),
parents: [_objectSpread(_objectSpread({}, section), {}, {
rank: rank
})],
type: 'group'
};
var visibleControl = _objectSpread(_objectSpread({}, withoutVisibilityPredicate(control)), {}, {
parents: [{
key: wrapper.key,
rank: 0,
type: wrapper.type
}]
});
return [wrapper, visibleControl];
});
return [].concat(_toConsumableArray(structuralComponents), _toConsumableArray(wrappedControls));
};
export var getBlockControlsLeftSurfaceComponents = function getBlockControlsLeftSurfaceComponents(components, surfaceContext) {
return getBlockControlsSurfaceComponents(components, {
group: BLOCK_CONTROLS_LEFT_GROUP,
section: BLOCK_CONTROLS_LEFT_SECTION,
surface: BLOCK_CONTROLS_LEFT_SURFACE
}, surfaceContext);
};
export var getBlockControlsRightSurfaceComponents = function getBlockControlsRightSurfaceComponents(components, surfaceContext) {
return getBlockControlsSurfaceComponents(components, {
group: BLOCK_CONTROLS_RIGHT_GROUP,
section: BLOCK_CONTROLS_RIGHT_SECTION,
surface: BLOCK_CONTROLS_RIGHT_SURFACE
}, surfaceContext);
};