@atlaskit/editor-plugin-insert-block
Version:
Insert block plugin for @atlaskit/editor-core
246 lines • 8.23 kB
JavaScript
import React from 'react';
import memoize from 'lodash/memoize';
import memoizeOne from 'memoize-one';
import { ToolTipContent } from '@atlaskit/editor-common/keymaps';
import { blockTypeMessages, toolbarInsertBlockMessages as messages } from '@atlaskit/editor-common/messages';
import { fg } from '@atlaskit/platform-feature-flags';
import { editorExperiment } from '@atlaskit/tmp-editor-statsig/experiments';
import { action, blockquote, codeblock, date, decision, emoji, expand, horizontalrule, imageUpload, layout, link, media, mention, panel, placeholder, status, table, tableSelector } from './item';
import { shallowEquals } from './shallow-equals';
const buttonToItem = memoize(button => ({
...button,
title: /*#__PURE__*/React.createElement(ToolTipContent, {
description: button.content,
shortcutOverride: button.shortcut
})
}));
const buttonToDropdownItem = memoizeOne(title => memoize(button => ({
...button,
title: /*#__PURE__*/React.createElement(ToolTipContent, {
description: title,
shortcutOverride: "/"
})
})));
const createInsertBlockItems = config => {
const {
isTypeAheadAllowed,
tableSupported,
tableSelectorSupported,
mediaUploadsEnabled,
mediaSupported,
imageUploadSupported,
imageUploadEnabled,
mentionsSupported,
mentionsDisabled,
availableWrapperBlockTypes,
actionSupported,
decisionSupported,
linkSupported,
linkDisabled,
emojiDisabled,
emojiProvider,
hasEmojiPlugin,
hasMentionsPlugin,
hasMediaPlugin,
nativeStatusSupported,
insertMenuItems,
dateEnabled,
placeholderTextEnabled,
horizontalRuleEnabled,
layoutSectionEnabled,
expandEnabled,
numberOfButtons,
schema,
formatMessage,
isEditorOffline
} = config;
const items = [];
const isOffline = isEditorOffline === true;
if (actionSupported) {
items.push(action({
content: formatMessage(messages.action),
tooltipDescription: formatMessage(messages.actionDescription),
disabled: false
}));
}
if (linkSupported) {
items.push(link({
content: formatMessage(messages.link),
tooltipDescription: formatMessage(messages.linkDescription),
disabled: !!linkDisabled,
'aria-haspopup': 'dialog'
}));
}
if (editorExperiment('platform_editor_prevent_toolbar_layout_shifts', true)) {
if (imageUploadSupported) {
items.push(imageUpload({
content: formatMessage(messages.image),
disabled: !imageUploadEnabled || isOffline
}));
} else if (hasMediaPlugin) {
items.push(media({
content: formatMessage(messages.addMediaFiles),
tooltipDescription: formatMessage(messages.mediaFilesDescription),
disabled: isOffline || !mediaSupported || !mediaUploadsEnabled
}));
}
if (hasMentionsPlugin) {
items.push(mention({
content: formatMessage(messages.mention),
tooltipDescription: formatMessage(messages.mentionDescription),
disabled: !isTypeAheadAllowed || !!mentionsDisabled || !mentionsSupported,
'aria-haspopup': 'listbox'
}));
}
if (hasEmojiPlugin) {
items.push(emoji({
content: formatMessage(messages.emoji),
tooltipDescription: formatMessage(messages.emojiDescription),
disabled: emojiDisabled || !isTypeAheadAllowed || !emojiProvider,
'aria-haspopup': 'dialog'
}));
}
} else {
if (mediaSupported && mediaUploadsEnabled) {
items.push(media({
content: formatMessage(messages.addMediaFiles),
tooltipDescription: formatMessage(messages.mediaFilesDescription),
disabled: isOffline
}));
}
if (imageUploadSupported) {
items.push(imageUpload({
content: formatMessage(messages.image),
disabled: !imageUploadEnabled || isOffline
}));
}
if (mentionsSupported) {
items.push(mention({
content: formatMessage(messages.mention),
tooltipDescription: formatMessage(messages.mentionDescription),
disabled: !isTypeAheadAllowed || !!mentionsDisabled,
'aria-haspopup': 'listbox'
}));
}
if (emojiProvider) {
items.push(emoji({
content: formatMessage(messages.emoji),
tooltipDescription: formatMessage(messages.emojiDescription),
disabled: emojiDisabled || !isTypeAheadAllowed,
'aria-haspopup': 'dialog'
}));
}
}
if (tableSupported) {
items.push(table({
content: formatMessage(messages.table),
tooltipDescription: formatMessage(messages.tableDescription),
disabled: false
}));
}
if (tableSupported && tableSelectorSupported) {
items.push(tableSelector({
content: formatMessage(messages.tableSelector),
tooltipDescription: formatMessage(messages.tableSelectorDescription),
disabled: false
}));
}
if (layoutSectionEnabled) {
const labelColumns = formatMessage(messages.columns);
items.push(layout({
content: labelColumns,
tooltipDescription: formatMessage(messages.columnsDescription),
disabled: false
}));
}
const blockTypes = availableWrapperBlockTypes || [];
const codeblockData = blockTypes.find(type => type.name === 'codeblock');
const panelData = blockTypes.find(type => type.name === 'panel');
const blockquoteData = blockTypes.find(type => type.name === 'blockquote');
if (codeblockData) {
items.push(codeblock({
content: formatMessage(codeblockData.title),
tooltipDescription: formatMessage(blockTypeMessages.codeblockDescription),
disabled: false,
shortcut: '```'
}));
}
if (panelData) {
items.push(panel({
content: formatMessage(panelData.title),
tooltipDescription: formatMessage(blockTypeMessages.infoPanelDescription),
disabled: false
}));
}
if (blockquoteData) {
items.push(blockquote({
content: formatMessage(blockquoteData.title),
tooltipDescription: formatMessage(blockTypeMessages.blockquoteDescription),
disabled: false,
shortcut: '>'
}));
}
if (decisionSupported) {
items.push(decision({
content: formatMessage(messages.decision),
tooltipDescription: formatMessage(messages.decisionDescription),
disabled: false
}));
}
if (horizontalRuleEnabled && schema.nodes.rule) {
items.push(horizontalrule({
content: formatMessage(messages.horizontalRule),
tooltipDescription: formatMessage(messages.horizontalRuleDescription),
disabled: false
}));
}
if (expandEnabled && schema.nodes.expand) {
items.push(expand({
content: formatMessage(messages.expand),
tooltipDescription: formatMessage(messages.expandDescription),
disabled: false
}));
}
if (dateEnabled) {
const labelDate = formatMessage(messages.date);
items.push(date({
content: labelDate,
tooltipDescription: formatMessage(messages.dateDescription),
disabled: false
}));
}
if (placeholderTextEnabled) {
items.push(placeholder({
content: formatMessage(messages.placeholderText),
disabled: false
}));
}
if (nativeStatusSupported) {
const labelStatus = formatMessage(messages.status);
items.push(status({
content: labelStatus,
tooltipDescription: formatMessage(messages.statusDescription),
disabled: false
}));
}
if (insertMenuItems) {
items.push(...insertMenuItems);
}
let numButtonsAdjusted = numberOfButtons;
if (fg('platform_editor_toolbar_responsive_fixes')) {
if (items.slice(0, numButtonsAdjusted).some(item => item.value.name === 'table selector')) {
numButtonsAdjusted++;
}
} else {
numButtonsAdjusted = tableSupported && tableSelectorSupported ? numberOfButtons + 1 : numberOfButtons;
}
const buttonItems = items.slice(0, numButtonsAdjusted).map(buttonToItem);
const remainingItems = items.slice(numButtonsAdjusted).filter(({
value: {
name
}
}) => name !== 'table selector');
const dropdownItems = remainingItems.map(buttonToDropdownItem(formatMessage(messages.insertMenu)));
return [buttonItems, dropdownItems];
};
export const createItems = memoizeOne(createInsertBlockItems, shallowEquals);