@atlaskit/editor-plugin-caption
Version:
Caption plugin for @atlaskit/editor-core
50 lines (49 loc) • 2.22 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';
var fireAnalytics = function fireAnalytics(tr, action, analyticsApi) {
analyticsApi === null || analyticsApi === void 0 || analyticsApi.attachAnalyticsEvent({
action: action,
eventType: EVENT_TYPE.TRACK,
actionSubject: ACTION_SUBJECT.MEDIA_SINGLE,
actionSubjectId: ACTION_SUBJECT_ID.CAPTION
})(tr);
};
export default (function (portalProviderAPI, eventDispatcher, providerFactory, dispatch, pluginInjectionApi) {
var _pluginInjectionApi$a;
var analyticsApi = pluginInjectionApi === null || pluginInjectionApi === void 0 || (_pluginInjectionApi$a = pluginInjectionApi.analytics) === null || _pluginInjectionApi$a === void 0 ? void 0 : _pluginInjectionApi$a.actions;
return new SafePlugin({
appendTransaction: function appendTransaction(transactions, oldState, newState) {
// only run for transactions that change selection
if (!transactions.find(function (tr) {
return tr.selectionSet;
})) {
return;
}
var newSelection = !newState.selection.eq(oldState.selection);
var findCaption = findParentNodeOfType(oldState.schema.nodes.caption);
var oldSelectionCaption = findCaption(oldState.selection);
var tr = newState.tr;
// 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)
}
}
});
});