@atlaskit/media-card 71.0.0 → 72.0.0

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.
Files changed (110) hide show
  1. package/CHANGELOG.md +18 -0
  2. package/dist/cjs/errors.js +56 -5
  3. package/dist/cjs/files/cardImageView/index.js +53 -104
  4. package/dist/cjs/files/index.js +0 -6
  5. package/dist/cjs/root/card/cardAnalytics.js +3 -15
  6. package/dist/cjs/root/card/cardSSRView.js +4 -2
  7. package/dist/cjs/root/card/cardState.js +50 -0
  8. package/dist/cjs/root/card/getCardPreview/cache.js +5 -0
  9. package/dist/cjs/root/card/getCardPreview/filePreviewStatus.js +50 -0
  10. package/dist/cjs/root/card/getCardPreview/helpers.js +13 -21
  11. package/dist/cjs/root/card/getCardPreview/index.js +91 -94
  12. package/dist/cjs/root/card/getCardStatus.js +7 -1
  13. package/dist/cjs/root/card/index.js +271 -266
  14. package/dist/cjs/root/cardView.js +96 -60
  15. package/dist/cjs/root/inline/loader.js +2 -1
  16. package/dist/cjs/root/inline/mediaInlineCard.js +4 -3
  17. package/dist/cjs/root/ui/iconMessage/index.js +12 -5
  18. package/dist/cjs/root/ui/imageRenderer/imageRenderer.js +30 -124
  19. package/dist/cjs/root/ui/titleBox/failedTitleBox.js +7 -3
  20. package/dist/cjs/utils/analytics.js +6 -44
  21. package/dist/cjs/utils/dimensionComparer.js +1 -1
  22. package/dist/cjs/utils/metadata.js +11 -3
  23. package/dist/cjs/utils/objectURLCache.js +6 -0
  24. package/dist/cjs/utils/shouldDisplayImageThumbnail.js +1 -1
  25. package/dist/cjs/version.json +1 -1
  26. package/dist/es2019/errors.js +34 -2
  27. package/dist/es2019/files/cardImageView/index.js +8 -61
  28. package/dist/es2019/files/index.js +1 -1
  29. package/dist/es2019/root/card/cardAnalytics.js +3 -14
  30. package/dist/es2019/root/card/cardSSRView.js +3 -2
  31. package/dist/es2019/root/card/cardState.js +26 -0
  32. package/dist/es2019/root/card/getCardPreview/cache.js +5 -0
  33. package/dist/es2019/root/card/getCardPreview/filePreviewStatus.js +35 -0
  34. package/dist/es2019/root/card/getCardPreview/helpers.js +2 -12
  35. package/dist/es2019/root/card/getCardPreview/index.js +71 -74
  36. package/dist/es2019/root/card/getCardStatus.js +1 -0
  37. package/dist/es2019/root/card/index.js +193 -171
  38. package/dist/es2019/root/cardView.js +100 -61
  39. package/dist/es2019/root/inline/loader.js +2 -1
  40. package/dist/es2019/root/inline/mediaInlineCard.js +4 -3
  41. package/dist/es2019/root/ui/iconMessage/index.js +5 -3
  42. package/dist/es2019/root/ui/imageRenderer/imageRenderer.js +21 -88
  43. package/dist/es2019/root/ui/titleBox/failedTitleBox.js +5 -3
  44. package/dist/es2019/utils/analytics.js +5 -34
  45. package/dist/es2019/utils/dimensionComparer.js +1 -1
  46. package/dist/es2019/utils/metadata.js +12 -4
  47. package/dist/es2019/utils/objectURLCache.js +5 -0
  48. package/dist/es2019/utils/shouldDisplayImageThumbnail.js +1 -1
  49. package/dist/es2019/version.json +1 -1
  50. package/dist/esm/errors.js +42 -1
  51. package/dist/esm/files/cardImageView/index.js +51 -102
  52. package/dist/esm/files/index.js +1 -1
  53. package/dist/esm/root/card/cardAnalytics.js +3 -15
  54. package/dist/esm/root/card/cardSSRView.js +3 -2
  55. package/dist/esm/root/card/cardState.js +32 -0
  56. package/dist/esm/root/card/getCardPreview/cache.js +6 -0
  57. package/dist/esm/root/card/getCardPreview/filePreviewStatus.js +35 -0
  58. package/dist/esm/root/card/getCardPreview/helpers.js +13 -21
  59. package/dist/esm/root/card/getCardPreview/index.js +79 -88
  60. package/dist/esm/root/card/getCardStatus.js +3 -0
  61. package/dist/esm/root/card/index.js +278 -268
  62. package/dist/esm/root/cardView.js +98 -61
  63. package/dist/esm/root/inline/loader.js +2 -1
  64. package/dist/esm/root/inline/mediaInlineCard.js +4 -3
  65. package/dist/esm/root/ui/iconMessage/index.js +7 -3
  66. package/dist/esm/root/ui/imageRenderer/imageRenderer.js +23 -118
  67. package/dist/esm/root/ui/titleBox/failedTitleBox.js +6 -3
  68. package/dist/esm/utils/analytics.js +5 -36
  69. package/dist/esm/utils/dimensionComparer.js +1 -1
  70. package/dist/esm/utils/metadata.js +12 -4
  71. package/dist/esm/utils/objectURLCache.js +6 -0
  72. package/dist/esm/utils/shouldDisplayImageThumbnail.js +1 -1
  73. package/dist/esm/version.json +1 -1
  74. package/dist/types/errors.d.ts +9 -1
  75. package/dist/types/files/cardImageView/index.d.ts +4 -13
  76. package/dist/types/files/cardImageView/styled.d.ts +1 -1
  77. package/dist/types/files/index.d.ts +1 -1
  78. package/dist/types/index.d.ts +4 -3
  79. package/dist/types/root/card/cardAnalytics.d.ts +1 -6
  80. package/dist/types/root/card/cardSSRView.d.ts +1 -1
  81. package/dist/types/root/card/cardState.d.ts +5 -0
  82. package/dist/types/root/card/getCardPreview/cache.d.ts +3 -1
  83. package/dist/types/root/card/getCardPreview/filePreviewStatus.d.ts +5 -0
  84. package/dist/types/root/card/getCardPreview/helpers.d.ts +3 -4
  85. package/dist/types/root/card/getCardPreview/index.d.ts +17 -13
  86. package/dist/types/root/card/getCardStatus.d.ts +1 -0
  87. package/dist/types/root/card/index.d.ts +11 -10
  88. package/dist/types/root/cardView.d.ts +11 -8
  89. package/dist/types/root/inlinePlayer.d.ts +1 -1
  90. package/dist/types/root/ui/iconMessage/index.d.ts +2 -1
  91. package/dist/types/root/ui/imageRenderer/imageRenderer.d.ts +2 -13
  92. package/dist/types/root/ui/styledSSR.d.ts +1 -1
  93. package/dist/types/root/ui/titleBox/failedTitleBox.d.ts +2 -0
  94. package/dist/types/styles/mixins.d.ts +1 -1
  95. package/dist/types/types.d.ts +7 -1
  96. package/dist/types/utils/analytics.d.ts +6 -15
  97. package/dist/types/utils/cardDimensions.d.ts +4 -4
  98. package/dist/types/utils/dimensionComparer.d.ts +1 -1
  99. package/dist/types/utils/metadata.d.ts +2 -2
  100. package/dist/types/utils/objectURLCache.d.ts +2 -1
  101. package/example-helpers/index.tsx +21 -0
  102. package/package.json +6 -5
  103. package/dist/cjs/root/card/getCardPreview/types.js +0 -5
  104. package/dist/cjs/utils/fileAttributesContext.js +0 -40
  105. package/dist/es2019/root/card/getCardPreview/types.js +0 -1
  106. package/dist/es2019/utils/fileAttributesContext.js +0 -19
  107. package/dist/esm/root/card/getCardPreview/types.js +0 -1
  108. package/dist/esm/utils/fileAttributesContext.js +0 -18
  109. package/dist/types/root/card/getCardPreview/types.d.ts +0 -5
  110. package/dist/types/utils/fileAttributesContext.d.ts +0 -10
@@ -57,22 +57,18 @@ var _getCardPreview = require("./getCardPreview");
57
57
 
58
58
  var _metadata = require("../../utils/metadata");
59
59
 
60
- var _dimensionComparer = require("../../utils/dimensionComparer");
61
-
62
- var _getCardStatus = require("./getCardStatus");
63
-
64
60
  var _inlinePlayer = require("../inlinePlayer");
65
61
 
66
62
  var _analytics = require("../../utils/analytics");
67
63
 
68
- var _fileAttributesContext = require("../../utils/fileAttributesContext");
69
-
70
64
  var _errors = require("../../errors");
71
65
 
72
66
  var _cardAnalytics = require("./cardAnalytics");
73
67
 
74
68
  var _document = _interopRequireDefault(require("../../utils/document"));
75
69
 
70
+ var _cardState = require("./cardState");
71
+
76
72
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
77
73
 
78
74
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
@@ -99,69 +95,151 @@ var CardBase = /*#__PURE__*/function (_Component) {
99
95
  _this = _super.call(this, props);
100
96
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "hasBeenMounted", false);
101
97
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "timeElapsedTillCommenced", performance.now());
102
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "shouldRefetchImage", function (current, next) {
103
- if (!current || !next) {
104
- return false;
105
- }
106
-
107
- return (0, _dimensionComparer.isBigger)(current, next);
108
- });
109
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "isLatestCardStatusUpdate", function (cardStatusUpdateTimestamp) {
110
- return !_this.lastCardStatusUpdateTimestamp || _this.lastCardStatusUpdateTimestamp <= cardStatusUpdateTimestamp;
111
- });
112
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onLocalPreviewError", function (error) {// TODO: track local preview success rate
113
- // https://product-fabric.atlassian.net/browse/MEX-774
98
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "getImageURLParams", function (_ref) {
99
+ var collection = _ref.collectionName;
100
+ return _objectSpread(_objectSpread({
101
+ collection: collection,
102
+ mode: (0, _mediaClient.imageResizeModeToFileImageMode)(_this.props.resizeMode)
103
+ }, _this.requestedDimensions), {}, {
104
+ allowAnimated: true
105
+ });
114
106
  });
115
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "createAddContextToDataURI", function (fileId, fileState, _ref, collectionName) {
116
- var width = _ref.width,
117
- height = _ref.height;
118
- return function (dataURI) {
119
- var _this$props = _this.props,
120
- contextId = _this$props.contextId,
121
- alt = _this$props.alt;
122
-
123
- if (!contextId) {
124
- return dataURI;
125
- }
126
-
127
- var metadata = (0, _metadata.getFileDetails)(fileState);
128
- return (0, _mediaClient.addFileAttrsToUrl)(dataURI, {
129
- id: fileId,
130
- collection: collectionName,
131
- contextId: contextId,
132
- mimeType: metadata.mimeType,
133
- name: metadata.name,
134
- size: metadata.size,
135
- width: width,
136
- height: height,
137
- alt: alt
138
- });
139
- };
107
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "getMediaBlobUrlAttrs", function (identifier, fileState) {
108
+ var id = identifier.id,
109
+ collection = identifier.collectionName;
110
+ var _this$props = _this.props,
111
+ originalDimensions = _this$props.originalDimensions,
112
+ contextId = _this$props.contextId,
113
+ alt = _this$props.alt;
114
+
115
+ var _getFileDetails = (0, _metadata.getFileDetails)(identifier, fileState),
116
+ mimeType = _getFileDetails.mimeType,
117
+ name = _getFileDetails.name,
118
+ size = _getFileDetails.size;
119
+
120
+ return contextId ? _objectSpread(_objectSpread({
121
+ id: id,
122
+ collection: collection,
123
+ contextId: contextId,
124
+ mimeType: mimeType,
125
+ name: name,
126
+ size: size
127
+ }, originalDimensions || _this.requestedDimensions), {}, {
128
+ alt: alt
129
+ }) : undefined;
140
130
  });
141
- (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "getCardPreviewParams", function (id, collectionName, fileState) {
131
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "getCardPreviewParams", function (identifier, fileState) {
132
+ var isBannedLocalPreview = _this.state.isBannedLocalPreview;
133
+ var id = identifier.id;
142
134
  var _this$props2 = _this.props,
143
135
  _this$props2$dimensio = _this$props2.dimensions,
144
136
  dimensions = _this$props2$dimensio === void 0 ? {} : _this$props2$dimensio,
145
- originalDimensions = _this$props2.originalDimensions,
146
- resizeMode = _this$props2.resizeMode,
147
137
  mediaClient = _this$props2.mediaClient;
148
- var cardRef = _this.state.cardRef;
149
- var requestedDimensions = (0, _getDataURIDimension.getRequestedDimensions)({
150
- dimensions: dimensions,
151
- element: cardRef
152
- });
153
138
  return {
154
139
  mediaClient: mediaClient,
155
140
  id: id,
156
- collectionName: collectionName,
157
141
  dimensions: dimensions,
158
- resizeMode: resizeMode,
159
- requestedDimensions: requestedDimensions,
160
- onLocalPreviewError: _this.onLocalPreviewError,
161
- filePreview: (0, _getCardPreview.getFilePreviewFromFileState)(fileState),
142
+ onLocalPreviewError: _this.fireLocalPreviewErrorEvent,
143
+ filePreview: isBannedLocalPreview ? undefined : (0, _getCardPreview.getFilePreviewFromFileState)(fileState),
162
144
  isRemotePreviewReady: (0, _mediaClient.isImageRepresentationReady)(fileState),
163
- addContextToDataURI: _this.createAddContextToDataURI(id, fileState, originalDimensions || requestedDimensions, collectionName)
145
+ imageUrlParams: _this.getImageURLParams(identifier),
146
+ mediaBlobUrlAttrs: _this.getMediaBlobUrlAttrs(identifier, fileState)
147
+ };
148
+ });
149
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "resolvePreview", /*#__PURE__*/function () {
150
+ var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(identifier, fileState) {
151
+ var params, cardPreview, wrappedError;
152
+ return _regenerator.default.wrap(function _callee$(_context) {
153
+ while (1) {
154
+ switch (_context.prev = _context.next) {
155
+ case 0:
156
+ _context.prev = 0;
157
+ params = _this.getCardPreviewParams(identifier, fileState);
158
+ _context.next = 4;
159
+ return (0, _getCardPreview.getCardPreview)(params);
160
+
161
+ case 4:
162
+ cardPreview = _context.sent;
163
+
164
+ _this.safeSetState({
165
+ cardPreview: cardPreview
166
+ });
167
+
168
+ _context.next = 12;
169
+ break;
170
+
171
+ case 8:
172
+ _context.prev = 8;
173
+ _context.t0 = _context["catch"](0);
174
+ wrappedError = (0, _errors.ensureMediaCardError)('preview-fetch', _context.t0); // If remote preview fails, we set status 'error'
175
+ // If local preview fails (i.e, no remote preview available),
176
+ // we can stay in the same status until there is a remote preview available
177
+ // If it's any other error we set status 'error'
178
+
179
+ if ((0, _errors.isLocalPreviewError)(wrappedError)) {
180
+ _this.safeSetState({
181
+ isBannedLocalPreview: true
182
+ });
183
+ } else {
184
+ _this.safeSetState({
185
+ status: 'error',
186
+ error: wrappedError
187
+ });
188
+ }
189
+
190
+ case 12:
191
+ case "end":
192
+ return _context.stop();
193
+ }
194
+ }
195
+ }, _callee, null, [[0, 8]]);
196
+ }));
197
+
198
+ return function (_x, _x2) {
199
+ return _ref2.apply(this, arguments);
164
200
  };
201
+ }());
202
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "getPerformanceAttributes", function () {
203
+ var _assertThisInitialize = (0, _assertThisInitialized2.default)(_this),
204
+ timeElapsedTillCommenced = _assertThisInitialize.timeElapsedTillCommenced;
205
+
206
+ var timeElapsedTillEvent = performance.now();
207
+ var durationSinceCommenced = timeElapsedTillCommenced && timeElapsedTillEvent - timeElapsedTillCommenced;
208
+ return {
209
+ overall: {
210
+ durationSincePageStart: timeElapsedTillEvent,
211
+ durationSinceCommenced: durationSinceCommenced
212
+ }
213
+ };
214
+ });
215
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onImageError", function () {
216
+ var cardPreview = _this.state.cardPreview;
217
+ var error = new _errors.ImageLoadError(cardPreview === null || cardPreview === void 0 ? void 0 : cardPreview.source);
218
+
219
+ if (cardPreview !== null && cardPreview !== void 0 && cardPreview.source && ['local', 'cache-local'].includes(cardPreview.source)) {
220
+ var _this$props3 = _this.props,
221
+ identifier = _this$props3.identifier,
222
+ _this$props3$dimensio = _this$props3.dimensions,
223
+ dimensions = _this$props3$dimensio === void 0 ? {} : _this$props3$dimensio;
224
+ (0, _mediaClient.isFileIdentifier)(identifier) && (0, _getCardPreview.removeCardPreviewFromCache)(identifier.id, dimensions);
225
+
226
+ _this.safeSetState({
227
+ cardPreview: undefined,
228
+ isBannedLocalPreview: true
229
+ });
230
+
231
+ _this.fireLocalPreviewErrorEvent(error);
232
+ } else {
233
+ _this.safeSetState({
234
+ status: 'error',
235
+ error: error
236
+ });
237
+ }
238
+ });
239
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onImageLoad", function () {
240
+ _this.safeSetState({
241
+ previewDidRender: true
242
+ });
165
243
  });
166
244
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "fireCopiedEvent", function () {
167
245
  var createAnalyticsEvent = _this.props.createAnalyticsEvent;
@@ -172,9 +250,17 @@ var CardBase = /*#__PURE__*/function (_Component) {
172
250
  var createAnalyticsEvent = _this.props.createAnalyticsEvent;
173
251
  createAnalyticsEvent && (0, _cardAnalytics.fireScreenEvent)(createAnalyticsEvent, _this.fileAttributes);
174
252
  });
253
+ (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "fireLocalPreviewErrorEvent", function (error) {// TODO: track local preview success rate
254
+ // https://product-fabric.atlassian.net/browse/MEX-774
255
+ });
175
256
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "safeSetState", function (state) {
176
257
  if (_this.hasBeenMounted) {
177
- _this.setState(state);
258
+ // If it's setting the status, we need to use a state updater function,
259
+ // which ensures that no non-final status overrides a final status.
260
+ // If no status is set, we don't need a sate updater
261
+ var updater = !!state.status ? (0, _cardState.createStateUpdater)(state) : state;
262
+
263
+ _this.setState(updater);
178
264
  }
179
265
  });
180
266
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "unsubscribe", function () {
@@ -183,20 +269,21 @@ var CardBase = /*#__PURE__*/function (_Component) {
183
269
  }
184
270
 
185
271
  if (_this.hasBeenMounted) {
272
+ // TODO MEX-788: add test for "do not remove the card preview when unsubscribing".
186
273
  _this.setState({
187
- cardPreview: undefined
274
+ isBannedLocalPreview: false
188
275
  });
189
276
  }
190
277
  });
191
278
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onCardViewClick", function (event, analyticsEvent) {
192
- var _this$props3 = _this.props,
193
- identifier = _this$props3.identifier,
194
- useInlinePlayer = _this$props3.useInlinePlayer,
195
- shouldOpenMediaViewer = _this$props3.shouldOpenMediaViewer;
279
+ var _this$props4 = _this.props,
280
+ identifier = _this$props4.identifier,
281
+ useInlinePlayer = _this$props4.useInlinePlayer,
282
+ shouldOpenMediaViewer = _this$props4.shouldOpenMediaViewer;
196
283
  var cardPreview = _this.state.cardPreview;
197
284
 
198
- var _assertThisInitialize = (0, _assertThisInitialized2.default)(_this),
199
- metadata = _assertThisInitialize.metadata;
285
+ var _assertThisInitialize2 = (0, _assertThisInitialized2.default)(_this),
286
+ metadata = _assertThisInitialize2.metadata;
200
287
 
201
288
  _this.onClick(event, analyticsEvent);
202
289
 
@@ -244,13 +331,13 @@ var CardBase = /*#__PURE__*/function (_Component) {
244
331
  });
245
332
  });
246
333
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "renderInlinePlayer", function () {
247
- var _this$props4 = _this.props,
248
- identifier = _this$props4.identifier,
249
- mediaClient = _this$props4.mediaClient,
250
- dimensions = _this$props4.dimensions,
251
- selected = _this$props4.selected,
252
- testId = _this$props4.testId,
253
- originalDimensions = _this$props4.originalDimensions;
334
+ var _this$props5 = _this.props,
335
+ identifier = _this$props5.identifier,
336
+ mediaClient = _this$props5.mediaClient,
337
+ dimensions = _this$props5.dimensions,
338
+ selected = _this$props5.selected,
339
+ testId = _this$props5.testId,
340
+ originalDimensions = _this$props5.originalDimensions;
254
341
  return /*#__PURE__*/_react.default.createElement(_inlinePlayer.InlinePlayer, {
255
342
  mediaClient: mediaClient,
256
343
  dimensions: dimensions,
@@ -290,12 +377,12 @@ var CardBase = /*#__PURE__*/function (_Component) {
290
377
  });
291
378
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "renderMediaViewer", function () {
292
379
  var mediaViewerSelectedItem = _this.state.mediaViewerSelectedItem;
293
- var _this$props5 = _this.props,
294
- mediaClient = _this$props5.mediaClient,
295
- identifier = _this$props5.identifier,
296
- mediaViewerDataSource = _this$props5.mediaViewerDataSource,
297
- contextId = _this$props5.contextId,
298
- featureFlags = _this$props5.featureFlags;
380
+ var _this$props6 = _this.props,
381
+ mediaClient = _this$props6.mediaClient,
382
+ identifier = _this$props6.identifier,
383
+ mediaViewerDataSource = _this$props6.mediaViewerDataSource,
384
+ contextId = _this$props6.contextId,
385
+ featureFlags = _this$props6.featureFlags;
299
386
 
300
387
  if (!mediaViewerSelectedItem) {
301
388
  return;
@@ -316,20 +403,20 @@ var CardBase = /*#__PURE__*/function (_Component) {
316
403
  }), document.body);
317
404
  });
318
405
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "renderCard", function () {
319
- var _this$props6 = _this.props,
320
- identifier = _this$props6.identifier,
321
- isLazy = _this$props6.isLazy,
322
- appearance = _this$props6.appearance,
323
- resizeMode = _this$props6.resizeMode,
324
- dimensions = _this$props6.dimensions,
325
- selectable = _this$props6.selectable,
326
- selected = _this$props6.selected,
327
- disableOverlay = _this$props6.disableOverlay,
328
- alt = _this$props6.alt,
329
- testId = _this$props6.testId,
330
- featureFlags = _this$props6.featureFlags,
331
- titleBoxBgColor = _this$props6.titleBoxBgColor,
332
- titleBoxIcon = _this$props6.titleBoxIcon;
406
+ var _this$props7 = _this.props,
407
+ identifier = _this$props7.identifier,
408
+ isLazy = _this$props7.isLazy,
409
+ appearance = _this$props7.appearance,
410
+ resizeMode = _this$props7.resizeMode,
411
+ dimensions = _this$props7.dimensions,
412
+ selectable = _this$props7.selectable,
413
+ selected = _this$props7.selected,
414
+ disableOverlay = _this$props7.disableOverlay,
415
+ alt = _this$props7.alt,
416
+ testId = _this$props7.testId,
417
+ featureFlags = _this$props7.featureFlags,
418
+ titleBoxBgColor = _this$props7.titleBoxBgColor,
419
+ titleBoxIcon = _this$props7.titleBoxIcon;
333
420
  var mediaItemType = identifier.mediaItemType;
334
421
  var _this$state = _this.state,
335
422
  status = _this$state.status,
@@ -344,19 +431,18 @@ var CardBase = /*#__PURE__*/function (_Component) {
344
431
  error = _this$state.error,
345
432
  cardRef = _this$state.cardRef;
346
433
 
347
- var _assertThisInitialize2 = (0, _assertThisInitialized2.default)(_this),
348
- metadata = _assertThisInitialize2.metadata,
349
- timeElapsedTillCommenced = _assertThisInitialize2.timeElapsedTillCommenced;
350
-
351
434
  var _assertThisInitialize3 = (0, _assertThisInitialized2.default)(_this),
352
- onCardViewClick = _assertThisInitialize3.onCardViewClick,
353
- onDisplayImage = _assertThisInitialize3.onDisplayImage,
354
- actions = _assertThisInitialize3.actions,
355
- onMouseEnter = _assertThisInitialize3.onMouseEnter;
435
+ metadata = _assertThisInitialize3.metadata;
436
+
437
+ var _assertThisInitialize4 = (0, _assertThisInitialized2.default)(_this),
438
+ onCardViewClick = _assertThisInitialize4.onCardViewClick,
439
+ onDisplayImage = _assertThisInitialize4.onDisplayImage,
440
+ actions = _assertThisInitialize4.actions,
441
+ onMouseEnter = _assertThisInitialize4.onMouseEnter;
356
442
 
357
443
  var card = /*#__PURE__*/_react.default.createElement(_cardView.CardView, {
358
444
  status: status,
359
- error: error && error.secondaryError,
445
+ error: error,
360
446
  mediaItemType: mediaItemType,
361
447
  metadata: metadata,
362
448
  dataURI: dataURI,
@@ -378,7 +464,8 @@ var CardBase = /*#__PURE__*/function (_Component) {
378
464
  featureFlags: featureFlags,
379
465
  titleBoxBgColor: titleBoxBgColor,
380
466
  titleBoxIcon: titleBoxIcon,
381
- timeElapsedTillCommenced: timeElapsedTillCommenced
467
+ onImageError: _this.onImageError,
468
+ onImageLoad: _this.onImageLoad
382
469
  });
383
470
 
384
471
  return isLazy ? /*#__PURE__*/_react.default.createElement(_viewportDetector.ViewportDetector, {
@@ -394,8 +481,8 @@ var CardBase = /*#__PURE__*/function (_Component) {
394
481
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onClick", function (event, analyticsEvent) {
395
482
  var onClick = _this.props.onClick;
396
483
 
397
- var _assertThisInitialize4 = (0, _assertThisInitialized2.default)(_this),
398
- metadata = _assertThisInitialize4.metadata;
484
+ var _assertThisInitialize5 = (0, _assertThisInitialized2.default)(_this),
485
+ metadata = _assertThisInitialize5.metadata;
399
486
 
400
487
  if (onClick) {
401
488
  var cardEvent = {
@@ -408,8 +495,8 @@ var CardBase = /*#__PURE__*/function (_Component) {
408
495
  (0, _defineProperty2.default)((0, _assertThisInitialized2.default)(_this), "onMouseEnter", function (event) {
409
496
  var onMouseEnter = _this.props.onMouseEnter;
410
497
 
411
- var _assertThisInitialize5 = (0, _assertThisInitialized2.default)(_this),
412
- metadata = _assertThisInitialize5.metadata;
498
+ var _assertThisInitialize6 = (0, _assertThisInitialized2.default)(_this),
499
+ metadata = _assertThisInitialize6.metadata;
413
500
 
414
501
  if (onMouseEnter) {
415
502
  var cardEvent = {
@@ -423,10 +510,10 @@ var CardBase = /*#__PURE__*/function (_Component) {
423
510
 
424
511
  var _cardPreview;
425
512
 
426
- var _this$props7 = _this.props,
427
- _identifier = _this$props7.identifier,
428
- _this$props7$dimensio = _this$props7.dimensions,
429
- _dimensions = _this$props7$dimensio === void 0 ? {} : _this$props7$dimensio;
513
+ var _this$props8 = _this.props,
514
+ _identifier = _this$props8.identifier,
515
+ _this$props8$dimensio = _this$props8.dimensions,
516
+ _dimensions = _this$props8$dimensio === void 0 ? {} : _this$props8$dimensio;
430
517
 
431
518
  if ((0, _mediaClient.isFileIdentifier)(_identifier)) {
432
519
  var id = _identifier.id;
@@ -434,18 +521,15 @@ var CardBase = /*#__PURE__*/function (_Component) {
434
521
  } else if ((0, _mediaClient.isExternalImageIdentifier)(_identifier)) {
435
522
  _this.fireCommencedEvent();
436
523
 
437
- _status = 'complete';
524
+ _status = 'loading-preview';
438
525
  var dataURI = _identifier.dataURI;
439
526
  _cardPreview = {
440
527
  dataURI: dataURI,
441
528
  orientation: 1,
442
529
  source: 'external'
443
530
  };
444
- }
445
- /**
446
- * If cardPreview is available from local cache, `isCardVisible`
447
- * should be true to avoid flickers during re-mount of the component
448
- */
531
+ } // If cardPreview is available from local cache, `isCardVisible`
532
+ // should be true to avoid flickers during re-mount of the component
449
533
 
450
534
 
451
535
  var isCardVisible = _cardPreview ? true : !_this.props.isLazy;
@@ -454,7 +538,9 @@ var CardBase = /*#__PURE__*/function (_Component) {
454
538
  isCardVisible: isCardVisible,
455
539
  isPlayingFile: false,
456
540
  cardPreview: _cardPreview,
457
- cardRef: null
541
+ cardRef: null,
542
+ isBannedLocalPreview: false,
543
+ previewDidRender: false
458
544
  };
459
545
  return _this;
460
546
  }
@@ -483,21 +569,27 @@ var CardBase = /*#__PURE__*/function (_Component) {
483
569
  prevIdentifier = prevProps.identifier,
484
570
  prevDimensions = prevProps.dimensions;
485
571
  var prevIsCardVisible = prevState.isCardVisible;
486
- var _this$props8 = this.props,
487
- mediaClient = _this$props8.mediaClient,
488
- identifier = _this$props8.identifier,
489
- dimensions = _this$props8.dimensions;
572
+ var _this$props9 = this.props,
573
+ mediaClient = _this$props9.mediaClient,
574
+ identifier = _this$props9.identifier,
575
+ dimensions = _this$props9.dimensions,
576
+ featureFlags = _this$props9.featureFlags;
490
577
  var _this$state2 = this.state,
491
578
  isCardVisible = _this$state2.isCardVisible,
492
- cardPreview = _this$state2.cardPreview;
579
+ cardPreview = _this$state2.cardPreview,
580
+ status = _this$state2.status,
581
+ fileState = _this$state2.fileState,
582
+ isBannedLocalPreview = _this$state2.isBannedLocalPreview,
583
+ previewDidRender = _this$state2.previewDidRender;
493
584
  var isDifferent = (0, _mediaClient.isDifferentIdentifier)(prevIdentifier, identifier);
494
585
  var turnedVisible = !prevIsCardVisible && isCardVisible;
586
+ var isNewMediaClient = prevMediaClient !== mediaClient;
495
587
 
496
588
  if ((0, _mediaClient.isExternalImageIdentifier)(identifier) && isDifferent) {
497
589
  this.fireCommencedEvent();
498
590
  var dataURI = identifier.dataURI;
499
591
  this.setState({
500
- status: 'complete',
592
+ status: 'loading-preview',
501
593
  cardPreview: {
502
594
  dataURI: dataURI,
503
595
  orientation: 1,
@@ -507,8 +599,7 @@ var CardBase = /*#__PURE__*/function (_Component) {
507
599
  });
508
600
  }
509
601
 
510
- if ((0, _mediaClient.isFileIdentifier)(identifier) && (turnedVisible || prevMediaClient !== mediaClient || isDifferent || // TODO: should not resubscribe on resize. Only refetch
511
- this.shouldRefetchImage(prevDimensions, dimensions))) {
602
+ if ((0, _mediaClient.isFileIdentifier)(identifier) && (turnedVisible || !!this.subscription && (isNewMediaClient || isDifferent))) {
512
603
  this.updateStateForIdentifier(identifier);
513
604
  }
514
605
 
@@ -519,6 +610,26 @@ var CardBase = /*#__PURE__*/function (_Component) {
519
610
  this.fireScreenEvent();
520
611
  }
521
612
  }
613
+
614
+ if ((0, _mediaClient.isFileIdentifier)(identifier) && fileState && (0, _getCardPreview.shouldResolvePreview)({
615
+ status: status,
616
+ fileState: fileState,
617
+ dimensions: dimensions,
618
+ prevDimensions: prevDimensions,
619
+ featureFlags: featureFlags,
620
+ hasCardPreview: !!cardPreview,
621
+ isBannedLocalPreview: isBannedLocalPreview
622
+ })) {
623
+ this.resolvePreview(identifier, fileState);
624
+ }
625
+
626
+ if (previewDidRender && // We should't complete if status is uploading
627
+ ['loading', 'loading-preview', 'processing'].includes(status)) {
628
+ this.safeSetState({
629
+ status: 'complete'
630
+ });
631
+ this.unsubscribe();
632
+ }
522
633
  }
523
634
  }, {
524
635
  key: "componentWillUnmount",
@@ -539,6 +650,7 @@ var CardBase = /*#__PURE__*/function (_Component) {
539
650
  var _this2 = this;
540
651
 
541
652
  var mediaClient = this.props.mediaClient;
653
+ var isBannedLocalPreview = this.state.isBannedLocalPreview;
542
654
  var id = identifier.id,
543
655
  collectionName = identifier.collectionName,
544
656
  occurrenceKey = identifier.occurrenceKey;
@@ -547,157 +659,55 @@ var CardBase = /*#__PURE__*/function (_Component) {
547
659
  collectionName: collectionName,
548
660
  occurrenceKey: occurrenceKey
549
661
  }).subscribe({
550
- next: function () {
551
- var _next = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(fileState) {
552
- var thisCardStatusUpdateTimestamp, filePreviewStatus, status, cardPreview, error, wrappedError;
553
- return _regenerator.default.wrap(function _callee$(_context) {
554
- while (1) {
555
- switch (_context.prev = _context.next) {
556
- case 0:
557
- _this2.lastFileState = fileState;
558
- thisCardStatusUpdateTimestamp = (performance || Date).now();
559
- filePreviewStatus = (0, _getCardPreview.extractFilePreviewStatus)(fileState, _this2.props.featureFlags);
560
- status = (0, _getCardStatus.getCardStatus)(fileState.status, filePreviewStatus);
561
-
562
- _this2.safeSetState({
563
- fileState: fileState
564
- });
565
-
566
- if (!(0, _getCardPreview.shouldGetCardPreview)(status, filePreviewStatus)) {
567
- _context.next = 17;
568
- break;
569
- }
570
-
571
- _context.prev = 6;
572
- _context.next = 9;
573
- return (0, _getCardPreview.getCardPreview)(_this2.getCardPreviewParams(id, collectionName, fileState));
574
-
575
- case 9:
576
- cardPreview = _context.sent;
577
-
578
- if (['loading-preview', 'processing'].includes(status)) {
579
- status = 'complete';
580
- }
581
-
582
- _context.next = 17;
583
- break;
584
-
585
- case 13:
586
- _context.prev = 13;
587
- _context.t0 = _context["catch"](6);
588
- wrappedError = (0, _errors.ensureMediaCardError)('preview-fetch', _context.t0); // If remote preview fails, we set status 'error'
589
- // If the local preview fails (i.e, no remote preview available),
590
- // we can stay in the same status until there is a remote preview available
591
-
592
- if ((0, _errors.isRemotePreviewError)(wrappedError)) {
593
- status = 'error';
594
- error = wrappedError;
595
- }
596
-
597
- case 17:
598
- if (_this2.isLatestCardStatusUpdate(thisCardStatusUpdateTimestamp)) {
599
- // These status and progress must not override values representing more recent FileState
600
-
601
- /* next() start some await() delay in next() status & progress update
602
- * ------- ------------------ ------------------------
603
- * |----[1]FileState:uploading------>| |
604
- * | | |
605
- * |----[2]FileState:uploading------>| |
606
- * | | |
607
- * | |----[2]FileState:uploading------>| Update status to `uploading`
608
- * |----[3]FileState:processing----->| |
609
- * | |----[3]FileState:processing----->| Update status to `complete`
610
- * | | |
611
- * | |----[1]FileState:uploading------>| We do not want to update status to `uploading` again!
612
- *
613
- */
614
- if (status === 'error' && (0, _mediaClient.isErrorFileState)(fileState) && !error) {
615
- error = new _errors.MediaCardError('error-file-state', new Error(fileState.message));
616
- }
617
-
618
- _this2.safeSetState({
619
- status: status,
620
- cardPreview: cardPreview,
621
- progress: status === 'uploading' && fileState.status === 'uploading' ? fileState.progress : 1,
622
- error: status === 'error' && error ? error : undefined
623
- });
624
-
625
- _this2.lastCardStatusUpdateTimestamp = thisCardStatusUpdateTimestamp;
626
- }
627
-
628
- case 18:
629
- case "end":
630
- return _context.stop();
631
- }
632
- }
633
- }, _callee, null, [[6, 13]]);
634
- }));
662
+ next: function next(fileState) {
663
+ var featureFlags = _this2.props.featureFlags;
664
+ var newState = (0, _cardState.getCardStateFromFileState)(fileState, isBannedLocalPreview, featureFlags);
635
665
 
636
- function next(_x) {
637
- return _next.apply(this, arguments);
638
- }
639
-
640
- return next;
641
- }(),
666
+ _this2.safeSetState(newState);
667
+ },
642
668
  error: function error(e) {
643
- // If file state subscription decides that the card is complete
644
- // and later there is an error, we won't change the card's status.
645
- if (_this2.state.status === 'complete') {
646
- return;
647
- }
648
-
649
- var errorReason = _this2.fileAttributes.fileStatus === 'uploading' ? 'upload' : 'metadata-fetch';
669
+ var errorReason = _this2.state.status === 'uploading' ? 'upload' : 'metadata-fetch';
650
670
  var error = new _errors.MediaCardError(errorReason, e);
651
671
 
652
672
  _this2.safeSetState({
653
673
  error: error,
654
674
  status: 'error'
655
675
  });
656
-
657
- _this2.lastCardStatusUpdateTimestamp = (performance || Date).now();
658
676
  }
659
677
  });
660
678
  }
679
+ }, {
680
+ key: "requestedDimensions",
681
+ get: function get() {
682
+ var dimensions = this.props.dimensions;
683
+ var element = this.state.cardRef;
684
+ return (0, _getDataURIDimension.getRequestedDimensions)({
685
+ dimensions: dimensions,
686
+ element: element
687
+ });
688
+ }
661
689
  }, {
662
690
  key: "metadata",
663
691
  get: function get() {
664
- var identifier = this.props.identifier;
665
- return (0, _mediaClient.isFileIdentifier)(identifier) ? this.state.fileState ? (0, _metadata.getFileDetails)(this.state.fileState) : {
666
- id: identifier.id
667
- } : {
668
- id: identifier.mediaItemType,
669
- name: identifier.name || identifier.dataURI,
670
- mediaType: 'image'
671
- };
692
+ var _this$state3;
693
+
694
+ return (0, _metadata.getFileDetails)(this.props.identifier, (_this$state3 = this.state) === null || _this$state3 === void 0 ? void 0 : _this$state3.fileState);
672
695
  }
673
696
  }, {
674
697
  key: "fileAttributes",
675
698
  get: function get() {
676
- var _this$lastFileState;
699
+ var _this$state4, _this$state4$fileStat;
677
700
 
678
- return (0, _analytics.getFileAttributes)(this.metadata, (_this$lastFileState = this.lastFileState) === null || _this$lastFileState === void 0 ? void 0 : _this$lastFileState.status);
701
+ return (0, _analytics.getFileAttributes)(this.metadata, (_this$state4 = this.state) === null || _this$state4 === void 0 ? void 0 : (_this$state4$fileStat = _this$state4.fileState) === null || _this$state4$fileStat === void 0 ? void 0 : _this$state4$fileStat.status);
679
702
  }
680
703
  }, {
681
704
  key: "fireOperationalEvent",
682
705
  value: function fireOperationalEvent() {
683
- var timeElapsedTillCommenced = this.timeElapsedTillCommenced;
684
- var _this$state3 = this.state,
685
- status = _this$state3.status,
686
- cardPreview = _this$state3.cardPreview,
687
- error = _this$state3.error;
706
+ var _this$state5 = this.state,
707
+ status = _this$state5.status,
708
+ error = _this$state5.error;
688
709
  var createAnalyticsEvent = this.props.createAnalyticsEvent;
689
- var timeElapsedTillEvent = performance.now();
690
- var durationSinceCommenced = timeElapsedTillCommenced && timeElapsedTillEvent - timeElapsedTillCommenced;
691
- var performanceAttributes = {
692
- overall: {
693
- durationSincePageStart: timeElapsedTillEvent,
694
- durationSinceCommenced: durationSinceCommenced
695
- }
696
- };
697
- createAnalyticsEvent && (0, _cardAnalytics.fireOperationalEvent)(createAnalyticsEvent, status, this.fileAttributes, performanceAttributes, {
698
- cardPreview: cardPreview,
699
- error: error
700
- });
710
+ createAnalyticsEvent && (0, _cardAnalytics.fireOperationalEvent)(createAnalyticsEvent, status, this.fileAttributes, this.getPerformanceAttributes(), error);
701
711
  }
702
712
  }, {
703
713
  key: "fireCommencedEvent",
@@ -715,11 +725,11 @@ var CardBase = /*#__PURE__*/function (_Component) {
715
725
  get: function get() {
716
726
  var _this3 = this;
717
727
 
718
- var _this$props9 = this.props,
719
- _this$props9$actions = _this$props9.actions,
720
- actions = _this$props9$actions === void 0 ? [] : _this$props9$actions,
721
- identifier = _this$props9.identifier,
722
- shouldEnableDownloadButton = _this$props9.shouldEnableDownloadButton;
728
+ var _this$props10 = this.props,
729
+ _this$props10$actions = _this$props10.actions,
730
+ actions = _this$props10$actions === void 0 ? [] : _this$props10$actions,
731
+ identifier = _this$props10.identifier,
732
+ shouldEnableDownloadButton = _this$props10.shouldEnableDownloadButton;
723
733
  var status = this.state.status;
724
734
  var metadata = this.metadata;
725
735
 
@@ -741,20 +751,15 @@ var CardBase = /*#__PURE__*/function (_Component) {
741
751
  }, {
742
752
  key: "render",
743
753
  value: function render() {
744
- var _this$lastFileState2;
745
-
746
- var _this$state4 = this.state,
747
- isPlayingFile = _this$state4.isPlayingFile,
748
- mediaViewerSelectedItem = _this$state4.mediaViewerSelectedItem;
754
+ var _this$state6 = this.state,
755
+ isPlayingFile = _this$state6.isPlayingFile,
756
+ mediaViewerSelectedItem = _this$state6.mediaViewerSelectedItem;
749
757
 
750
758
  var innerContent = /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, isPlayingFile ? this.renderInlinePlayer() : this.renderCard(), mediaViewerSelectedItem ? this.renderMediaViewer() : null);
751
759
 
752
- var content = this.context.intl ? innerContent : /*#__PURE__*/_react.default.createElement(_reactIntl.IntlProvider, {
760
+ return this.context.intl ? innerContent : /*#__PURE__*/_react.default.createElement(_reactIntl.IntlProvider, {
753
761
  locale: "en"
754
762
  }, innerContent);
755
- return /*#__PURE__*/_react.default.createElement(_fileAttributesContext.FileAttributesProvider, {
756
- data: (0, _analytics.getFileAttributes)(this.metadata, (_this$lastFileState2 = this.lastFileState) === null || _this$lastFileState2 === void 0 ? void 0 : _this$lastFileState2.status)
757
- }, content);
758
763
  }
759
764
  }]);
760
765
  return CardBase;