import React from 'react';
import memoizeOne from 'memoize-one';
import DecisionIcon from '@atlaskit/icon/glyph/editor/decision';
import TaskIcon from '@atlaskit/icon/glyph/editor/task';
import TableIcon from '@atlaskit/icon/glyph/editor/table';
import EditorImageIcon from '@atlaskit/icon/glyph/editor/image';
import MentionIcon from '@atlaskit/icon/glyph/editor/mention';
import EditorMoreIcon from '@atlaskit/icon/glyph/editor/more';
import LinkIcon from '@atlaskit/icon/glyph/editor/link';
import EmojiIcon from '@atlaskit/icon/glyph/editor/emoji';
import DateIcon from '@atlaskit/icon/glyph/editor/date';
import StatusIcon from '@atlaskit/icon/glyph/status';
import ExpandNodeIcon from '@atlaskit/icon/glyph/chevron-right-circle';
import PlaceholderTextIcon from '@atlaskit/icon/glyph/media-services/text';
import LayoutTwoEqualIcon from '@atlaskit/icon/glyph/editor/layout-two-equal';
import HorizontalRuleIcon from '@atlaskit/icon/glyph/editor/horizontal-rule';
import CodeIcon from '@atlaskit/icon/glyph/editor/code';
import InfoIcon from '@atlaskit/icon/glyph/editor/info';
import QuoteIcon from '@atlaskit/icon/glyph/quote';
import { Shortcut } from '../../../../ui/styles';
import { MenuItem } from '../../../../ui/DropdownMenu/types';
import { tooltip, addLink, toggleTable } from '../../../../keymaps';
import { shallowEquals } from './shallow-equals';
interface ItemInit {
content: string;
tooltipDescription?: string;
disabled: boolean;
name: string;
shortcut?: string;
Icon: React.ComponentType<{ label: string }>;
}
const from = (init: ItemInit): MenuItem => ({
content: init.content,
tooltipDescription: init.tooltipDescription,
value: { name: init.name },
elemBefore: ,
elemAfter: init.shortcut ? {init.shortcut} : undefined,
shortcut: init.shortcut,
isDisabled: init.disabled,
});
export interface CreateInit {
content: string;
disabled: boolean;
tooltipDescription?: string;
}
const mem = (fn: T): T =>
memoizeOne(fn as any, shallowEquals);
export const action = mem((init: CreateInit) => {
return from({
content: init.content,
tooltipDescription: init.tooltipDescription,
disabled: init.disabled,
name: 'action',
shortcut: '[]',
Icon: TaskIcon,
});
});
export const link = mem((init: CreateInit) =>
from({
content: init.content,
tooltipDescription: init.tooltipDescription,
disabled: init.disabled,
name: 'link',
shortcut: tooltip(addLink),
Icon: LinkIcon,
}),
);
export const media = mem((init: CreateInit) =>
from({
content: init.content,
tooltipDescription: init.tooltipDescription,
disabled: init.disabled,
name: 'media',
Icon: EditorImageIcon,
}),
);
export const imageUpload = mem((init: CreateInit) =>
from({
content: init.content,
tooltipDescription: init.tooltipDescription,
disabled: init.disabled,
name: 'image upload',
Icon: EditorImageIcon,
}),
);
export const mention = mem((init: CreateInit) =>
from({
content: init.content,
tooltipDescription: init.tooltipDescription,
disabled: init.disabled,
name: 'mention',
Icon: MentionIcon,
shortcut: '@',
}),
);
export const emoji = mem((init: CreateInit) =>
from({
content: init.content,
tooltipDescription: init.tooltipDescription,
disabled: init.disabled,
name: 'emoji',
Icon: EmojiIcon,
shortcut: ':',
}),
);
export const table = mem((init: CreateInit) =>
from({
content: init.content,
tooltipDescription: init.tooltipDescription,
disabled: init.disabled,
name: 'table',
Icon: TableIcon,
shortcut: tooltip(toggleTable),
}),
);
export const layout = mem((init: CreateInit) =>
from({
content: init.content,
tooltipDescription: init.tooltipDescription,
disabled: init.disabled,
name: 'layout',
Icon: LayoutTwoEqualIcon,
}),
);
export const codeblock = mem((init: CreateInit & { shortcut?: string }) =>
from({
content: init.content,
tooltipDescription: init.tooltipDescription,
disabled: init.disabled,
name: 'codeblock',
Icon: CodeIcon,
shortcut: init.shortcut,
}),
);
export const panel = mem((init: CreateInit & { shortcut?: string }) =>
from({
content: init.content,
tooltipDescription: init.tooltipDescription,
disabled: init.disabled,
name: 'panel',
Icon: InfoIcon,
shortcut: init.shortcut,
}),
);
export const blockquote = mem((init: CreateInit & { shortcut?: string }) =>
from({
content: init.content,
tooltipDescription: init.tooltipDescription,
disabled: init.disabled,
name: 'blockquote',
Icon: QuoteIcon,
shortcut: init.shortcut,
}),
);
export const decision = mem((init: CreateInit) =>
from({
content: init.content,
tooltipDescription: init.tooltipDescription,
disabled: init.disabled,
name: 'decision',
Icon: DecisionIcon,
shortcut: '<>',
}),
);
export const horizontalrule = mem((init: CreateInit) =>
from({
content: init.content,
tooltipDescription: init.tooltipDescription,
disabled: init.disabled,
name: 'horizontalrule',
Icon: HorizontalRuleIcon,
shortcut: '---',
}),
);
export const expand = mem((init: CreateInit) =>
from({
content: init.content,
tooltipDescription: init.tooltipDescription,
disabled: init.disabled,
name: 'expand',
Icon: ExpandNodeIcon,
}),
);
export const date = mem((init: CreateInit) =>
from({
content: init.content,
tooltipDescription: init.tooltipDescription,
disabled: init.disabled,
name: 'date',
Icon: DateIcon,
shortcut: '//',
}),
);
export const placeholder = mem((init: CreateInit) =>
from({
content: init.content,
tooltipDescription: init.tooltipDescription,
disabled: init.disabled,
name: 'placeholder text',
Icon: () => ,
}),
);
export const status = mem((init: CreateInit) =>
from({
content: init.content,
tooltipDescription: init.tooltipDescription,
disabled: init.disabled,
name: 'status',
Icon: StatusIcon,
}),
);
export const more = mem((init: CreateInit) =>
from({
content: init.content,
tooltipDescription: init.tooltipDescription,
disabled: init.disabled,
name: 'macro',
Icon: () => ,
}),
);