import React from 'react'; import { panel, customPanel, PanelType } from '@atlaskit/adf-schema'; import { QuickInsertActionInsert } from '@atlaskit/editor-common/provider-factory'; import { EditorState } from 'prosemirror-state'; import { EditorPlugin } from '../../types'; import { createPlugin } from './pm-plugins/main'; import { getToolbarConfig } from './toolbar'; import keymap from './pm-plugins/keymaps'; import { addAnalytics, ACTION, ACTION_SUBJECT, ACTION_SUBJECT_ID, INPUT_METHOD, EVENT_TYPE, } from '../analytics'; import { IconPanel, IconPanelNote, IconPanelSuccess, IconPanelWarning, IconPanelError, } from '../quick-insert/assets'; import { messages } from '../block-type/messages'; import { PanelPluginOptions } from './types'; const insertPanelTypeWithAnalytics = ( panelType: PanelType, state: EditorState, insert: QuickInsertActionInsert, ) => { const tr = insert(insertPanelType(panelType, state)); if (tr) { addAnalytics(state, tr, { action: ACTION.INSERTED, actionSubject: ACTION_SUBJECT.DOCUMENT, actionSubjectId: ACTION_SUBJECT_ID.PANEL, attributes: { inputMethod: INPUT_METHOD.QUICK_INSERT, panelType, }, eventType: EVENT_TYPE.TRACK, }); } return tr; }; const insertPanelType = (panelType: PanelType, state: EditorState) => state.schema.nodes.panel.createChecked( { panelType }, state.schema.nodes.paragraph.createChecked(), ); const panelPlugin = (options: PanelPluginOptions = {}): EditorPlugin => ({ name: 'panel', nodes() { //TODO: ED-10445 remove this check after emoji panels moved to full schema const panelNode = options.UNSAFE_allowCustomPanel ? customPanel : panel; return [{ name: 'panel', node: panelNode }]; }, pmPlugins() { return [ { name: 'panel', plugin: ({ providerFactory, dispatch }) => createPlugin(dispatch, providerFactory, options), }, { name: 'panelKeyMap', plugin: () => keymap(), }, ]; }, pluginsOptions: { quickInsert: ({ formatMessage }) => [ { id: 'infopanel', title: formatMessage(messages.infoPanel), keywords: ['panel'], description: formatMessage(messages.infoPanelDescription), priority: 800, icon: () => , action(insert, state) { return insertPanelTypeWithAnalytics(PanelType.INFO, state, insert); }, }, { id: 'notepanel', title: formatMessage(messages.notePanel), description: formatMessage(messages.notePanelDescription), priority: 1000, icon: () => , action(insert, state) { return insertPanelTypeWithAnalytics(PanelType.NOTE, state, insert); }, }, { id: 'successpanel', title: formatMessage(messages.successPanel), description: formatMessage(messages.successPanelDescription), keywords: ['tip'], priority: 1000, icon: () => , action(insert, state) { return insertPanelTypeWithAnalytics(PanelType.SUCCESS, state, insert); }, }, { id: 'warningpanel', title: formatMessage(messages.warningPanel), description: formatMessage(messages.warningPanelDescription), priority: 1000, icon: () => , action(insert, state) { return insertPanelTypeWithAnalytics(PanelType.WARNING, state, insert); }, }, { id: 'errorpanel', title: formatMessage(messages.errorPanel), description: formatMessage(messages.errorPanelDescription), priority: 1000, icon: () => , action(insert, state) { return insertPanelTypeWithAnalytics(PanelType.ERROR, state, insert); }, }, ], floatingToolbar: (state, intl, providerFactory) => getToolbarConfig(state, intl, options, providerFactory), }, }); export default panelPlugin;