UNPKG

@atlaskit/editor-plugin-show-diff

Version:

ShowDiff plugin for @atlaskit/editor-core

128 lines • 4.7 kB
import React from 'react'; import { areAttributionColorGatesEnabled, resolveContributors } from './pm-plugins/decorations/colorSchemes/attributions'; import { getDeletedWidgets } from './pm-plugins/getDeletedWidgets'; import { getScrollableDecorations } from './pm-plugins/getScrollableDecorations'; import { createPlugin, showDiffPluginKey } from './pm-plugins/main'; import { resolveDiffContributors } from './pm-plugins/resolveDiffContributors'; import { IndicatorBarContentComponent } from './ui/IndicatorBar/IndicatorBarContentComponent'; const normalizeShowDiffParams = params => { if (!params || !('stepsWithAttribution' in params)) { // Clear contributors to prevent leaking from attributed to unattributed diffs. return params ? { ...params, stepAttributions: [], contributors: undefined } : params; } const { stepsWithAttribution, contributorProfiles, showContributorTags = true, ...rest } = params; return { ...rest, showContributorTags, // Resolve at boundary to keep contributor model and attribution format internal. contributors: areAttributionColorGatesEnabled() ? resolveContributors(resolveDiffContributors(stepsWithAttribution, contributorProfiles)) : undefined, steps: stepsWithAttribution.map(({ step }) => step), stepAttributions: stepsWithAttribution.map(({ stepAttribution }) => stepAttribution) }; }; export const showDiffPlugin = ({ api, config }) => { // Captured from view lifecycle so read-only actions access state without exposing plugin key. let editorView; const setEditorView = view => { editorView = view; }; return { name: 'showDiff', actions: { getDeletedWidgets: range => editorView ? getDeletedWidgets(editorView.state, range) : [] }, commands: { showDiff: params => ({ tr }) => { var _api$userIntent; api === null || api === void 0 ? void 0 : (_api$userIntent = api.userIntent) === null || _api$userIntent === void 0 ? void 0 : _api$userIntent.commands.setCurrentUserIntent('viewingDiff')({ tr }); return tr.setMeta(showDiffPluginKey, { ...normalizeShowDiffParams(params), action: 'SHOW_DIFF' }); }, hideDiff: ({ tr }) => { var _api$userIntent2; api === null || api === void 0 ? void 0 : (_api$userIntent2 = api.userIntent) === null || _api$userIntent2 === void 0 ? void 0 : _api$userIntent2.commands.setCurrentUserIntent('default')({ tr }); return tr.setMeta(showDiffPluginKey, { steps: [], stepAttributions: [], contributors: undefined, action: 'HIDE_DIFF' }); }, scrollToNext: ({ tr }) => { return tr.setMeta(showDiffPluginKey, { action: 'SCROLL_TO_NEXT' }); }, scrollToPrevious: ({ tr }) => { return tr.setMeta(showDiffPluginKey, { action: 'SCROLL_TO_PREVIOUS' }); } }, pmPlugins() { return [{ name: 'showDiffPlugin', // Contributor tags draw themselves into their own decoration widgets — plain DOM, so // no portal provider is needed here. plugin: ({ getIntl }) => createPlugin(config, getIntl, api, setEditorView) }]; }, contentComponent: () => { // Rendered here sharing decoration anchor span DOM context (tags mount separately). return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(IndicatorBarContentComponent, { api: api })); }, getSharedState: editorState => { if (!editorState) { return { isDisplayingChanges: false, activeIndex: undefined, diffDescriptors: [] }; } const pluginState = showDiffPluginKey.getState(editorState); const decorationCount = getScrollableDecorations(pluginState === null || pluginState === void 0 ? void 0 : pluginState.decorations, editorState.doc); return { isDisplayingChanges: decorationCount.length > 0, activeIndex: pluginState === null || pluginState === void 0 ? void 0 : pluginState.activeIndex, numberOfChanges: decorationCount.length, contributorTags: pluginState === null || pluginState === void 0 ? void 0 : pluginState.contributorTags, diffDescriptors: pluginState === null || pluginState === void 0 ? void 0 : pluginState.diffDescriptors, showIndicators: pluginState === null || pluginState === void 0 ? void 0 : pluginState.showIndicators }; } }; };