@atlaskit/editor-plugin-caption
Version:
Caption plugin for @atlaskit/editor-core
50 lines (49 loc) • 2.16 kB
JavaScript
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)
}
}
});
});