@atlaskit/editor-plugin-user-preferences
Version:
UserPreferences plugin for @atlaskit/editor-core
85 lines • 2.77 kB
JavaScript
import { SafePlugin } from '@atlaskit/editor-common/safe-plugin';
import { PluginKey } from '@atlaskit/editor-prosemirror/state';
import { expValEquals } from '@atlaskit/tmp-editor-statsig/exp-val-equals';
import { editorExperiment } from '@atlaskit/tmp-editor-statsig/experiments';
/**
* Given the current overrides and an override action `{ key, value }`, returns
* the new overrides object:
* - If `value` is `null` or `undefined`, the key is removed from overrides.
* - Otherwise, the key is set to `value` in overrides.
*/
export const applyOverride = (currentOverrides, override) => {
const {
key,
value
} = override;
if (value === null || value === undefined) {
const {
[key]: _,
...rest
} = currentOverrides;
return rest;
}
return {
...currentOverrides,
[key]: value
};
};
export const userPreferencesPluginKey = new PluginKey('userPreferencesPlugin');
export const createPlugin = (pluginOptions, _api) => {
const {
userPreferencesProvider,
initialUserPreferences
} = pluginOptions;
const getInitialUserPreferences = () => {
if (initialUserPreferences && editorExperiment('platform_editor_controls', 'variant1')) {
return initialUserPreferences;
}
return {
toolbarDockingPosition: 'top'
};
};
const isUserPreferenceOverrideEnabled = expValEquals('platform_editor_user_preference_override', 'isEnabled', true);
return new SafePlugin({
key: userPreferencesPluginKey,
state: {
init() {
return {
preferences: (userPreferencesProvider === null || userPreferencesProvider === void 0 ? void 0 : userPreferencesProvider.getPreferences()) || getInitialUserPreferences(),
overrides: {}
};
},
apply: (tr, currentPluginState) => {
const meta = tr.getMeta(userPreferencesPluginKey);
if (isUserPreferenceOverrideEnabled) {
if (!meta || !meta.preferences && !meta.override) {
return currentPluginState;
}
const nextState = {
...currentPluginState
};
if (meta.preferences) {
nextState.preferences = {
...currentPluginState.preferences,
...meta.preferences
};
}
if (meta.override) {
nextState.overrides = applyOverride(currentPluginState.overrides, meta.override);
}
return nextState;
}
if (meta !== null && meta !== void 0 && meta.preferences) {
return {
...currentPluginState,
preferences: {
...currentPluginState.preferences,
...meta.preferences
}
};
}
return currentPluginState;
}
}
});
};