@atlaskit/editor-plugin-text-formatting
Version:
Text-formatting plugin for @atlaskit/editor-core
280 lines (277 loc) • 11.9 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.useHasFormattingActived = exports.useFormattingIcons = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _react = require("react");
var _react2 = require("@emotion/react");
var _analytics = require("@atlaskit/editor-common/analytics");
var _keymaps = require("@atlaskit/editor-common/keymaps");
var _messages = require("@atlaskit/editor-common/messages");
var _preset = require("@atlaskit/editor-common/preset");
var _shortcut = require("@atlaskit/editor-shared-styles/shortcut");
var _angleBrackets = _interopRequireDefault(require("@atlaskit/icon/core/angle-brackets"));
var _textBold = _interopRequireDefault(require("@atlaskit/icon/core/text-bold"));
var _textItalic = _interopRequireDefault(require("@atlaskit/icon/core/text-italic"));
var _textStrikethrough = _interopRequireDefault(require("@atlaskit/icon/core/text-strikethrough"));
var _textUnderline = _interopRequireDefault(require("@atlaskit/icon/core/text-underline"));
var _experiments = require("@atlaskit/tmp-editor-statsig/experiments");
var _toggleMark = require("../../../editor-commands/toggle-mark");
var _icons = require("../icons");
var _inputMethodUtils = require("../input-method-utils");
var _types = require("../types");
/**
* @jsxRuntime classic
* @jsx jsx
*/
// eslint-disable-next-line @atlaskit/ui-styling-standard/use-compiled -- Ignored via go/DSP-18766
var withInputMethod = function withInputMethod(toolbarType, func) {
return (0, _preset.editorCommandToPMCommand)(func((0, _inputMethodUtils.getInputMethod)(toolbarType)));
};
var IconButtons = function IconButtons(editorAnalyticsAPI, toolbarType) {
return {
strong: {
buttonId: _analytics.TOOLBAR_ACTION_SUBJECT_ID.TEXT_FORMATTING_STRONG,
command: withInputMethod(toolbarType, (0, _toggleMark.toggleStrongWithAnalytics)(editorAnalyticsAPI)),
message: _messages.toolbarMessages.bold,
tooltipKeymap: _keymaps.toggleBold,
component: function component() {
return (0, _react2.jsx)(_textBold.default, {
color: "currentColor",
spacing: "spacious",
label: ""
});
}
},
em: {
buttonId: _analytics.TOOLBAR_ACTION_SUBJECT_ID.TEXT_FORMATTING_ITALIC,
command: withInputMethod(toolbarType, (0, _toggleMark.toggleEmWithAnalytics)(editorAnalyticsAPI)),
message: _messages.toolbarMessages.italic,
tooltipKeymap: _keymaps.toggleItalic,
component: function component() {
return (0, _react2.jsx)(_textItalic.default, {
color: "currentColor",
spacing: "spacious",
label: ""
});
}
},
underline: {
buttonId: _analytics.TOOLBAR_ACTION_SUBJECT_ID.TEXT_FORMATTING_UNDERLINE,
command: withInputMethod(toolbarType, (0, _toggleMark.toggleUnderlineWithAnalytics)(editorAnalyticsAPI)),
message: _messages.toolbarMessages.underline,
tooltipKeymap: _keymaps.toggleUnderline,
component: function component() {
return (0, _react2.jsx)(_textUnderline.default, {
color: "currentColor",
spacing: "spacious",
label: ""
});
}
},
strike: {
command: withInputMethod(toolbarType, (0, _toggleMark.toggleStrikeWithAnalytics)(editorAnalyticsAPI)),
message: _messages.toolbarMessages.strike,
tooltipKeymap: _keymaps.toggleStrikethrough
},
code: {
command: withInputMethod(toolbarType, (0, _toggleMark.toggleCodeWithAnalytics)(editorAnalyticsAPI)),
message: _messages.toolbarMessages.code,
tooltipKeymap: _keymaps.toggleCode
},
subscript: {
command: withInputMethod(toolbarType, (0, _toggleMark.toggleSubscriptWithAnalytics)(editorAnalyticsAPI)),
message: _messages.toolbarMessages.subscript,
tooltipKeymap: _keymaps.toggleSubscript
},
superscript: {
command: withInputMethod(toolbarType, (0, _toggleMark.toggleSuperscriptWithAnalytics)(editorAnalyticsAPI)),
message: _messages.toolbarMessages.superscript,
tooltipKeymap: _keymaps.toggleSuperscript
}
};
};
var IconBefore = {
strong: {
icon: (0, _react2.jsx)(_textBold.default, {
color: "currentColor",
spacing: "spacious",
label: ""
})
},
em: {
icon: (0, _react2.jsx)(_textItalic.default, {
color: "currentColor",
spacing: "spacious",
label: ""
})
},
underline: {
icon: (0, _react2.jsx)(_textUnderline.default, {
color: "currentColor",
spacing: "spacious",
label: ""
})
},
strike: {
icon: (0, _react2.jsx)(_textStrikethrough.default, {
label: ""
})
},
code: {
icon: (0, _react2.jsx)(_angleBrackets.default, {
color: "currentColor",
spacing: "spacious",
label: ""
})
},
subscript: {
icon: (0, _react2.jsx)(_icons.Subscript, null)
},
superscript: {
icon: (0, _react2.jsx)(_icons.Superscript, null)
}
};
var getIcon = function getIcon(_ref) {
var iconType = _ref.iconType,
isDisabled = _ref.isDisabled,
isActive = _ref.isActive,
intl = _ref.intl,
editorAnalyticsAPI = _ref.editorAnalyticsAPI,
toolbarType = _ref.toolbarType;
var icon = IconButtons(editorAnalyticsAPI, toolbarType)[iconType];
var iconBefore = IconBefore[iconType].icon;
var content = intl.formatMessage(icon.message);
var tooltipKeymap = icon.tooltipKeymap;
return {
content: content,
buttonId: icon.buttonId,
iconMark: iconType,
key: iconType,
command: icon.command,
iconElement: icon.component ? icon.component() : undefined,
tooltipElement: tooltipKeymap ? (0, _react2.jsx)(_keymaps.ToolTipContent, {
description: content,
keymap: tooltipKeymap
}) : undefined,
elemBefore: (0, _experiments.editorExperiment)('platform_editor_controls', 'variant1') ? iconBefore : undefined,
elemAfter: tooltipKeymap ?
// eslint-disable-next-line @atlaskit/design-system/consistent-css-prop-usage, @atlaskit/ui-styling-standard/no-imported-style-values -- Ignored via go/DSP-18766
(0, _react2.jsx)("div", {
css: _shortcut.shortcutStyle
}, (0, _keymaps.tooltip)(tooltipKeymap)) : undefined,
value: {
name: iconType
},
isActive: isActive,
isDisabled: isDisabled,
'aria-label': tooltipKeymap ? (0, _keymaps.tooltip)(tooltipKeymap, String(content)) : String(content),
'aria-keyshortcuts': (0, _keymaps.getAriaKeyshortcuts)(tooltipKeymap)
};
};
var IconsMarkSchema = (0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)((0, _defineProperty2.default)({}, _types.IconTypes.strong, 'strong'), _types.IconTypes.em, 'em'), _types.IconTypes.strike, 'strike'), _types.IconTypes.code, 'code'), _types.IconTypes.underline, 'underline'), _types.IconTypes.superscript, 'subsup'), _types.IconTypes.subscript, 'subsup');
var buildMenuIconState = function buildMenuIconState(iconMark) {
return function (_ref2) {
var schema = _ref2.schema,
textFormattingState = _ref2.textFormattingState;
var hasPluginState = Boolean(textFormattingState === null || textFormattingState === void 0 ? void 0 : textFormattingState.isInitialised);
var markSchema = IconsMarkSchema[iconMark];
var hasSchemaMark = Boolean(schema.marks[markSchema]);
if (!hasPluginState) {
return {
isActive: false,
isDisabled: true,
isHidden: false,
hasSchemaMark: hasSchemaMark
};
}
var isActive = textFormattingState === null || textFormattingState === void 0 ? void 0 : textFormattingState["".concat(iconMark, "Active")];
var isDisabled = textFormattingState === null || textFormattingState === void 0 ? void 0 : textFormattingState["".concat(iconMark, "Disabled")];
var isHidden = textFormattingState === null || textFormattingState === void 0 ? void 0 : textFormattingState["".concat(iconMark, "Hidden")];
return {
isActive: Boolean(isActive),
isDisabled: Boolean(isDisabled),
isHidden: Boolean(isHidden),
hasSchemaMark: hasSchemaMark
};
};
};
var buildIcon = function buildIcon(iconMark, editorAnalyticsAPI, toolbarType) {
var getState = buildMenuIconState(iconMark);
return function (_ref3) {
var schema = _ref3.schema,
textFormattingState = _ref3.textFormattingState,
intl = _ref3.intl,
isToolbarDisabled = _ref3.isToolbarDisabled;
var iconState = getState({
schema: schema,
textFormattingState: textFormattingState
});
var isActive = iconState.isActive,
isDisabled = iconState.isDisabled,
isHidden = iconState.isHidden,
hasSchemaMark = iconState.hasSchemaMark;
var iconComponent = (0, _react.useMemo)(function () {
return getIcon({
iconType: _types.IconTypes[iconMark],
isDisabled: isToolbarDisabled || isDisabled,
isActive: isActive,
intl: intl,
editorAnalyticsAPI: editorAnalyticsAPI,
toolbarType: toolbarType
});
}, [isToolbarDisabled, isDisabled, isActive, intl]);
var shouldRenderIcon = hasSchemaMark && !isHidden;
return (0, _react.useMemo)(function () {
return shouldRenderIcon ? iconComponent : null;
}, [shouldRenderIcon, iconComponent]);
};
};
var useFormattingIcons = exports.useFormattingIcons = function useFormattingIcons(_ref4) {
var isToolbarDisabled = _ref4.isToolbarDisabled,
textFormattingState = _ref4.textFormattingState,
schema = _ref4.schema,
intl = _ref4.intl,
editorAnalyticsAPI = _ref4.editorAnalyticsAPI,
toolbarType = _ref4.toolbarType;
var props = {
schema: schema,
textFormattingState: textFormattingState,
intl: intl,
isToolbarDisabled: Boolean(isToolbarDisabled),
toolbarType: toolbarType
};
var buildStrongIcon = buildIcon(_types.IconTypes.strong, editorAnalyticsAPI, toolbarType);
var buildEmIcon = buildIcon(_types.IconTypes.em, editorAnalyticsAPI, toolbarType);
var buildUnderlineIcon = buildIcon(_types.IconTypes.underline, editorAnalyticsAPI, toolbarType);
var buildStrikeIcon = buildIcon(_types.IconTypes.strike, editorAnalyticsAPI, toolbarType);
var buildCodeIcon = buildIcon(_types.IconTypes.code, editorAnalyticsAPI, toolbarType);
var buildSubscriptIcon = buildIcon(_types.IconTypes.subscript, editorAnalyticsAPI, toolbarType);
var buildSuperscriptIcon = buildIcon(_types.IconTypes.superscript, editorAnalyticsAPI, toolbarType);
var strongIcon = buildStrongIcon(props);
var emIcon = buildEmIcon(props);
var underlineIcon = buildUnderlineIcon(props);
var strikeIcon = buildStrikeIcon(props);
var codeIcon = buildCodeIcon(props);
var subscriptIcon = buildSubscriptIcon(props);
var superscriptIcon = buildSuperscriptIcon(props);
var result = (0, _react.useMemo)(function () {
return [strongIcon, emIcon, underlineIcon, strikeIcon, codeIcon, subscriptIcon, superscriptIcon];
}, [strongIcon, emIcon, underlineIcon, strikeIcon, codeIcon, subscriptIcon, superscriptIcon]);
return result;
};
var useHasFormattingActived = exports.useHasFormattingActived = function useHasFormattingActived(_ref5) {
var iconTypeList = _ref5.iconTypeList,
textFormattingState = _ref5.textFormattingState;
var hasActiveFormatting = (0, _react.useMemo)(function () {
if (!(textFormattingState !== null && textFormattingState !== void 0 && textFormattingState.isInitialised)) {
return false;
}
return iconTypeList.some(function (iconType) {
return textFormattingState["".concat(iconType, "Active")];
});
}, [textFormattingState, iconTypeList]);
return hasActiveFormatting;
};