UNPKG

@atlaskit/editor-plugin-caption

Version:

Caption plugin for @atlaskit/editor-core

50 lines (49 loc) 2.16 kB
import { ACTION, ACTION_SUBJECT, ACTION_SUBJECT_ID, EVENT_TYPE } from '@atlaskit/editor-common/analytics'; import { SafePlugin } from '@atlaskit/editor-common/safe-plugin'; import { findParentNodeOfType } from '@atlaskit/editor-prosemirror/utils'; import captionNodeView from '../nodeviews'; import { pluginKey } from './plugin-key'; const fireAnalytics = (tr, action, analyticsApi) => { analyticsApi === null || analyticsApi === void 0 ? void 0 : analyticsApi.attachAnalyticsEvent({ action, eventType: EVENT_TYPE.TRACK, actionSubject: ACTION_SUBJECT.MEDIA_SINGLE, actionSubjectId: ACTION_SUBJECT_ID.CAPTION })(tr); }; export default ((portalProviderAPI, eventDispatcher, providerFactory, dispatch, pluginInjectionApi) => { var _pluginInjectionApi$a; const analyticsApi = pluginInjectionApi === null || pluginInjectionApi === void 0 ? void 0 : (_pluginInjectionApi$a = pluginInjectionApi.analytics) === null || _pluginInjectionApi$a === void 0 ? void 0 : _pluginInjectionApi$a.actions; return new SafePlugin({ appendTransaction(transactions, oldState, newState) { // only run for transactions that change selection if (!transactions.find(tr => tr.selectionSet)) { return; } const newSelection = !newState.selection.eq(oldState.selection); const findCaption = findParentNodeOfType(oldState.schema.nodes.caption); const oldSelectionCaption = findCaption(oldState.selection); const { tr } = newState; // if selecting away from caption, or selecting a different caption if (newSelection && oldSelectionCaption) { if (oldSelectionCaption.node.childCount === 0) { tr.delete(oldSelectionCaption.start - 1, oldSelectionCaption.start); tr.setMeta('scrollIntoView', false); fireAnalytics(tr, ACTION.DELETED, analyticsApi); return tr; } else { fireAnalytics(tr, ACTION.EDITED, analyticsApi); return tr; } } }, key: pluginKey, props: { nodeViews: { caption: captionNodeView(portalProviderAPI, eventDispatcher, pluginInjectionApi) } } }); });