@atlaskit/editor-core 189.6.0 → 189.6.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -7,7 +7,6 @@ import { ACTION, fireAnalyticsEvent } from '@atlaskit/editor-common/analytics';
7
7
  import { EditorExperience, ExperienceStore } from '@atlaskit/editor-common/ufo';
8
8
  import { getAnalyticsAppearance, startMeasure, stopMeasure } from '@atlaskit/editor-common/utils';
9
9
  import { basePlugin } from '@atlaskit/editor-plugin-base';
10
- import { getBooleanFF } from '@atlaskit/platform-feature-flags';
11
10
  import EditorActions from '../actions';
12
11
  import { createFeatureFlagsFromProps } from '../create-editor/feature-flags-from-props';
13
12
  import { name, version } from '../version-wrapper';
@@ -20,187 +19,17 @@ import sendDurationAnalytics from './utils/sendDurationAnalytics';
20
19
  import trackEditorActions from './utils/trackEditorActions';
21
20
  import useMeasureEditorMountTime from './hooks/useMeasureEditorMountTime';
22
21
  import useProviderFactory from './hooks/useProviderFactory';
22
+ import useMemoEditorProps from './hooks/useMemoEditorProps';
23
23
 
24
24
  /**
25
25
  * Editor wrapper that deals with the lifecycle logic of the editor
26
26
  */
27
27
  function Editor(passedProps) {
28
- var _editorContext$editor;
29
- const defaultProps = {
30
- appearance: 'comment',
31
- disabled: false,
32
- quickInsert: true
33
- };
34
- const props = {
35
- ...defaultProps,
36
- ...passedProps
37
- };
38
- const editorContext = useEditorContext();
39
- const editorActions = useRef((_editorContext$editor = editorContext === null || editorContext === void 0 ? void 0 : editorContext.editorActions) !== null && _editorContext$editor !== void 0 ? _editorContext$editor : new EditorActions());
40
- const startTime = useRef(performance.now());
41
- const {
42
- createAnalyticsEvent
43
- } = useAnalyticsEvents();
44
- const experienceStore = useRef();
45
- const handleAnalyticsEvent = data => fireAnalyticsEvent(createAnalyticsEvent)(data);
46
- useConstructor(() => {
47
- trackEditorActions(editorActions.current, props.performanceTracking, value => handleAnalyticsEvent(value));
48
- });
49
- const getExperienceStore = () => experienceStore.current;
50
- const onEditorCreated = instance => {
51
- var _props$featureFlags;
52
- editorActions.current._privateRegisterEditor(instance.view, instance.eventDispatcher, instance.transformer, () => createFeatureFlagsFromProps(props));
53
- if ((_props$featureFlags = props.featureFlags) !== null && _props$featureFlags !== void 0 && _props$featureFlags.ufo) {
54
- var _experienceStore$curr;
55
- experienceStore.current = ExperienceStore.getInstance(instance.view);
56
- (_experienceStore$curr = experienceStore.current) === null || _experienceStore$curr === void 0 ? void 0 : _experienceStore$curr.start(EditorExperience.loadEditor, startTime.current);
57
- }
58
- if (props.onEditorReady) {
59
- var _props$performanceTra, _props$performanceTra2, _props$featureFlags2;
60
- const measureEditorReady = (props === null || props === void 0 ? void 0 : (_props$performanceTra = props.performanceTracking) === null || _props$performanceTra === void 0 ? void 0 : (_props$performanceTra2 = _props$performanceTra.onEditorReadyCallbackTracking) === null || _props$performanceTra2 === void 0 ? void 0 : _props$performanceTra2.enabled) || ((_props$featureFlags2 = props.featureFlags) === null || _props$featureFlags2 === void 0 ? void 0 : _props$featureFlags2.ufo);
61
- measureEditorReady && startMeasure(measurements.ON_EDITOR_READY_CALLBACK);
62
- props.onEditorReady(editorActions.current);
63
- measureEditorReady && stopMeasure(measurements.ON_EDITOR_READY_CALLBACK, sendDurationAnalytics(ACTION.ON_EDITOR_READY_CALLBACK, props, getExperienceStore, createAnalyticsEvent));
64
- }
65
- };
66
- const onEditorDestroyed = _instance => {
67
- var _props$onDestroy;
68
- editorActions.current._privateUnregisterEditor();
69
- (_props$onDestroy = props.onDestroy) === null || _props$onDestroy === void 0 ? void 0 : _props$onDestroy.call(props);
70
- };
71
- useMeasureEditorMountTime(props, getExperienceStore, createAnalyticsEvent);
72
- const providerFactory = useProviderFactory(props, editorActions.current, createAnalyticsEvent);
73
- return jsx(EditorInternal, {
74
- props: props,
75
- handleAnalyticsEvent: handleAnalyticsEvent,
76
- createAnalyticsEvent: createAnalyticsEvent,
77
- preset: props.preset,
78
- handleSave: view => {
79
- var _props$onSave;
80
- return (_props$onSave = props.onSave) === null || _props$onSave === void 0 ? void 0 : _props$onSave.call(props, view);
81
- },
82
- editorActions: editorActions.current,
83
- onEditorCreated: onEditorCreated,
84
- onEditorDestroyed: onEditorDestroyed,
85
- providerFactory: providerFactory
86
- });
87
- }
88
- /**
89
- * Improved memonization for Editor wrapper that deals with the lifecycle logic of the editor
90
- */
91
- function EditorButBetter(passedProps) {
92
28
  const propsRef = useRef(passedProps);
93
- const props = useMemo(() => {
94
- // That sounds awful but this is the only way to make sure we didn't missed any EditorProps
95
- const allProps = {
96
- preset: passedProps.preset,
97
- appearance: passedProps.appearance,
98
- contentComponents: passedProps.contentComponents,
99
- primaryToolbarIconBefore: passedProps.primaryToolbarIconBefore,
100
- secondaryToolbarComponents: passedProps.secondaryToolbarComponents,
101
- persistScrollGutter: passedProps.persistScrollGutter,
102
- quickInsert: passedProps.quickInsert,
103
- shouldFocus: passedProps.shouldFocus,
104
- disabled: passedProps.disabled,
105
- contextPanel: passedProps.contextPanel,
106
- errorReporterHandler: passedProps.errorReporterHandler,
107
- contentTransformerProvider: passedProps.contentTransformerProvider,
108
- maxHeight: passedProps.maxHeight,
109
- minHeight: passedProps.minHeight,
110
- placeholder: passedProps.placeholder,
111
- placeholderBracketHint: passedProps.placeholderBracketHint,
112
- defaultValue: passedProps.defaultValue,
113
- assistiveLabel: passedProps.assistiveLabel,
114
- popupsMountPoint: passedProps.popupsMountPoint,
115
- popupsBoundariesElement: passedProps.popupsBoundariesElement,
116
- popupsScrollableElement: passedProps.popupsScrollableElement,
117
- editorActions: passedProps.editorActions,
118
- onEditorReady: passedProps.onEditorReady,
119
- onDestroy: passedProps.onDestroy,
120
- onChange: passedProps.onChange,
121
- onCancel: passedProps.onCancel,
122
- inputSamplingLimit: passedProps.inputSamplingLimit,
123
- extensionProviders: passedProps.extensionProviders,
124
- UNSAFE_useAnalyticsContext: passedProps.UNSAFE_useAnalyticsContext,
125
- trackValidTransactions: passedProps.trackValidTransactions,
126
- useStickyToolbar: passedProps.useStickyToolbar,
127
- featureFlags: passedProps.featureFlags,
128
- onSave: passedProps.onSave,
129
- performanceTracking: passedProps.performanceTracking,
130
- sanitizePrivateContent: passedProps.sanitizePrivateContent,
131
- media: passedProps.media,
132
- collabEdit: passedProps.collabEdit,
133
- primaryToolbarComponents: passedProps.primaryToolbarComponents,
134
- allowUndoRedoButtons: passedProps.allowUndoRedoButtons,
135
- linking: passedProps.linking,
136
- hideAvatarGroup: passedProps.hideAvatarGroup,
137
- activityProvider: passedProps.activityProvider,
138
- searchProvider: passedProps.searchProvider,
139
- annotationProviders: passedProps.annotationProviders,
140
- collabEditProvider: passedProps.collabEditProvider,
141
- presenceProvider: passedProps.presenceProvider,
142
- emojiProvider: passedProps.emojiProvider,
143
- taskDecisionProvider: passedProps.taskDecisionProvider,
144
- legacyImageUploadProvider: passedProps.legacyImageUploadProvider,
145
- mentionProvider: passedProps.mentionProvider,
146
- autoformattingProvider: passedProps.autoformattingProvider,
147
- macroProvider: passedProps.macroProvider,
148
- contextIdentifierProvider: passedProps.contextIdentifierProvider,
149
- allowExpand: passedProps.allowExpand,
150
- allowNestedTasks: passedProps.allowNestedTasks,
151
- allowBlockType: passedProps.allowBlockType,
152
- allowTasksAndDecisions: passedProps.allowTasksAndDecisions,
153
- allowBreakout: passedProps.allowBreakout,
154
- allowRule: passedProps.allowRule,
155
- allowHelpDialog: passedProps.allowHelpDialog,
156
- allowJiraIssue: passedProps.allowJiraIssue,
157
- allowPanel: passedProps.allowPanel,
158
- allowExtension: passedProps.allowExtension,
159
- allowConfluenceInlineComment: passedProps.allowConfluenceInlineComment,
160
- allowTemplatePlaceholders: passedProps.allowTemplatePlaceholders,
161
- allowDate: passedProps.allowDate,
162
- allowLayouts: passedProps.allowLayouts,
163
- allowStatus: passedProps.allowStatus,
164
- allowTextAlignment: passedProps.allowTextAlignment,
165
- allowIndentation: passedProps.allowIndentation,
166
- showIndentationButtons: passedProps.showIndentationButtons,
167
- allowNewInsertionBehaviour: passedProps.allowNewInsertionBehaviour,
168
- allowFindReplace: passedProps.allowFindReplace,
169
- UNSAFE_allowBorderMark: passedProps.UNSAFE_allowBorderMark,
170
- allowBorderMark: passedProps.allowBorderMark,
171
- allowFragmentMark: passedProps.allowFragmentMark,
172
- autoScrollIntoView: passedProps.autoScrollIntoView,
173
- elementBrowser: passedProps.elementBrowser,
174
- maxContentSize: passedProps.maxContentSize,
175
- saveOnEnter: passedProps.saveOnEnter,
176
- feedbackInfo: passedProps.feedbackInfo,
177
- mention: passedProps.mention,
178
- mentionInsertDisplayName: passedProps.mentionInsertDisplayName,
179
- uploadErrorHandler: passedProps.uploadErrorHandler,
180
- waitForMediaUpload: passedProps.waitForMediaUpload,
181
- extensionHandlers: passedProps.extensionHandlers,
182
- allowTextColor: passedProps.allowTextColor,
183
- allowTables: passedProps.allowTables,
184
- insertMenuItems: passedProps.insertMenuItems,
185
- UNSAFE_cards: passedProps.UNSAFE_cards,
186
- smartLinks: passedProps.smartLinks,
187
- allowAnalyticsGASV3: passedProps.allowAnalyticsGASV3,
188
- codeBlock: passedProps.codeBlock,
189
- textFormatting: passedProps.textFormatting,
190
- dangerouslyAppendPlugins: passedProps.dangerouslyAppendPlugins
191
- };
192
- const defaultProps = {
193
- appearance: 'comment',
194
- disabled: false,
195
- quickInsert: true
196
- };
197
- const nextProps = {
198
- ...defaultProps,
199
- ...allProps
200
- };
201
- propsRef.current = nextProps;
202
- return nextProps;
203
- }, [passedProps.preset, passedProps.appearance, passedProps.contentComponents, passedProps.primaryToolbarIconBefore, passedProps.secondaryToolbarComponents, passedProps.persistScrollGutter, passedProps.quickInsert, passedProps.shouldFocus, passedProps.disabled, passedProps.contextPanel, passedProps.errorReporterHandler, passedProps.contentTransformerProvider, passedProps.maxHeight, passedProps.minHeight, passedProps.placeholder, passedProps.placeholderBracketHint, passedProps.defaultValue, passedProps.assistiveLabel, passedProps.popupsMountPoint, passedProps.popupsBoundariesElement, passedProps.popupsScrollableElement, passedProps.editorActions, passedProps.onEditorReady, passedProps.onDestroy, passedProps.onChange, passedProps.onCancel, passedProps.inputSamplingLimit, passedProps.extensionProviders, passedProps.UNSAFE_useAnalyticsContext, passedProps.trackValidTransactions, passedProps.useStickyToolbar, passedProps.featureFlags, passedProps.onSave, passedProps.performanceTracking, passedProps.sanitizePrivateContent, passedProps.media, passedProps.collabEdit, passedProps.primaryToolbarComponents, passedProps.allowUndoRedoButtons, passedProps.linking, passedProps.hideAvatarGroup, passedProps.activityProvider, passedProps.searchProvider, passedProps.annotationProviders, passedProps.collabEditProvider, passedProps.presenceProvider, passedProps.emojiProvider, passedProps.taskDecisionProvider, passedProps.legacyImageUploadProvider, passedProps.mentionProvider, passedProps.autoformattingProvider, passedProps.macroProvider, passedProps.contextIdentifierProvider, passedProps.allowExpand, passedProps.allowNestedTasks, passedProps.allowBlockType, passedProps.allowTasksAndDecisions, passedProps.allowBreakout, passedProps.allowRule, passedProps.allowHelpDialog, passedProps.allowJiraIssue, passedProps.allowPanel, passedProps.allowExtension, passedProps.allowConfluenceInlineComment, passedProps.allowTemplatePlaceholders, passedProps.allowDate, passedProps.allowLayouts, passedProps.allowStatus, passedProps.allowTextAlignment, passedProps.allowIndentation, passedProps.showIndentationButtons, passedProps.allowNewInsertionBehaviour, passedProps.allowFindReplace, passedProps.UNSAFE_allowBorderMark, passedProps.allowBorderMark, passedProps.allowFragmentMark, passedProps.autoScrollIntoView, passedProps.elementBrowser, passedProps.maxContentSize, passedProps.saveOnEnter, passedProps.feedbackInfo, passedProps.mention, passedProps.mentionInsertDisplayName, passedProps.uploadErrorHandler, passedProps.waitForMediaUpload, passedProps.extensionHandlers, passedProps.allowTextColor, passedProps.allowTables, passedProps.insertMenuItems, passedProps.UNSAFE_cards, passedProps.smartLinks, passedProps.allowAnalyticsGASV3, passedProps.codeBlock, passedProps.textFormatting, passedProps.dangerouslyAppendPlugins]);
29
+ const props = useMemoEditorProps(passedProps);
30
+ useMemo(() => {
31
+ propsRef.current = props;
32
+ }, [props]);
204
33
  const editorContext = useEditorContext();
205
34
  const editorActionsPlaceholderInstance = useMemo(() => new EditorActions(), []);
206
35
  const editorActions = editorContext.editorActions || editorActionsPlaceholderInstance;
@@ -230,9 +59,9 @@ function EditorButBetter(passedProps) {
230
59
  } = propsRef.current;
231
60
  editorActions._privateRegisterEditor(instance.view, instance.eventDispatcher, instance.transformer, getFeatureFlagsFromRef);
232
61
  if (featureFlags !== null && featureFlags !== void 0 && featureFlags.ufo) {
233
- var _experienceStore$curr2;
62
+ var _experienceStore$curr;
234
63
  experienceStore.current = ExperienceStore.getInstance(instance.view);
235
- (_experienceStore$curr2 = experienceStore.current) === null || _experienceStore$curr2 === void 0 ? void 0 : _experienceStore$curr2.start(EditorExperience.loadEditor, startTime.current);
64
+ (_experienceStore$curr = experienceStore.current) === null || _experienceStore$curr === void 0 ? void 0 : _experienceStore$curr.start(EditorExperience.loadEditor, startTime.current);
236
65
  }
237
66
  if (onEditorReady) {
238
67
  var _performanceTracking$;
@@ -287,13 +116,6 @@ export function ComposableEditor(props) {
287
116
  editorSessionId: editorSessionId.current
288
117
  };
289
118
  }, [props.appearance]);
290
- if (getBooleanFF('platform.editor.less-editor-props-rerendering')) {
291
- return jsx(FabricEditorAnalyticsContext
292
- // @ts-expect-error Type 'string' is not assignable to type '"editorCore" | "renderer"'.
293
- , {
294
- data: data
295
- }, jsx(EditorButBetter, props));
296
- }
297
119
  return jsx(FabricEditorAnalyticsContext
298
120
  // @ts-expect-error Type 'string' is not assignable to type '"editorCore" | "renderer"'.
299
121
  , {
@@ -0,0 +1,115 @@
1
+ import { useMemo } from 'react';
2
+ export const useMemoEditorProps = passedProps => {
3
+ const memodProps = useMemo(() => {
4
+ // That sounds awful but this is the only way to make sure we didn't missed any EditorProps
5
+ const allProps = {
6
+ preset: passedProps.preset,
7
+ appearance: passedProps.appearance,
8
+ contentComponents: passedProps.contentComponents,
9
+ primaryToolbarIconBefore: passedProps.primaryToolbarIconBefore,
10
+ secondaryToolbarComponents: passedProps.secondaryToolbarComponents,
11
+ persistScrollGutter: passedProps.persistScrollGutter,
12
+ quickInsert: passedProps.quickInsert,
13
+ shouldFocus: passedProps.shouldFocus,
14
+ disabled: passedProps.disabled,
15
+ contextPanel: passedProps.contextPanel,
16
+ errorReporterHandler: passedProps.errorReporterHandler,
17
+ contentTransformerProvider: passedProps.contentTransformerProvider,
18
+ maxHeight: passedProps.maxHeight,
19
+ minHeight: passedProps.minHeight,
20
+ placeholder: passedProps.placeholder,
21
+ placeholderBracketHint: passedProps.placeholderBracketHint,
22
+ defaultValue: passedProps.defaultValue,
23
+ assistiveLabel: passedProps.assistiveLabel,
24
+ popupsMountPoint: passedProps.popupsMountPoint,
25
+ popupsBoundariesElement: passedProps.popupsBoundariesElement,
26
+ popupsScrollableElement: passedProps.popupsScrollableElement,
27
+ editorActions: passedProps.editorActions,
28
+ onEditorReady: passedProps.onEditorReady,
29
+ onDestroy: passedProps.onDestroy,
30
+ onChange: passedProps.onChange,
31
+ onCancel: passedProps.onCancel,
32
+ inputSamplingLimit: passedProps.inputSamplingLimit,
33
+ extensionProviders: passedProps.extensionProviders,
34
+ UNSAFE_useAnalyticsContext: passedProps.UNSAFE_useAnalyticsContext,
35
+ trackValidTransactions: passedProps.trackValidTransactions,
36
+ useStickyToolbar: passedProps.useStickyToolbar,
37
+ featureFlags: passedProps.featureFlags,
38
+ onSave: passedProps.onSave,
39
+ performanceTracking: passedProps.performanceTracking,
40
+ sanitizePrivateContent: passedProps.sanitizePrivateContent,
41
+ media: passedProps.media,
42
+ collabEdit: passedProps.collabEdit,
43
+ primaryToolbarComponents: passedProps.primaryToolbarComponents,
44
+ allowUndoRedoButtons: passedProps.allowUndoRedoButtons,
45
+ linking: passedProps.linking,
46
+ hideAvatarGroup: passedProps.hideAvatarGroup,
47
+ activityProvider: passedProps.activityProvider,
48
+ searchProvider: passedProps.searchProvider,
49
+ annotationProviders: passedProps.annotationProviders,
50
+ collabEditProvider: passedProps.collabEditProvider,
51
+ presenceProvider: passedProps.presenceProvider,
52
+ emojiProvider: passedProps.emojiProvider,
53
+ taskDecisionProvider: passedProps.taskDecisionProvider,
54
+ legacyImageUploadProvider: passedProps.legacyImageUploadProvider,
55
+ mentionProvider: passedProps.mentionProvider,
56
+ autoformattingProvider: passedProps.autoformattingProvider,
57
+ macroProvider: passedProps.macroProvider,
58
+ contextIdentifierProvider: passedProps.contextIdentifierProvider,
59
+ allowExpand: passedProps.allowExpand,
60
+ allowNestedTasks: passedProps.allowNestedTasks,
61
+ allowBlockType: passedProps.allowBlockType,
62
+ allowTasksAndDecisions: passedProps.allowTasksAndDecisions,
63
+ allowBreakout: passedProps.allowBreakout,
64
+ allowRule: passedProps.allowRule,
65
+ allowHelpDialog: passedProps.allowHelpDialog,
66
+ allowJiraIssue: passedProps.allowJiraIssue,
67
+ allowPanel: passedProps.allowPanel,
68
+ allowExtension: passedProps.allowExtension,
69
+ allowConfluenceInlineComment: passedProps.allowConfluenceInlineComment,
70
+ allowTemplatePlaceholders: passedProps.allowTemplatePlaceholders,
71
+ allowDate: passedProps.allowDate,
72
+ allowLayouts: passedProps.allowLayouts,
73
+ allowStatus: passedProps.allowStatus,
74
+ allowTextAlignment: passedProps.allowTextAlignment,
75
+ allowIndentation: passedProps.allowIndentation,
76
+ showIndentationButtons: passedProps.showIndentationButtons,
77
+ allowNewInsertionBehaviour: passedProps.allowNewInsertionBehaviour,
78
+ allowFindReplace: passedProps.allowFindReplace,
79
+ UNSAFE_allowBorderMark: passedProps.UNSAFE_allowBorderMark,
80
+ allowBorderMark: passedProps.allowBorderMark,
81
+ allowFragmentMark: passedProps.allowFragmentMark,
82
+ autoScrollIntoView: passedProps.autoScrollIntoView,
83
+ elementBrowser: passedProps.elementBrowser,
84
+ maxContentSize: passedProps.maxContentSize,
85
+ saveOnEnter: passedProps.saveOnEnter,
86
+ feedbackInfo: passedProps.feedbackInfo,
87
+ mention: passedProps.mention,
88
+ mentionInsertDisplayName: passedProps.mentionInsertDisplayName,
89
+ uploadErrorHandler: passedProps.uploadErrorHandler,
90
+ waitForMediaUpload: passedProps.waitForMediaUpload,
91
+ extensionHandlers: passedProps.extensionHandlers,
92
+ allowTextColor: passedProps.allowTextColor,
93
+ allowTables: passedProps.allowTables,
94
+ insertMenuItems: passedProps.insertMenuItems,
95
+ UNSAFE_cards: passedProps.UNSAFE_cards,
96
+ smartLinks: passedProps.smartLinks,
97
+ allowAnalyticsGASV3: passedProps.allowAnalyticsGASV3,
98
+ codeBlock: passedProps.codeBlock,
99
+ textFormatting: passedProps.textFormatting,
100
+ dangerouslyAppendPlugins: passedProps.dangerouslyAppendPlugins
101
+ };
102
+ const defaultProps = {
103
+ appearance: 'comment',
104
+ disabled: false,
105
+ quickInsert: true
106
+ };
107
+ const nextProps = {
108
+ ...defaultProps,
109
+ ...allProps
110
+ };
111
+ return nextProps;
112
+ }, [passedProps.preset, passedProps.appearance, passedProps.contentComponents, passedProps.primaryToolbarIconBefore, passedProps.secondaryToolbarComponents, passedProps.persistScrollGutter, passedProps.quickInsert, passedProps.shouldFocus, passedProps.disabled, passedProps.contextPanel, passedProps.errorReporterHandler, passedProps.contentTransformerProvider, passedProps.maxHeight, passedProps.minHeight, passedProps.placeholder, passedProps.placeholderBracketHint, passedProps.defaultValue, passedProps.assistiveLabel, passedProps.popupsMountPoint, passedProps.popupsBoundariesElement, passedProps.popupsScrollableElement, passedProps.editorActions, passedProps.onEditorReady, passedProps.onDestroy, passedProps.onChange, passedProps.onCancel, passedProps.inputSamplingLimit, passedProps.extensionProviders, passedProps.UNSAFE_useAnalyticsContext, passedProps.trackValidTransactions, passedProps.useStickyToolbar, passedProps.featureFlags, passedProps.onSave, passedProps.performanceTracking, passedProps.sanitizePrivateContent, passedProps.media, passedProps.collabEdit, passedProps.primaryToolbarComponents, passedProps.allowUndoRedoButtons, passedProps.linking, passedProps.hideAvatarGroup, passedProps.activityProvider, passedProps.searchProvider, passedProps.annotationProviders, passedProps.collabEditProvider, passedProps.presenceProvider, passedProps.emojiProvider, passedProps.taskDecisionProvider, passedProps.legacyImageUploadProvider, passedProps.mentionProvider, passedProps.autoformattingProvider, passedProps.macroProvider, passedProps.contextIdentifierProvider, passedProps.allowExpand, passedProps.allowNestedTasks, passedProps.allowBlockType, passedProps.allowTasksAndDecisions, passedProps.allowBreakout, passedProps.allowRule, passedProps.allowHelpDialog, passedProps.allowJiraIssue, passedProps.allowPanel, passedProps.allowExtension, passedProps.allowConfluenceInlineComment, passedProps.allowTemplatePlaceholders, passedProps.allowDate, passedProps.allowLayouts, passedProps.allowStatus, passedProps.allowTextAlignment, passedProps.allowIndentation, passedProps.showIndentationButtons, passedProps.allowNewInsertionBehaviour, passedProps.allowFindReplace, passedProps.UNSAFE_allowBorderMark, passedProps.allowBorderMark, passedProps.allowFragmentMark, passedProps.autoScrollIntoView, passedProps.elementBrowser, passedProps.maxContentSize, passedProps.saveOnEnter, passedProps.feedbackInfo, passedProps.mention, passedProps.mentionInsertDisplayName, passedProps.uploadErrorHandler, passedProps.waitForMediaUpload, passedProps.extensionHandlers, passedProps.allowTextColor, passedProps.allowTables, passedProps.insertMenuItems, passedProps.UNSAFE_cards, passedProps.smartLinks, passedProps.allowAnalyticsGASV3, passedProps.codeBlock, passedProps.textFormatting, passedProps.dangerouslyAppendPlugins]);
113
+ return memodProps;
114
+ };
115
+ export default useMemoEditorProps;
@@ -51,7 +51,7 @@ const Content = /*#__PURE__*/React.forwardRef((props, ref) => {
51
51
  css: editorContentGutterStyle,
52
52
  className: ['ak-editor-content-area', fullWidthMode ? 'fabric-editor--full-width-mode' : ''].join(' '),
53
53
  ref: contentAreaRef
54
- }, props.customContentComponents, jsx(PluginSlot, {
54
+ }, !!props.customContentComponents && 'before' in props.customContentComponents ? props.customContentComponents.before : props.customContentComponents, jsx(PluginSlot, {
55
55
  editorView: props.editorView,
56
56
  editorActions: props.editorActions,
57
57
  eventDispatcher: props.eventDispatcher,
@@ -67,7 +67,7 @@ const Content = /*#__PURE__*/React.forwardRef((props, ref) => {
67
67
  containerElement: scrollContainerRef.current,
68
68
  dispatchAnalyticsEvent: props.dispatchAnalyticsEvent,
69
69
  wrapperElement: props.wrapperElement
70
- }), props.editorDOMElement)))), jsx("div", {
70
+ }), props.editorDOMElement, !!props.customContentComponents && 'after' in props.customContentComponents ? props.customContentComponents.after : null)))), jsx("div", {
71
71
  css: sidebarArea
72
72
  }, props.contextPanel || jsx(ContextPanel, {
73
73
  visible: false
@@ -1,2 +1,2 @@
1
1
  export const name = "@atlaskit/editor-core";
2
- export const version = "189.6.0";
2
+ export const version = "189.6.2";
@@ -1,6 +1,3 @@
1
- import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
- function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
3
- function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
4
1
  /** @jsx jsx */
5
2
  import { useRef, useCallback, useMemo } from 'react';
6
3
  import { jsx } from '@emotion/react';
@@ -10,7 +7,6 @@ import { ACTION, fireAnalyticsEvent } from '@atlaskit/editor-common/analytics';
10
7
  import { EditorExperience, ExperienceStore } from '@atlaskit/editor-common/ufo';
11
8
  import { getAnalyticsAppearance, startMeasure, stopMeasure } from '@atlaskit/editor-common/utils';
12
9
  import { basePlugin } from '@atlaskit/editor-plugin-base';
13
- import { getBooleanFF } from '@atlaskit/platform-feature-flags';
14
10
  import EditorActions from '../actions';
15
11
  import { createFeatureFlagsFromProps } from '../create-editor/feature-flags-from-props';
16
12
  import { name, version } from '../version-wrapper';
@@ -23,196 +19,25 @@ import sendDurationAnalytics from './utils/sendDurationAnalytics';
23
19
  import trackEditorActions from './utils/trackEditorActions';
24
20
  import useMeasureEditorMountTime from './hooks/useMeasureEditorMountTime';
25
21
  import useProviderFactory from './hooks/useProviderFactory';
22
+ import useMemoEditorProps from './hooks/useMemoEditorProps';
26
23
 
27
24
  /**
28
25
  * Editor wrapper that deals with the lifecycle logic of the editor
29
26
  */
30
27
  function Editor(passedProps) {
31
- var _editorContext$editor;
32
- var defaultProps = {
33
- appearance: 'comment',
34
- disabled: false,
35
- quickInsert: true
36
- };
37
- var props = _objectSpread(_objectSpread({}, defaultProps), passedProps);
38
- var editorContext = useEditorContext();
39
- var editorActions = useRef((_editorContext$editor = editorContext === null || editorContext === void 0 ? void 0 : editorContext.editorActions) !== null && _editorContext$editor !== void 0 ? _editorContext$editor : new EditorActions());
40
- var startTime = useRef(performance.now());
41
- var _useAnalyticsEvents = useAnalyticsEvents(),
42
- createAnalyticsEvent = _useAnalyticsEvents.createAnalyticsEvent;
43
- var experienceStore = useRef();
44
- var handleAnalyticsEvent = function handleAnalyticsEvent(data) {
45
- return fireAnalyticsEvent(createAnalyticsEvent)(data);
46
- };
47
- useConstructor(function () {
48
- trackEditorActions(editorActions.current, props.performanceTracking, function (value) {
49
- return handleAnalyticsEvent(value);
50
- });
51
- });
52
- var getExperienceStore = function getExperienceStore() {
53
- return experienceStore.current;
54
- };
55
- var onEditorCreated = function onEditorCreated(instance) {
56
- var _props$featureFlags;
57
- editorActions.current._privateRegisterEditor(instance.view, instance.eventDispatcher, instance.transformer, function () {
58
- return createFeatureFlagsFromProps(props);
59
- });
60
- if ((_props$featureFlags = props.featureFlags) !== null && _props$featureFlags !== void 0 && _props$featureFlags.ufo) {
61
- var _experienceStore$curr;
62
- experienceStore.current = ExperienceStore.getInstance(instance.view);
63
- (_experienceStore$curr = experienceStore.current) === null || _experienceStore$curr === void 0 || _experienceStore$curr.start(EditorExperience.loadEditor, startTime.current);
64
- }
65
- if (props.onEditorReady) {
66
- var _props$performanceTra, _props$featureFlags2;
67
- var measureEditorReady = (props === null || props === void 0 || (_props$performanceTra = props.performanceTracking) === null || _props$performanceTra === void 0 || (_props$performanceTra = _props$performanceTra.onEditorReadyCallbackTracking) === null || _props$performanceTra === void 0 ? void 0 : _props$performanceTra.enabled) || ((_props$featureFlags2 = props.featureFlags) === null || _props$featureFlags2 === void 0 ? void 0 : _props$featureFlags2.ufo);
68
- measureEditorReady && startMeasure(measurements.ON_EDITOR_READY_CALLBACK);
69
- props.onEditorReady(editorActions.current);
70
- measureEditorReady && stopMeasure(measurements.ON_EDITOR_READY_CALLBACK, sendDurationAnalytics(ACTION.ON_EDITOR_READY_CALLBACK, props, getExperienceStore, createAnalyticsEvent));
71
- }
72
- };
73
- var onEditorDestroyed = function onEditorDestroyed(_instance) {
74
- var _props$onDestroy;
75
- editorActions.current._privateUnregisterEditor();
76
- (_props$onDestroy = props.onDestroy) === null || _props$onDestroy === void 0 || _props$onDestroy.call(props);
77
- };
78
- useMeasureEditorMountTime(props, getExperienceStore, createAnalyticsEvent);
79
- var providerFactory = useProviderFactory(props, editorActions.current, createAnalyticsEvent);
80
- return jsx(EditorInternal, {
81
- props: props,
82
- handleAnalyticsEvent: handleAnalyticsEvent,
83
- createAnalyticsEvent: createAnalyticsEvent,
84
- preset: props.preset,
85
- handleSave: function handleSave(view) {
86
- var _props$onSave;
87
- return (_props$onSave = props.onSave) === null || _props$onSave === void 0 ? void 0 : _props$onSave.call(props, view);
88
- },
89
- editorActions: editorActions.current,
90
- onEditorCreated: onEditorCreated,
91
- onEditorDestroyed: onEditorDestroyed,
92
- providerFactory: providerFactory
93
- });
94
- }
95
- /**
96
- * Improved memonization for Editor wrapper that deals with the lifecycle logic of the editor
97
- */
98
- function EditorButBetter(passedProps) {
99
28
  var propsRef = useRef(passedProps);
100
- var props = useMemo(function () {
101
- // That sounds awful but this is the only way to make sure we didn't missed any EditorProps
102
- var allProps = {
103
- preset: passedProps.preset,
104
- appearance: passedProps.appearance,
105
- contentComponents: passedProps.contentComponents,
106
- primaryToolbarIconBefore: passedProps.primaryToolbarIconBefore,
107
- secondaryToolbarComponents: passedProps.secondaryToolbarComponents,
108
- persistScrollGutter: passedProps.persistScrollGutter,
109
- quickInsert: passedProps.quickInsert,
110
- shouldFocus: passedProps.shouldFocus,
111
- disabled: passedProps.disabled,
112
- contextPanel: passedProps.contextPanel,
113
- errorReporterHandler: passedProps.errorReporterHandler,
114
- contentTransformerProvider: passedProps.contentTransformerProvider,
115
- maxHeight: passedProps.maxHeight,
116
- minHeight: passedProps.minHeight,
117
- placeholder: passedProps.placeholder,
118
- placeholderBracketHint: passedProps.placeholderBracketHint,
119
- defaultValue: passedProps.defaultValue,
120
- assistiveLabel: passedProps.assistiveLabel,
121
- popupsMountPoint: passedProps.popupsMountPoint,
122
- popupsBoundariesElement: passedProps.popupsBoundariesElement,
123
- popupsScrollableElement: passedProps.popupsScrollableElement,
124
- editorActions: passedProps.editorActions,
125
- onEditorReady: passedProps.onEditorReady,
126
- onDestroy: passedProps.onDestroy,
127
- onChange: passedProps.onChange,
128
- onCancel: passedProps.onCancel,
129
- inputSamplingLimit: passedProps.inputSamplingLimit,
130
- extensionProviders: passedProps.extensionProviders,
131
- UNSAFE_useAnalyticsContext: passedProps.UNSAFE_useAnalyticsContext,
132
- trackValidTransactions: passedProps.trackValidTransactions,
133
- useStickyToolbar: passedProps.useStickyToolbar,
134
- featureFlags: passedProps.featureFlags,
135
- onSave: passedProps.onSave,
136
- performanceTracking: passedProps.performanceTracking,
137
- sanitizePrivateContent: passedProps.sanitizePrivateContent,
138
- media: passedProps.media,
139
- collabEdit: passedProps.collabEdit,
140
- primaryToolbarComponents: passedProps.primaryToolbarComponents,
141
- allowUndoRedoButtons: passedProps.allowUndoRedoButtons,
142
- linking: passedProps.linking,
143
- hideAvatarGroup: passedProps.hideAvatarGroup,
144
- activityProvider: passedProps.activityProvider,
145
- searchProvider: passedProps.searchProvider,
146
- annotationProviders: passedProps.annotationProviders,
147
- collabEditProvider: passedProps.collabEditProvider,
148
- presenceProvider: passedProps.presenceProvider,
149
- emojiProvider: passedProps.emojiProvider,
150
- taskDecisionProvider: passedProps.taskDecisionProvider,
151
- legacyImageUploadProvider: passedProps.legacyImageUploadProvider,
152
- mentionProvider: passedProps.mentionProvider,
153
- autoformattingProvider: passedProps.autoformattingProvider,
154
- macroProvider: passedProps.macroProvider,
155
- contextIdentifierProvider: passedProps.contextIdentifierProvider,
156
- allowExpand: passedProps.allowExpand,
157
- allowNestedTasks: passedProps.allowNestedTasks,
158
- allowBlockType: passedProps.allowBlockType,
159
- allowTasksAndDecisions: passedProps.allowTasksAndDecisions,
160
- allowBreakout: passedProps.allowBreakout,
161
- allowRule: passedProps.allowRule,
162
- allowHelpDialog: passedProps.allowHelpDialog,
163
- allowJiraIssue: passedProps.allowJiraIssue,
164
- allowPanel: passedProps.allowPanel,
165
- allowExtension: passedProps.allowExtension,
166
- allowConfluenceInlineComment: passedProps.allowConfluenceInlineComment,
167
- allowTemplatePlaceholders: passedProps.allowTemplatePlaceholders,
168
- allowDate: passedProps.allowDate,
169
- allowLayouts: passedProps.allowLayouts,
170
- allowStatus: passedProps.allowStatus,
171
- allowTextAlignment: passedProps.allowTextAlignment,
172
- allowIndentation: passedProps.allowIndentation,
173
- showIndentationButtons: passedProps.showIndentationButtons,
174
- allowNewInsertionBehaviour: passedProps.allowNewInsertionBehaviour,
175
- allowFindReplace: passedProps.allowFindReplace,
176
- UNSAFE_allowBorderMark: passedProps.UNSAFE_allowBorderMark,
177
- allowBorderMark: passedProps.allowBorderMark,
178
- allowFragmentMark: passedProps.allowFragmentMark,
179
- autoScrollIntoView: passedProps.autoScrollIntoView,
180
- elementBrowser: passedProps.elementBrowser,
181
- maxContentSize: passedProps.maxContentSize,
182
- saveOnEnter: passedProps.saveOnEnter,
183
- feedbackInfo: passedProps.feedbackInfo,
184
- mention: passedProps.mention,
185
- mentionInsertDisplayName: passedProps.mentionInsertDisplayName,
186
- uploadErrorHandler: passedProps.uploadErrorHandler,
187
- waitForMediaUpload: passedProps.waitForMediaUpload,
188
- extensionHandlers: passedProps.extensionHandlers,
189
- allowTextColor: passedProps.allowTextColor,
190
- allowTables: passedProps.allowTables,
191
- insertMenuItems: passedProps.insertMenuItems,
192
- UNSAFE_cards: passedProps.UNSAFE_cards,
193
- smartLinks: passedProps.smartLinks,
194
- allowAnalyticsGASV3: passedProps.allowAnalyticsGASV3,
195
- codeBlock: passedProps.codeBlock,
196
- textFormatting: passedProps.textFormatting,
197
- dangerouslyAppendPlugins: passedProps.dangerouslyAppendPlugins
198
- };
199
- var defaultProps = {
200
- appearance: 'comment',
201
- disabled: false,
202
- quickInsert: true
203
- };
204
- var nextProps = _objectSpread(_objectSpread({}, defaultProps), allProps);
205
- propsRef.current = nextProps;
206
- return nextProps;
207
- }, [passedProps.preset, passedProps.appearance, passedProps.contentComponents, passedProps.primaryToolbarIconBefore, passedProps.secondaryToolbarComponents, passedProps.persistScrollGutter, passedProps.quickInsert, passedProps.shouldFocus, passedProps.disabled, passedProps.contextPanel, passedProps.errorReporterHandler, passedProps.contentTransformerProvider, passedProps.maxHeight, passedProps.minHeight, passedProps.placeholder, passedProps.placeholderBracketHint, passedProps.defaultValue, passedProps.assistiveLabel, passedProps.popupsMountPoint, passedProps.popupsBoundariesElement, passedProps.popupsScrollableElement, passedProps.editorActions, passedProps.onEditorReady, passedProps.onDestroy, passedProps.onChange, passedProps.onCancel, passedProps.inputSamplingLimit, passedProps.extensionProviders, passedProps.UNSAFE_useAnalyticsContext, passedProps.trackValidTransactions, passedProps.useStickyToolbar, passedProps.featureFlags, passedProps.onSave, passedProps.performanceTracking, passedProps.sanitizePrivateContent, passedProps.media, passedProps.collabEdit, passedProps.primaryToolbarComponents, passedProps.allowUndoRedoButtons, passedProps.linking, passedProps.hideAvatarGroup, passedProps.activityProvider, passedProps.searchProvider, passedProps.annotationProviders, passedProps.collabEditProvider, passedProps.presenceProvider, passedProps.emojiProvider, passedProps.taskDecisionProvider, passedProps.legacyImageUploadProvider, passedProps.mentionProvider, passedProps.autoformattingProvider, passedProps.macroProvider, passedProps.contextIdentifierProvider, passedProps.allowExpand, passedProps.allowNestedTasks, passedProps.allowBlockType, passedProps.allowTasksAndDecisions, passedProps.allowBreakout, passedProps.allowRule, passedProps.allowHelpDialog, passedProps.allowJiraIssue, passedProps.allowPanel, passedProps.allowExtension, passedProps.allowConfluenceInlineComment, passedProps.allowTemplatePlaceholders, passedProps.allowDate, passedProps.allowLayouts, passedProps.allowStatus, passedProps.allowTextAlignment, passedProps.allowIndentation, passedProps.showIndentationButtons, passedProps.allowNewInsertionBehaviour, passedProps.allowFindReplace, passedProps.UNSAFE_allowBorderMark, passedProps.allowBorderMark, passedProps.allowFragmentMark, passedProps.autoScrollIntoView, passedProps.elementBrowser, passedProps.maxContentSize, passedProps.saveOnEnter, passedProps.feedbackInfo, passedProps.mention, passedProps.mentionInsertDisplayName, passedProps.uploadErrorHandler, passedProps.waitForMediaUpload, passedProps.extensionHandlers, passedProps.allowTextColor, passedProps.allowTables, passedProps.insertMenuItems, passedProps.UNSAFE_cards, passedProps.smartLinks, passedProps.allowAnalyticsGASV3, passedProps.codeBlock, passedProps.textFormatting, passedProps.dangerouslyAppendPlugins]);
29
+ var props = useMemoEditorProps(passedProps);
30
+ useMemo(function () {
31
+ propsRef.current = props;
32
+ }, [props]);
208
33
  var editorContext = useEditorContext();
209
34
  var editorActionsPlaceholderInstance = useMemo(function () {
210
35
  return new EditorActions();
211
36
  }, []);
212
37
  var editorActions = editorContext.editorActions || editorActionsPlaceholderInstance;
213
38
  var startTime = useRef(performance.now());
214
- var _useAnalyticsEvents2 = useAnalyticsEvents(),
215
- createAnalyticsEvent = _useAnalyticsEvents2.createAnalyticsEvent;
39
+ var _useAnalyticsEvents = useAnalyticsEvents(),
40
+ createAnalyticsEvent = _useAnalyticsEvents.createAnalyticsEvent;
216
41
  var experienceStore = useRef();
217
42
  var handleAnalyticsEvent = useCallback(function (data) {
218
43
  fireAnalyticsEvent(createAnalyticsEvent)(data);
@@ -236,9 +61,9 @@ function EditorButBetter(passedProps) {
236
61
  featureFlags = _propsRef$current.featureFlags;
237
62
  editorActions._privateRegisterEditor(instance.view, instance.eventDispatcher, instance.transformer, getFeatureFlagsFromRef);
238
63
  if (featureFlags !== null && featureFlags !== void 0 && featureFlags.ufo) {
239
- var _experienceStore$curr2;
64
+ var _experienceStore$curr;
240
65
  experienceStore.current = ExperienceStore.getInstance(instance.view);
241
- (_experienceStore$curr2 = experienceStore.current) === null || _experienceStore$curr2 === void 0 || _experienceStore$curr2.start(EditorExperience.loadEditor, startTime.current);
66
+ (_experienceStore$curr = experienceStore.current) === null || _experienceStore$curr === void 0 || _experienceStore$curr.start(EditorExperience.loadEditor, startTime.current);
242
67
  }
243
68
  if (onEditorReady) {
244
69
  var _performanceTracking$;
@@ -289,13 +114,6 @@ export function ComposableEditor(props) {
289
114
  editorSessionId: editorSessionId.current
290
115
  };
291
116
  }, [props.appearance]);
292
- if (getBooleanFF('platform.editor.less-editor-props-rerendering')) {
293
- return jsx(FabricEditorAnalyticsContext
294
- // @ts-expect-error Type 'string' is not assignable to type '"editorCore" | "renderer"'.
295
- , {
296
- data: data
297
- }, jsx(EditorButBetter, props));
298
- }
299
117
  return jsx(FabricEditorAnalyticsContext
300
118
  // @ts-expect-error Type 'string' is not assignable to type '"editorCore" | "renderer"'.
301
119
  , {