@atlaskit/editor-plugin-media 9.4.1 → 9.4.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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,13 @@
1
1
  # @atlaskit/editor-plugin-media
2
2
 
3
+ ## 9.4.2
4
+
5
+ ### Patch Changes
6
+
7
+ - [`688d81c54687e`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/688d81c54687e) -
8
+ fix media client config undefined issue in media node
9
+ - Updated dependencies
10
+
3
11
  ## 9.4.1
4
12
 
5
13
  ### Patch Changes
@@ -114,6 +114,17 @@ var MediaNodeView = /*#__PURE__*/function (_SelectionBasedNodeVi) {
114
114
  }
115
115
  return flexibleDimensions;
116
116
  });
117
+ (0, _defineProperty2.default)(_this, "getMediaProviderToUse", function (mediaOptions, mediaProvider) {
118
+ if (mediaProvider) {
119
+ return mediaProvider;
120
+ }
121
+ if ((0, _expValEquals.expValEquals)('platform_editor_media_vc_fixes', 'isEnabled', true)) {
122
+ return mediaOptions.provider;
123
+ }
124
+ if ((0, _expValEquals.expValEquals)('platform_editor_ssr_renderer', 'isEnabled', true)) {
125
+ return mediaOptions.syncProvider ? Promise.resolve(mediaOptions.syncProvider) : mediaOptions.provider;
126
+ }
127
+ });
117
128
  (0, _defineProperty2.default)(_this, "renderMediaNodeWithState", function (contextIdentifierProvider) {
118
129
  return function (_ref2) {
119
130
  var _this$reactComponentP;
@@ -145,10 +156,6 @@ var MediaNodeView = /*#__PURE__*/function (_SelectionBasedNodeVi) {
145
156
  height: height
146
157
  };
147
158
  var isSelectedAndInteracted = _this.nodeInsideSelection() && interactionState !== 'hasNotHadInteraction';
148
- var mediaProviderToUse = mediaProvider;
149
- if (!mediaProviderToUse && (0, _expValEquals.expValEquals)('platform_editor_ssr_renderer', 'isEnabled', true)) {
150
- mediaProviderToUse = mediaOptions.syncProvider ? Promise.resolve(mediaOptions.syncProvider) : mediaOptions.provider;
151
- }
152
159
  return /*#__PURE__*/_react.default.createElement(_media.default, {
153
160
  api: pluginInjectionApi,
154
161
  view: _this.view,
@@ -158,7 +165,8 @@ var MediaNodeView = /*#__PURE__*/function (_SelectionBasedNodeVi) {
158
165
  originalDimensions: originalDimensions,
159
166
  maxDimensions: maxDimensions,
160
167
  url: url,
161
- mediaProvider: mediaProviderToUse,
168
+ mediaProvider: _this.getMediaProviderToUse(mediaOptions, mediaProvider),
169
+ syncProvider: mediaOptions.syncProvider,
162
170
  contextIdentifierProvider: contextIdentifierProvider,
163
171
  mediaOptions: mediaOptions,
164
172
  onExternalImageLoaded: _this.onExternalImageLoaded,
@@ -16,6 +16,7 @@ var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits
16
16
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
17
17
  var _react = _interopRequireWildcard(require("react"));
18
18
  var _bindEventListener = require("bind-event-listener");
19
+ var _memoizeOne = _interopRequireDefault(require("memoize-one"));
19
20
  var _analyticsNamespacedContext = require("@atlaskit/analytics-namespaced-context");
20
21
  var _analyticsNext = require("@atlaskit/analytics-next");
21
22
  var _toolbarFlagCheck = require("@atlaskit/editor-common/toolbar-flag-check");
@@ -54,10 +55,20 @@ var MediaNode = exports.MediaNode = /*#__PURE__*/function (_Component) {
54
55
  if (mediaProvider) {
55
56
  viewMediaClientConfig = mediaProvider.viewMediaClientConfig;
56
57
  viewAndUploadMediaClientConfig = mediaProvider.viewAndUploadMediaClientConfig;
57
- _this.setState({
58
- viewMediaClientConfig: viewMediaClientConfig,
59
- viewAndUploadMediaClientConfig: viewAndUploadMediaClientConfig
60
- });
58
+ if ((0, _expValEquals.expValEquals)('platform_editor_media_vc_fixes', 'isEnabled', true)) {
59
+ // Only update state if new configs are available and different from current state
60
+ if (viewMediaClientConfig && _this.state.viewMediaClientConfig !== viewMediaClientConfig || viewAndUploadMediaClientConfig && _this.state.viewAndUploadMediaClientConfig !== viewAndUploadMediaClientConfig) {
61
+ _this.setState({
62
+ viewMediaClientConfig: viewMediaClientConfig,
63
+ viewAndUploadMediaClientConfig: viewAndUploadMediaClientConfig
64
+ });
65
+ }
66
+ } else {
67
+ _this.setState({
68
+ viewMediaClientConfig: viewMediaClientConfig,
69
+ viewAndUploadMediaClientConfig: viewAndUploadMediaClientConfig
70
+ });
71
+ }
61
72
  }
62
73
  case 4:
63
74
  case "end":
@@ -103,6 +114,15 @@ var MediaNode = exports.MediaNode = /*#__PURE__*/function (_Component) {
103
114
  (0, _utils.setNodeSelection)(_this.props.view, propPos - 1);
104
115
  }
105
116
  });
117
+ (0, _defineProperty2.default)(_this, "getMediaSettings", (0, _memoizeOne.default)(function (viewAndUploadMediaClientConfig) {
118
+ return {
119
+ canUpdateVideoCaptions: (0, _platformFeatureFlags.fg)('platform_media_video_captions') ? !!viewAndUploadMediaClientConfig : false
120
+ };
121
+ }));
122
+ (0, _defineProperty2.default)(_this, "onError", function (reason) {
123
+ var _this$props$api;
124
+ (_this$props$api = _this.props.api) === null || _this$props$api === void 0 || _this$props$api.media.actions.handleMediaNodeRenderError(_this.props.node, reason);
125
+ });
106
126
  (0, _defineProperty2.default)(_this, "onFullscreenChange", function (fullscreen) {
107
127
  var _this$mediaPluginStat;
108
128
  (_this$mediaPluginStat = _this.mediaPluginState) === null || _this$mediaPluginStat === void 0 || _this$mediaPluginStat.updateAndDispatch({
@@ -116,8 +136,18 @@ var MediaNode = exports.MediaNode = /*#__PURE__*/function (_Component) {
116
136
  return _this.props.getPos();
117
137
  });
118
138
  });
119
- var view = _this.props.view;
139
+ var _this$props = _this.props,
140
+ view = _this$props.view,
141
+ syncProvider = _this$props.syncProvider;
120
142
  _this.mediaPluginState = _pluginKey.stateKey.getState(view.state);
143
+
144
+ // Initialize state from syncProvider (available on both server and client for SSR)
145
+ if ((0, _expValEquals.expValEquals)('platform_editor_media_vc_fixes', 'isEnabled', true) && syncProvider) {
146
+ _this.state = {
147
+ viewMediaClientConfig: syncProvider.viewMediaClientConfig,
148
+ viewAndUploadMediaClientConfig: syncProvider.viewAndUploadMediaClientConfig
149
+ };
150
+ }
121
151
  return _this;
122
152
  }
123
153
  (0, _inherits2.default)(MediaNode, _Component);
@@ -126,7 +156,7 @@ var MediaNode = exports.MediaNode = /*#__PURE__*/function (_Component) {
126
156
  value: function shouldComponentUpdate(nextProps, nextState) {
127
157
  var hasNewViewMediaClientConfig = !this.state.viewMediaClientConfig && nextState.viewMediaClientConfig;
128
158
  var hasNewViewAndUploadMediaClientConfig = !this.state.viewAndUploadMediaClientConfig && nextState.viewAndUploadMediaClientConfig;
129
- if (this.props.selected !== nextProps.selected || this.props.node.attrs.id !== nextProps.node.attrs.id || this.props.node.attrs.collection !== nextProps.node.attrs.collection || this.props.maxDimensions.height !== nextProps.maxDimensions.height || this.props.maxDimensions.width !== nextProps.maxDimensions.width || this.props.contextIdentifierProvider !== nextProps.contextIdentifierProvider || this.props.isLoading !== nextProps.isLoading || this.props.mediaProvider !== nextProps.mediaProvider || hasNewViewMediaClientConfig || hasNewViewAndUploadMediaClientConfig) {
159
+ if (this.props.selected !== nextProps.selected || this.props.node.attrs.id !== nextProps.node.attrs.id || this.props.node.attrs.collection !== nextProps.node.attrs.collection || this.props.maxDimensions.height !== nextProps.maxDimensions.height || this.props.maxDimensions.width !== nextProps.maxDimensions.width || this.props.contextIdentifierProvider !== nextProps.contextIdentifierProvider || this.props.isLoading !== nextProps.isLoading || this.props.mediaProvider !== nextProps.mediaProvider || (0, _expValEquals.expValEquals)('platform_editor_media_vc_fixes', 'isEnabled', true) && this.props.syncProvider !== nextProps.syncProvider || hasNewViewMediaClientConfig || hasNewViewAndUploadMediaClientConfig) {
130
160
  return true;
131
161
  }
132
162
  return false;
@@ -240,14 +270,13 @@ var MediaNode = exports.MediaNode = /*#__PURE__*/function (_Component) {
240
270
  }, {
241
271
  key: "render",
242
272
  value: function render() {
243
- var _this$props = this.props,
244
- node = _this$props.node,
245
- selected = _this$props.selected,
246
- originalDimensions = _this$props.originalDimensions,
247
- isLoading = _this$props.isLoading,
248
- maxDimensions = _this$props.maxDimensions,
249
- mediaOptions = _this$props.mediaOptions,
250
- api = _this$props.api;
273
+ var _this$props2 = this.props,
274
+ node = _this$props2.node,
275
+ selected = _this$props2.selected,
276
+ originalDimensions = _this$props2.originalDimensions,
277
+ isLoading = _this$props2.isLoading,
278
+ maxDimensions = _this$props2.maxDimensions,
279
+ mediaOptions = _this$props2.mediaOptions;
251
280
  var borderMark = node.marks.find(function (m) {
252
281
  return m.type.name === 'border';
253
282
  });
@@ -261,6 +290,8 @@ var MediaNode = exports.MediaNode = /*#__PURE__*/function (_Component) {
261
290
  collection = _node$attrs.collection,
262
291
  url = _node$attrs.url,
263
292
  alt = _node$attrs.alt;
293
+
294
+ // Check if we have any media client config available (syncProvider, state, or upload config)
264
295
  var hasNoMediaClientConfig = !viewMediaClientConfig && ((0, _platformFeatureFlags.fg)('platform_media_video_captions') ? !viewAndUploadMediaClientConfig : true);
265
296
  if (isLoading || type !== 'external' && hasNoMediaClientConfig) {
266
297
  if ((0, _expValEquals.expValEquals)('platform_editor_media_vc_fixes', 'isEnabled', true)) {
@@ -332,12 +363,8 @@ var MediaNode = exports.MediaNode = /*#__PURE__*/function (_Component) {
332
363
  alt: alt,
333
364
  videoControlsWrapperRef: this.videoControlsWrapperRef,
334
365
  ssr: ssr,
335
- mediaSettings: {
336
- canUpdateVideoCaptions: (0, _platformFeatureFlags.fg)('platform_media_video_captions') ? !!viewAndUploadMediaClientConfig : false
337
- },
338
- onError: (0, _expValEquals.expValEquals)('platform_editor_media_error_analytics', 'isEnabled', true) ? function (reason) {
339
- return api === null || api === void 0 ? void 0 : api.media.actions.handleMediaNodeRenderError(node, reason);
340
- } : undefined
366
+ mediaSettings: this.getMediaSettings(viewAndUploadMediaClientConfig),
367
+ onError: (0, _expValEquals.expValEquals)('platform_editor_media_error_analytics', 'isEnabled', true) ? this.onError : undefined
341
368
  })));
342
369
  }
343
370
  }]);
@@ -94,6 +94,17 @@ class MediaNodeView extends SelectionBasedNodeView {
94
94
  }
95
95
  return flexibleDimensions;
96
96
  });
97
+ _defineProperty(this, "getMediaProviderToUse", (mediaOptions, mediaProvider) => {
98
+ if (mediaProvider) {
99
+ return mediaProvider;
100
+ }
101
+ if (expValEquals('platform_editor_media_vc_fixes', 'isEnabled', true)) {
102
+ return mediaOptions.provider;
103
+ }
104
+ if (expValEquals('platform_editor_ssr_renderer', 'isEnabled', true)) {
105
+ return mediaOptions.syncProvider ? Promise.resolve(mediaOptions.syncProvider) : mediaOptions.provider;
106
+ }
107
+ });
97
108
  _defineProperty(this, "renderMediaNodeWithState", contextIdentifierProvider => {
98
109
  return ({
99
110
  mediaProvider,
@@ -134,10 +145,6 @@ class MediaNodeView extends SelectionBasedNodeView {
134
145
  height
135
146
  };
136
147
  const isSelectedAndInteracted = this.nodeInsideSelection() && interactionState !== 'hasNotHadInteraction';
137
- let mediaProviderToUse = mediaProvider;
138
- if (!mediaProviderToUse && expValEquals('platform_editor_ssr_renderer', 'isEnabled', true)) {
139
- mediaProviderToUse = mediaOptions.syncProvider ? Promise.resolve(mediaOptions.syncProvider) : mediaOptions.provider;
140
- }
141
148
  return /*#__PURE__*/React.createElement(MediaNode, {
142
149
  api: pluginInjectionApi,
143
150
  view: this.view,
@@ -147,7 +154,8 @@ class MediaNodeView extends SelectionBasedNodeView {
147
154
  originalDimensions: originalDimensions,
148
155
  maxDimensions: maxDimensions,
149
156
  url: url,
150
- mediaProvider: mediaProviderToUse,
157
+ mediaProvider: this.getMediaProviderToUse(mediaOptions, mediaProvider),
158
+ syncProvider: mediaOptions.syncProvider,
151
159
  contextIdentifierProvider: contextIdentifierProvider,
152
160
  mediaOptions: mediaOptions,
153
161
  onExternalImageLoaded: this.onExternalImageLoaded,
@@ -1,6 +1,7 @@
1
1
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
2
  import React, { Component } from 'react';
3
3
  import { bind } from 'bind-event-listener';
4
+ import memoizeOne from 'memoize-one';
4
5
  import { MEDIA_CONTEXT } from '@atlaskit/analytics-namespaced-context';
5
6
  import { AnalyticsContext } from '@atlaskit/analytics-next';
6
7
  import { areToolbarFlagsEnabled } from '@atlaskit/editor-common/toolbar-flag-check';
@@ -24,14 +25,25 @@ export class MediaNode extends Component {
24
25
  _defineProperty(this, "videoControlsWrapperRef", /*#__PURE__*/React.createRef());
25
26
  _defineProperty(this, "unbindKeyDown", null);
26
27
  _defineProperty(this, "setViewMediaClientConfig", async () => {
28
+ // mediaProvider is Promise<MediaProvider>, so await it first to get the actual provider
27
29
  const mediaProvider = await this.props.mediaProvider;
28
30
  if (mediaProvider) {
29
31
  const viewMediaClientConfig = mediaProvider.viewMediaClientConfig;
30
32
  const viewAndUploadMediaClientConfig = mediaProvider.viewAndUploadMediaClientConfig;
31
- this.setState({
32
- viewMediaClientConfig,
33
- viewAndUploadMediaClientConfig
34
- });
33
+ if (expValEquals('platform_editor_media_vc_fixes', 'isEnabled', true)) {
34
+ // Only update state if new configs are available and different from current state
35
+ if (viewMediaClientConfig && this.state.viewMediaClientConfig !== viewMediaClientConfig || viewAndUploadMediaClientConfig && this.state.viewAndUploadMediaClientConfig !== viewAndUploadMediaClientConfig) {
36
+ this.setState({
37
+ viewMediaClientConfig,
38
+ viewAndUploadMediaClientConfig
39
+ });
40
+ }
41
+ } else {
42
+ this.setState({
43
+ viewMediaClientConfig,
44
+ viewAndUploadMediaClientConfig
45
+ });
46
+ }
35
47
  }
36
48
  });
37
49
  _defineProperty(this, "selectMediaSingleFromCard", ({
@@ -75,6 +87,13 @@ export class MediaNode extends Component {
75
87
  setNodeSelection(this.props.view, propPos - 1);
76
88
  }
77
89
  });
90
+ _defineProperty(this, "getMediaSettings", memoizeOne(viewAndUploadMediaClientConfig => ({
91
+ canUpdateVideoCaptions: fg('platform_media_video_captions') ? !!viewAndUploadMediaClientConfig : false
92
+ })));
93
+ _defineProperty(this, "onError", reason => {
94
+ var _this$props$api;
95
+ (_this$props$api = this.props.api) === null || _this$props$api === void 0 ? void 0 : _this$props$api.media.actions.handleMediaNodeRenderError(this.props.node, reason);
96
+ });
78
97
  _defineProperty(this, "onFullscreenChange", fullscreen => {
79
98
  var _this$mediaPluginStat;
80
99
  (_this$mediaPluginStat = this.mediaPluginState) === null || _this$mediaPluginStat === void 0 ? void 0 : _this$mediaPluginStat.updateAndDispatch({
@@ -89,14 +108,23 @@ export class MediaNode extends Component {
89
108
  (_this$mediaPluginStat2 = this.mediaPluginState) === null || _this$mediaPluginStat2 === void 0 ? void 0 : _this$mediaPluginStat2.handleMediaNodeMount(node, () => this.props.getPos());
90
109
  });
91
110
  const {
92
- view
111
+ view,
112
+ syncProvider
93
113
  } = this.props;
94
114
  this.mediaPluginState = mediaStateKey.getState(view.state);
115
+
116
+ // Initialize state from syncProvider (available on both server and client for SSR)
117
+ if (expValEquals('platform_editor_media_vc_fixes', 'isEnabled', true) && syncProvider) {
118
+ this.state = {
119
+ viewMediaClientConfig: syncProvider.viewMediaClientConfig,
120
+ viewAndUploadMediaClientConfig: syncProvider.viewAndUploadMediaClientConfig
121
+ };
122
+ }
95
123
  }
96
124
  shouldComponentUpdate(nextProps, nextState) {
97
125
  const hasNewViewMediaClientConfig = !this.state.viewMediaClientConfig && nextState.viewMediaClientConfig;
98
126
  const hasNewViewAndUploadMediaClientConfig = !this.state.viewAndUploadMediaClientConfig && nextState.viewAndUploadMediaClientConfig;
99
- if (this.props.selected !== nextProps.selected || this.props.node.attrs.id !== nextProps.node.attrs.id || this.props.node.attrs.collection !== nextProps.node.attrs.collection || this.props.maxDimensions.height !== nextProps.maxDimensions.height || this.props.maxDimensions.width !== nextProps.maxDimensions.width || this.props.contextIdentifierProvider !== nextProps.contextIdentifierProvider || this.props.isLoading !== nextProps.isLoading || this.props.mediaProvider !== nextProps.mediaProvider || hasNewViewMediaClientConfig || hasNewViewAndUploadMediaClientConfig) {
127
+ if (this.props.selected !== nextProps.selected || this.props.node.attrs.id !== nextProps.node.attrs.id || this.props.node.attrs.collection !== nextProps.node.attrs.collection || this.props.maxDimensions.height !== nextProps.maxDimensions.height || this.props.maxDimensions.width !== nextProps.maxDimensions.width || this.props.contextIdentifierProvider !== nextProps.contextIdentifierProvider || this.props.isLoading !== nextProps.isLoading || this.props.mediaProvider !== nextProps.mediaProvider || expValEquals('platform_editor_media_vc_fixes', 'isEnabled', true) && this.props.syncProvider !== nextProps.syncProvider || hasNewViewMediaClientConfig || hasNewViewAndUploadMediaClientConfig) {
100
128
  return true;
101
129
  }
102
130
  return false;
@@ -187,8 +215,7 @@ export class MediaNode extends Component {
187
215
  originalDimensions,
188
216
  isLoading,
189
217
  maxDimensions,
190
- mediaOptions,
191
- api
218
+ mediaOptions
192
219
  } = this.props;
193
220
  const borderMark = node.marks.find(m => m.type.name === 'border');
194
221
  const {
@@ -203,6 +230,8 @@ export class MediaNode extends Component {
203
230
  url,
204
231
  alt
205
232
  } = node.attrs;
233
+
234
+ // Check if we have any media client config available (syncProvider, state, or upload config)
206
235
  const hasNoMediaClientConfig = !viewMediaClientConfig && (fg('platform_media_video_captions') ? !viewAndUploadMediaClientConfig : true);
207
236
  if (isLoading || type !== 'external' && hasNoMediaClientConfig) {
208
237
  if (expValEquals('platform_editor_media_vc_fixes', 'isEnabled', true)) {
@@ -274,10 +303,8 @@ export class MediaNode extends Component {
274
303
  alt: alt,
275
304
  videoControlsWrapperRef: this.videoControlsWrapperRef,
276
305
  ssr: ssr,
277
- mediaSettings: {
278
- canUpdateVideoCaptions: fg('platform_media_video_captions') ? !!viewAndUploadMediaClientConfig : false
279
- },
280
- onError: expValEquals('platform_editor_media_error_analytics', 'isEnabled', true) ? reason => api === null || api === void 0 ? void 0 : api.media.actions.handleMediaNodeRenderError(node, reason) : undefined
306
+ mediaSettings: this.getMediaSettings(viewAndUploadMediaClientConfig),
307
+ onError: expValEquals('platform_editor_media_error_analytics', 'isEnabled', true) ? this.onError : undefined
281
308
  })));
282
309
  }
283
310
  }
@@ -108,6 +108,17 @@ var MediaNodeView = /*#__PURE__*/function (_SelectionBasedNodeVi) {
108
108
  }
109
109
  return flexibleDimensions;
110
110
  });
111
+ _defineProperty(_this, "getMediaProviderToUse", function (mediaOptions, mediaProvider) {
112
+ if (mediaProvider) {
113
+ return mediaProvider;
114
+ }
115
+ if (expValEquals('platform_editor_media_vc_fixes', 'isEnabled', true)) {
116
+ return mediaOptions.provider;
117
+ }
118
+ if (expValEquals('platform_editor_ssr_renderer', 'isEnabled', true)) {
119
+ return mediaOptions.syncProvider ? Promise.resolve(mediaOptions.syncProvider) : mediaOptions.provider;
120
+ }
121
+ });
111
122
  _defineProperty(_this, "renderMediaNodeWithState", function (contextIdentifierProvider) {
112
123
  return function (_ref2) {
113
124
  var _this$reactComponentP;
@@ -139,10 +150,6 @@ var MediaNodeView = /*#__PURE__*/function (_SelectionBasedNodeVi) {
139
150
  height: height
140
151
  };
141
152
  var isSelectedAndInteracted = _this.nodeInsideSelection() && interactionState !== 'hasNotHadInteraction';
142
- var mediaProviderToUse = mediaProvider;
143
- if (!mediaProviderToUse && expValEquals('platform_editor_ssr_renderer', 'isEnabled', true)) {
144
- mediaProviderToUse = mediaOptions.syncProvider ? Promise.resolve(mediaOptions.syncProvider) : mediaOptions.provider;
145
- }
146
153
  return /*#__PURE__*/React.createElement(MediaNode, {
147
154
  api: pluginInjectionApi,
148
155
  view: _this.view,
@@ -152,7 +159,8 @@ var MediaNodeView = /*#__PURE__*/function (_SelectionBasedNodeVi) {
152
159
  originalDimensions: originalDimensions,
153
160
  maxDimensions: maxDimensions,
154
161
  url: url,
155
- mediaProvider: mediaProviderToUse,
162
+ mediaProvider: _this.getMediaProviderToUse(mediaOptions, mediaProvider),
163
+ syncProvider: mediaOptions.syncProvider,
156
164
  contextIdentifierProvider: contextIdentifierProvider,
157
165
  mediaOptions: mediaOptions,
158
166
  onExternalImageLoaded: _this.onExternalImageLoaded,
@@ -10,6 +10,7 @@ function _callSuper(t, o, e) { return o = _getPrototypeOf(o), _possibleConstruct
10
10
  function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
11
11
  import React, { Component } from 'react';
12
12
  import { bind } from 'bind-event-listener';
13
+ import memoizeOne from 'memoize-one';
13
14
  import { MEDIA_CONTEXT } from '@atlaskit/analytics-namespaced-context';
14
15
  import { AnalyticsContext } from '@atlaskit/analytics-next';
15
16
  import { areToolbarFlagsEnabled } from '@atlaskit/editor-common/toolbar-flag-check';
@@ -46,10 +47,20 @@ export var MediaNode = /*#__PURE__*/function (_Component) {
46
47
  if (mediaProvider) {
47
48
  viewMediaClientConfig = mediaProvider.viewMediaClientConfig;
48
49
  viewAndUploadMediaClientConfig = mediaProvider.viewAndUploadMediaClientConfig;
49
- _this.setState({
50
- viewMediaClientConfig: viewMediaClientConfig,
51
- viewAndUploadMediaClientConfig: viewAndUploadMediaClientConfig
52
- });
50
+ if (expValEquals('platform_editor_media_vc_fixes', 'isEnabled', true)) {
51
+ // Only update state if new configs are available and different from current state
52
+ if (viewMediaClientConfig && _this.state.viewMediaClientConfig !== viewMediaClientConfig || viewAndUploadMediaClientConfig && _this.state.viewAndUploadMediaClientConfig !== viewAndUploadMediaClientConfig) {
53
+ _this.setState({
54
+ viewMediaClientConfig: viewMediaClientConfig,
55
+ viewAndUploadMediaClientConfig: viewAndUploadMediaClientConfig
56
+ });
57
+ }
58
+ } else {
59
+ _this.setState({
60
+ viewMediaClientConfig: viewMediaClientConfig,
61
+ viewAndUploadMediaClientConfig: viewAndUploadMediaClientConfig
62
+ });
63
+ }
53
64
  }
54
65
  case 4:
55
66
  case "end":
@@ -95,6 +106,15 @@ export var MediaNode = /*#__PURE__*/function (_Component) {
95
106
  setNodeSelection(_this.props.view, propPos - 1);
96
107
  }
97
108
  });
109
+ _defineProperty(_this, "getMediaSettings", memoizeOne(function (viewAndUploadMediaClientConfig) {
110
+ return {
111
+ canUpdateVideoCaptions: fg('platform_media_video_captions') ? !!viewAndUploadMediaClientConfig : false
112
+ };
113
+ }));
114
+ _defineProperty(_this, "onError", function (reason) {
115
+ var _this$props$api;
116
+ (_this$props$api = _this.props.api) === null || _this$props$api === void 0 || _this$props$api.media.actions.handleMediaNodeRenderError(_this.props.node, reason);
117
+ });
98
118
  _defineProperty(_this, "onFullscreenChange", function (fullscreen) {
99
119
  var _this$mediaPluginStat;
100
120
  (_this$mediaPluginStat = _this.mediaPluginState) === null || _this$mediaPluginStat === void 0 || _this$mediaPluginStat.updateAndDispatch({
@@ -108,8 +128,18 @@ export var MediaNode = /*#__PURE__*/function (_Component) {
108
128
  return _this.props.getPos();
109
129
  });
110
130
  });
111
- var view = _this.props.view;
131
+ var _this$props = _this.props,
132
+ view = _this$props.view,
133
+ syncProvider = _this$props.syncProvider;
112
134
  _this.mediaPluginState = mediaStateKey.getState(view.state);
135
+
136
+ // Initialize state from syncProvider (available on both server and client for SSR)
137
+ if (expValEquals('platform_editor_media_vc_fixes', 'isEnabled', true) && syncProvider) {
138
+ _this.state = {
139
+ viewMediaClientConfig: syncProvider.viewMediaClientConfig,
140
+ viewAndUploadMediaClientConfig: syncProvider.viewAndUploadMediaClientConfig
141
+ };
142
+ }
113
143
  return _this;
114
144
  }
115
145
  _inherits(MediaNode, _Component);
@@ -118,7 +148,7 @@ export var MediaNode = /*#__PURE__*/function (_Component) {
118
148
  value: function shouldComponentUpdate(nextProps, nextState) {
119
149
  var hasNewViewMediaClientConfig = !this.state.viewMediaClientConfig && nextState.viewMediaClientConfig;
120
150
  var hasNewViewAndUploadMediaClientConfig = !this.state.viewAndUploadMediaClientConfig && nextState.viewAndUploadMediaClientConfig;
121
- if (this.props.selected !== nextProps.selected || this.props.node.attrs.id !== nextProps.node.attrs.id || this.props.node.attrs.collection !== nextProps.node.attrs.collection || this.props.maxDimensions.height !== nextProps.maxDimensions.height || this.props.maxDimensions.width !== nextProps.maxDimensions.width || this.props.contextIdentifierProvider !== nextProps.contextIdentifierProvider || this.props.isLoading !== nextProps.isLoading || this.props.mediaProvider !== nextProps.mediaProvider || hasNewViewMediaClientConfig || hasNewViewAndUploadMediaClientConfig) {
151
+ if (this.props.selected !== nextProps.selected || this.props.node.attrs.id !== nextProps.node.attrs.id || this.props.node.attrs.collection !== nextProps.node.attrs.collection || this.props.maxDimensions.height !== nextProps.maxDimensions.height || this.props.maxDimensions.width !== nextProps.maxDimensions.width || this.props.contextIdentifierProvider !== nextProps.contextIdentifierProvider || this.props.isLoading !== nextProps.isLoading || this.props.mediaProvider !== nextProps.mediaProvider || expValEquals('platform_editor_media_vc_fixes', 'isEnabled', true) && this.props.syncProvider !== nextProps.syncProvider || hasNewViewMediaClientConfig || hasNewViewAndUploadMediaClientConfig) {
122
152
  return true;
123
153
  }
124
154
  return false;
@@ -232,14 +262,13 @@ export var MediaNode = /*#__PURE__*/function (_Component) {
232
262
  }, {
233
263
  key: "render",
234
264
  value: function render() {
235
- var _this$props = this.props,
236
- node = _this$props.node,
237
- selected = _this$props.selected,
238
- originalDimensions = _this$props.originalDimensions,
239
- isLoading = _this$props.isLoading,
240
- maxDimensions = _this$props.maxDimensions,
241
- mediaOptions = _this$props.mediaOptions,
242
- api = _this$props.api;
265
+ var _this$props2 = this.props,
266
+ node = _this$props2.node,
267
+ selected = _this$props2.selected,
268
+ originalDimensions = _this$props2.originalDimensions,
269
+ isLoading = _this$props2.isLoading,
270
+ maxDimensions = _this$props2.maxDimensions,
271
+ mediaOptions = _this$props2.mediaOptions;
243
272
  var borderMark = node.marks.find(function (m) {
244
273
  return m.type.name === 'border';
245
274
  });
@@ -253,6 +282,8 @@ export var MediaNode = /*#__PURE__*/function (_Component) {
253
282
  collection = _node$attrs.collection,
254
283
  url = _node$attrs.url,
255
284
  alt = _node$attrs.alt;
285
+
286
+ // Check if we have any media client config available (syncProvider, state, or upload config)
256
287
  var hasNoMediaClientConfig = !viewMediaClientConfig && (fg('platform_media_video_captions') ? !viewAndUploadMediaClientConfig : true);
257
288
  if (isLoading || type !== 'external' && hasNoMediaClientConfig) {
258
289
  if (expValEquals('platform_editor_media_vc_fixes', 'isEnabled', true)) {
@@ -324,12 +355,8 @@ export var MediaNode = /*#__PURE__*/function (_Component) {
324
355
  alt: alt,
325
356
  videoControlsWrapperRef: this.videoControlsWrapperRef,
326
357
  ssr: ssr,
327
- mediaSettings: {
328
- canUpdateVideoCaptions: fg('platform_media_video_captions') ? !!viewAndUploadMediaClientConfig : false
329
- },
330
- onError: expValEquals('platform_editor_media_error_analytics', 'isEnabled', true) ? function (reason) {
331
- return api === null || api === void 0 ? void 0 : api.media.actions.handleMediaNodeRenderError(node, reason);
332
- } : undefined
358
+ mediaSettings: this.getMediaSettings(viewAndUploadMediaClientConfig),
359
+ onError: expValEquals('platform_editor_media_error_analytics', 'isEnabled', true) ? this.onError : undefined
333
360
  })));
334
361
  }
335
362
  }]);
@@ -35,6 +35,7 @@ declare class MediaNodeView extends SelectionBasedNodeView<MediaNodeViewProps> {
35
35
  width: string;
36
36
  height: string;
37
37
  };
38
+ getMediaProviderToUse: (mediaOptions: MediaOptions, mediaProvider?: Promise<MediaProvider>) => Promise<MediaProvider> | undefined;
38
39
  renderMediaNodeWithState: (contextIdentifierProvider?: Promise<ContextIdentifierProvider>) => ({ mediaProvider, interactionState, }: MediaNodeWithPluginStateComponentProps) => React.JSX.Element;
39
40
  renderMediaNodeWithProviders: ({ contextIdentifierProvider }: Providers) => React.JSX.Element;
40
41
  render(): React.JSX.Element;
@@ -25,6 +25,7 @@ export interface MediaNodeProps extends ReactNodeProps, ImageLoaderProps {
25
25
  onClick?: CardOnClickCallback;
26
26
  originalDimensions: NumericalCardDimensions;
27
27
  pluginInjectionApi: ExtractInjectionAPI<MediaNextEditorPluginType> | undefined;
28
+ syncProvider?: MediaProvider;
28
29
  view: EditorView;
29
30
  }
30
31
  interface MediaNodeState {
@@ -46,6 +47,8 @@ export declare class MediaNode extends Component<MediaNodeProps, MediaNodeState>
46
47
  private setViewMediaClientConfig;
47
48
  private selectMediaSingleFromCard;
48
49
  private selectMediaSingle;
50
+ private getMediaSettings;
51
+ private onError;
49
52
  render(): React.JSX.Element;
50
53
  private onFullscreenChange;
51
54
  private handleNewNode;
@@ -35,6 +35,7 @@ declare class MediaNodeView extends SelectionBasedNodeView<MediaNodeViewProps> {
35
35
  width: string;
36
36
  height: string;
37
37
  };
38
+ getMediaProviderToUse: (mediaOptions: MediaOptions, mediaProvider?: Promise<MediaProvider>) => Promise<MediaProvider> | undefined;
38
39
  renderMediaNodeWithState: (contextIdentifierProvider?: Promise<ContextIdentifierProvider>) => ({ mediaProvider, interactionState, }: MediaNodeWithPluginStateComponentProps) => React.JSX.Element;
39
40
  renderMediaNodeWithProviders: ({ contextIdentifierProvider }: Providers) => React.JSX.Element;
40
41
  render(): React.JSX.Element;
@@ -25,6 +25,7 @@ export interface MediaNodeProps extends ReactNodeProps, ImageLoaderProps {
25
25
  onClick?: CardOnClickCallback;
26
26
  originalDimensions: NumericalCardDimensions;
27
27
  pluginInjectionApi: ExtractInjectionAPI<MediaNextEditorPluginType> | undefined;
28
+ syncProvider?: MediaProvider;
28
29
  view: EditorView;
29
30
  }
30
31
  interface MediaNodeState {
@@ -46,6 +47,8 @@ export declare class MediaNode extends Component<MediaNodeProps, MediaNodeState>
46
47
  private setViewMediaClientConfig;
47
48
  private selectMediaSingleFromCard;
48
49
  private selectMediaSingle;
50
+ private getMediaSettings;
51
+ private onError;
49
52
  render(): React.JSX.Element;
50
53
  private onFullscreenChange;
51
54
  private handleNewNode;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/editor-plugin-media",
3
- "version": "9.4.1",
3
+ "version": "9.4.2",
4
4
  "description": "Media plugin for @atlaskit/editor-core",
5
5
  "author": "Atlassian Pty Ltd",
6
6
  "license": "Apache-2.0",
@@ -66,7 +66,7 @@
66
66
  "@atlaskit/primitives": "^17.1.0",
67
67
  "@atlaskit/textfield": "^8.2.0",
68
68
  "@atlaskit/theme": "^21.0.0",
69
- "@atlaskit/tmp-editor-statsig": "^16.23.0",
69
+ "@atlaskit/tmp-editor-statsig": "^16.25.0",
70
70
  "@atlaskit/tokens": "^10.0.0",
71
71
  "@atlaskit/tooltip": "^20.14.0",
72
72
  "@babel/runtime": "^7.0.0",