@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
@@ -27,7 +27,7 @@ import { Wrapper } from './styled';
27
27
  import { createAndFireMediaCardEvent } from '../utils/analytics';
28
28
  import { attachDetailsToActions } from '../actions';
29
29
  import { getErrorMessage } from '../utils/getErrorMessage';
30
- import { toHumanReadableMediaSize } from '@atlaskit/media-ui';
30
+ import { toHumanReadableMediaSize, messages } from '@atlaskit/media-ui';
31
31
  import { NewFileExperienceWrapper } from './ui/styled';
32
32
  import { CardImageContainer, calcBreakpointSize } from './ui/styledSSR';
33
33
  import { ImageRenderer } from './ui/imageRenderer/imageRenderer';
@@ -42,10 +42,10 @@ import Tooltip from '@atlaskit/tooltip';
42
42
  import { IconWrapper } from './ui/iconWrapper/styled';
43
43
  import { MimeTypeIcon } from '@atlaskit/media-ui/mime-type-icon';
44
44
  import SpinnerIcon from '@atlaskit/spinner';
45
- import { PreviewUnavailable, CreatingPreview, RateLimited, PreviewCurrentlyUnavailable } from './ui/iconMessage';
46
- import { LoadingRateLimited } from './ui/loadingRateLimited/loadingRateLimited';
45
+ import { PreviewUnavailable, CreatingPreview, FailedToUpload, PreviewCurrentlyUnavailable, FailedToLoad } from './ui/iconMessage';
47
46
  import { isRateLimitedError, isPollingError } from '@atlaskit/media-client';
48
47
  import { newFileExperienceClassName } from './card/cardConstants';
48
+ import { isUploadError } from '../errors';
49
49
 
50
50
  /**
51
51
  * This is classic vanilla CardView class. To create an instance of class one would need to supply
@@ -68,15 +68,36 @@ export var CardViewBase = /*#__PURE__*/function (_React$Component) {
68
68
  _this = _super.call.apply(_super, [this].concat(args));
69
69
 
70
70
  _defineProperty(_assertThisInitialized(_this), "state", {
71
- isImageFailedToLoad: false
71
+ didImageRender: false
72
72
  });
73
73
 
74
74
  _defineProperty(_assertThisInitialized(_this), "divRef", /*#__PURE__*/React.createRef());
75
75
 
76
- _defineProperty(_assertThisInitialized(_this), "onImageLoadError", function () {
76
+ _defineProperty(_assertThisInitialized(_this), "onImageLoad", function () {
77
+ var onImageLoad = _this.props.onImageLoad; // We render the icon & icon message always, even if there is dataURI available.
78
+ // If the image fails to load/render, the icon will remain, i.e. the user won't see a change until
79
+ // the root card decides to chage status to error.
80
+ // If the image renders successfully, we switch this variable to hide the icon & icon message
81
+ // behind the thumbnail in case the image has transparency.
82
+ // It is less likely that root component replaces a suceeded dataURI for a failed one
83
+ // than the opposite case. Therefore we prefer to hide the icon instead show when the image fails,
84
+ // for a smoother transition
85
+
86
+ _this.setState({
87
+ didImageRender: true
88
+ });
89
+
90
+ onImageLoad && onImageLoad();
91
+ });
92
+
93
+ _defineProperty(_assertThisInitialized(_this), "onImageError", function () {
94
+ var onImageError = _this.props.onImageError;
95
+
77
96
  _this.setState({
78
- isImageFailedToLoad: true
97
+ didImageRender: false
79
98
  });
99
+
100
+ onImageError && onImageError();
80
101
  });
81
102
 
82
103
  _defineProperty(_assertThisInitialized(_this), "saveElementWidth", function () {
@@ -115,7 +136,7 @@ export var CardViewBase = /*#__PURE__*/function (_React$Component) {
115
136
  name = _ref.name;
116
137
 
117
138
  var shouldUsePointerCursor = status !== 'error' && status !== 'failed-processing';
118
- var shouldDisplayBackground = !dataURI || !disableOverlay;
139
+ var shouldDisplayBackground = !dataURI || !disableOverlay || status === 'error' || status === 'failed-processing';
119
140
  var isPlayButtonClickable = !!(_this.shouldRenderPlayButton() && disableOverlay);
120
141
  var isTickBoxSelectable = !disableOverlay && !!selectable && !selected; // Make tooltip optional for media singles - images, videos.
121
142
  // Intention is to show full file name when it's truncate in titlebox,
@@ -160,8 +181,7 @@ export var CardViewBase = /*#__PURE__*/function (_React$Component) {
160
181
  previewOrientation = _this$props2.previewOrientation,
161
182
  alt = _this$props2.alt,
162
183
  onDisplayImage = _this$props2.onDisplayImage,
163
- actions = _this$props2.actions,
164
- timeElapsedTillCommenced = _this$props2.timeElapsedTillCommenced;
184
+ actions = _this$props2.actions;
165
185
 
166
186
  var _ref2 = metadata || {},
167
187
  name = _ref2.name,
@@ -191,7 +211,8 @@ export var CardViewBase = /*#__PURE__*/function (_React$Component) {
191
211
  disableOverlay: disableOverlay,
192
212
  previewOrientation: previewOrientation,
193
213
  alt: alt,
194
- timeElapsedTillCommenced: timeElapsedTillCommenced
214
+ onImageLoad: _this.onImageLoad,
215
+ onImageError: _this.onImageError
195
216
  });
196
217
  });
197
218
 
@@ -209,15 +230,14 @@ export var CardViewBase = /*#__PURE__*/function (_React$Component) {
209
230
  name = _ref3.name,
210
231
  mediaType = _ref3.mediaType;
211
232
 
212
- var isImageFailedToLoad = _this.state.isImageFailedToLoad;
233
+ var didImageRender = _this.state.didImageRender;
213
234
  var isZeroSize = !!(metadata && metadata.size === 0);
214
235
  var defaultConfig = {
215
- renderTypeIcon: isImageFailedToLoad || !dataURI,
216
- renderImageRenderer: !!dataURI && !isImageFailedToLoad,
236
+ renderTypeIcon: !didImageRender,
237
+ renderImageRenderer: !!dataURI,
217
238
  renderPlayButton: !!dataURI && mediaType === 'video',
218
239
  renderBlanket: !disableOverlay,
219
- renderTitleBox: !!name && !disableOverlay,
220
- renderFailedTitleBox: !!isImageFailedToLoad && !metadata,
240
+ renderTitleBox: !disableOverlay && !!name,
221
241
  renderTickBox: !disableOverlay && !!selectable
222
242
  };
223
243
 
@@ -232,55 +252,71 @@ export var CardViewBase = /*#__PURE__*/function (_React$Component) {
232
252
  case 'processing':
233
253
  case 'loading-preview':
234
254
  return _objectSpread(_objectSpread({}, defaultConfig), {}, {
235
- iconMessage: (isImageFailedToLoad || !dataURI) && !isZeroSize ? /*#__PURE__*/React.createElement(CreatingPreview, {
255
+ iconMessage: !didImageRender && !isZeroSize ? /*#__PURE__*/React.createElement(CreatingPreview, {
236
256
  disableAnimation: disableAnimation
237
257
  }) : undefined
238
258
  });
239
259
 
240
260
  case 'complete':
241
- return _objectSpread(_objectSpread({}, defaultConfig), {}, {
242
- iconMessage: !!isImageFailedToLoad && !!metadata ? /*#__PURE__*/React.createElement(PreviewUnavailable, null) : undefined
243
- });
261
+ return defaultConfig;
244
262
 
245
263
  case 'error':
246
- if (error && isPollingError(error)) {
247
- return _objectSpread(_objectSpread({}, defaultConfig), {}, {
248
- renderTypeIcon: true,
249
- renderImageRenderer: false,
250
- renderTitleBox: !!name,
251
- renderFailedTitleBox: false,
252
- iconMessage: !!metadata && !isZeroSize ? /*#__PURE__*/React.createElement(PreviewCurrentlyUnavailable, null) : undefined
264
+ case 'failed-processing':
265
+ var baseErrorConfig = _objectSpread(_objectSpread({}, defaultConfig), {}, {
266
+ renderTypeIcon: true,
267
+ renderImageRenderer: false,
268
+ renderTitleBox: false,
269
+ renderPlayButton: false
270
+ });
271
+
272
+ var iconMessage;
273
+
274
+ if (!!metadata) {
275
+ if (error) {
276
+ var secondaryError = error.secondaryError;
277
+
278
+ if (isRateLimitedError(secondaryError) || secondaryError && isPollingError(secondaryError)) {
279
+ iconMessage = /*#__PURE__*/React.createElement(PreviewCurrentlyUnavailable, null);
280
+ }
281
+ } else if (!isZeroSize) {
282
+ iconMessage = /*#__PURE__*/React.createElement(PreviewUnavailable, null);
283
+ }
284
+ } else if (!!disableOverlay) {
285
+ iconMessage = /*#__PURE__*/React.createElement(FailedToLoad, null);
286
+ }
287
+
288
+ if (error && isUploadError(error)) {
289
+ if (!disableOverlay) {
290
+ return _objectSpread(_objectSpread({}, baseErrorConfig), {}, {
291
+ renderFailedTitleBox: true,
292
+ customTitleMessage: messages.failed_to_upload
293
+ });
294
+ }
295
+
296
+ return _objectSpread(_objectSpread({}, baseErrorConfig), {}, {
297
+ renderTitleBox: !metadata && !!name,
298
+ iconMessage: /*#__PURE__*/React.createElement(FailedToUpload, null)
253
299
  });
254
- } else if (isRateLimitedError(error) && !disableOverlay) {
255
- return {
256
- renderTypeIcon: !!metadata,
257
- renderTitleBox: !!metadata,
258
- iconMessage: !!metadata ? /*#__PURE__*/React.createElement(RateLimited, null) : undefined,
259
- renderLoadingRateLimited: !metadata
260
- };
261
- } else {
262
- return _objectSpread(_objectSpread({}, defaultConfig), {}, {
263
- renderTypeIcon: true,
264
- renderImageRenderer: false,
265
- renderTitleBox: false,
266
- renderFailedTitleBox: true
300
+ }
301
+
302
+ if (!disableOverlay) {
303
+ return _objectSpread(_objectSpread({}, baseErrorConfig), {}, {
304
+ renderTitleBox: !!name,
305
+ renderFailedTitleBox: !metadata,
306
+ iconMessage: iconMessage
267
307
  });
268
308
  }
269
309
 
270
- case 'failed-processing':
271
- return _objectSpread(_objectSpread({}, defaultConfig), {}, {
272
- renderTypeIcon: true,
273
- renderImageRenderer: false,
274
- renderTitleBox: !!name && !disableOverlay,
275
- renderFailedTitleBox: !metadata,
276
- iconMessage: !!metadata && !isZeroSize ? /*#__PURE__*/React.createElement(PreviewUnavailable, null) : undefined
310
+ return _objectSpread(_objectSpread({}, baseErrorConfig), {}, {
311
+ iconMessage: iconMessage
277
312
  });
278
313
 
279
314
  case 'loading':
280
315
  default:
281
316
  return _objectSpread(_objectSpread({}, defaultConfig), {}, {
317
+ renderPlayButton: false,
282
318
  renderTypeIcon: false,
283
- renderSpinner: true
319
+ renderSpinner: !didImageRender
284
320
  });
285
321
  }
286
322
  });
@@ -298,7 +334,7 @@ export var CardViewBase = /*#__PURE__*/function (_React$Component) {
298
334
  renderFailedTitleBox = _this$getRenderConfig.renderFailedTitleBox,
299
335
  renderTickBox = _this$getRenderConfig.renderTickBox,
300
336
  isFixedBlanket = _this$getRenderConfig.isFixedBlanket,
301
- renderLoadingRateLimited = _this$getRenderConfig.renderLoadingRateLimited;
337
+ customTitleMessage = _this$getRenderConfig.customTitleMessage;
302
338
 
303
339
  var _this$props4 = _this.props,
304
340
  progress = _this$props4.progress,
@@ -317,7 +353,7 @@ export var CardViewBase = /*#__PURE__*/function (_React$Component) {
317
353
  "data-test-status": status,
318
354
  "data-test-progress": progress,
319
355
  "data-test-selected": selected ? true : undefined
320
- }, renderTypeIcon && _this.renderMediaTypeIcon(hasTitleBox, iconMessage), renderSpinner && _this.renderSpinner(hasTitleBox), renderImageRenderer && _this.renderImageRenderer(), renderPlayButton && _this.renderPlayButton(hasTitleBox), renderBlanket && _this.renderBlanket(!!isFixedBlanket), renderTitleBox && _this.renderTitleBox(), renderFailedTitleBox && _this.renderFailedTitleBox(), renderProgressBar && _this.renderProgressBar(!hasTitleBox), renderLoadingRateLimited && /*#__PURE__*/React.createElement(LoadingRateLimited, null), renderTickBox && _this.renderTickBox()), _this.renderActionsBar());
356
+ }, renderTypeIcon && _this.renderMediaTypeIcon(hasTitleBox, iconMessage), renderSpinner && _this.renderSpinner(hasTitleBox), renderImageRenderer && _this.renderImageRenderer(), renderPlayButton && _this.renderPlayButton(hasTitleBox), renderBlanket && _this.renderBlanket(!!isFixedBlanket), renderTitleBox && _this.renderTitleBox(), renderFailedTitleBox && _this.renderFailedTitleBox(customTitleMessage), renderProgressBar && _this.renderProgressBar(!hasTitleBox), renderTickBox && _this.renderTickBox()), _this.renderActionsBar());
321
357
  });
322
358
 
323
359
  return _this;
@@ -334,13 +370,14 @@ export var CardViewBase = /*#__PURE__*/function (_React$Component) {
334
370
  key: "componentDidUpdate",
335
371
  value: function componentDidUpdate(_ref5) {
336
372
  var prevDataURI = _ref5.dataURI;
337
- var dataURI = this.props.dataURI;
373
+ var dataURI = this.props.dataURI; // We should only switch didImageRender to false
374
+ // when dataURI goes undefined, not when it is updated.
375
+ // as this method could be triggered after onImageLoad callback,
376
+ // falling on a race condition
338
377
 
339
- if (prevDataURI !== dataURI) {
340
- this.setState({
341
- isImageFailedToLoad: false
342
- });
343
- }
378
+ prevDataURI && !dataURI && this.setState({
379
+ didImageRender: false
380
+ });
344
381
  }
345
382
  }, {
346
383
  key: "width",
@@ -461,9 +498,10 @@ export var CardViewBase = /*#__PURE__*/function (_React$Component) {
461
498
  }
462
499
  }, {
463
500
  key: "renderFailedTitleBox",
464
- value: function renderFailedTitleBox() {
501
+ value: function renderFailedTitleBox(customMessage) {
465
502
  return /*#__PURE__*/React.createElement(FailedTitleBox, {
466
- breakpoint: this.breakpoint
503
+ breakpoint: this.breakpoint,
504
+ customMessage: customMessage
467
505
  });
468
506
  }
469
507
  }, {
@@ -489,8 +527,7 @@ export var CardViewBase = /*#__PURE__*/function (_React$Component) {
489
527
  alt = _this$props8.alt,
490
528
  resizeMode = _this$props8.resizeMode,
491
529
  onDisplayImage = _this$props8.onDisplayImage,
492
- mediaItemType = _this$props8.mediaItemType,
493
- timeElapsedTillCommenced = _this$props8.timeElapsedTillCommenced;
530
+ mediaItemType = _this$props8.mediaItemType;
494
531
  return !!dataURI && /*#__PURE__*/React.createElement(ImageRenderer, {
495
532
  dataURI: dataURI,
496
533
  mediaType: mediaType,
@@ -499,8 +536,8 @@ export var CardViewBase = /*#__PURE__*/function (_React$Component) {
499
536
  alt: alt,
500
537
  resizeMode: resizeMode,
501
538
  onDisplayImage: onDisplayImage,
502
- onImageError: this.onImageLoadError,
503
- timeElapsedTillCommenced: timeElapsedTillCommenced
539
+ onImageLoad: this.onImageLoad,
540
+ onImageError: this.onImageError
504
541
  });
505
542
  }
506
543
  }, {
@@ -33,7 +33,8 @@ var MediaInlineCardLoader = /*#__PURE__*/function (_React$PureComponent) {
33
33
  _this = _super.call.apply(_super, [this].concat(args));
34
34
 
35
35
  _defineProperty(_assertThisInitialized(_this), "state", {
36
- MediaInlineCard: MediaInlineCardLoader.MediaInlineCard
36
+ MediaInlineCard: MediaInlineCardLoader.MediaInlineCard,
37
+ ErrorBoundary: MediaInlineCardLoader.ErrorBoundary
37
38
  });
38
39
 
39
40
  return _this;
@@ -126,14 +126,15 @@ export var MediaInlineCardInternal = function MediaInlineCardInternal(_ref) {
126
126
  formattedDate = formatDate(fileState.createdAt, locale);
127
127
  }
128
128
 
129
- return /*#__PURE__*/React.createElement(Tooltip, {
129
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Tooltip, {
130
130
  position: "bottom",
131
- content: formattedDate
131
+ content: formattedDate,
132
+ tag: "span"
132
133
  }, /*#__PURE__*/React.createElement(MediaInlineCardLoadedView, {
133
134
  icon: linkIcon,
134
135
  title: name,
135
136
  onClick: onMediaInlineCardClick,
136
137
  isSelected: isSelected
137
- }), mediaViewer);
138
+ })), mediaViewer);
138
139
  };
139
140
  export var MediaInlineCard = injectIntl(MediaInlineCardInternal);
@@ -26,10 +26,14 @@ export var PreviewUnavailable = function PreviewUnavailable(props) {
26
26
  messageDescriptor: messages.preview_unavailable
27
27
  }));
28
28
  };
29
- export var RateLimited = function RateLimited(props) {
29
+ export var FailedToLoad = function FailedToLoad(props) {
30
30
  return /*#__PURE__*/React.createElement(IconMessage, _extends({}, props, {
31
- messageDescriptor: messages.preview_rateLimited,
32
- reducedFont: true
31
+ messageDescriptor: messages.failed_to_load
32
+ }));
33
+ };
34
+ export var FailedToUpload = function FailedToUpload(props) {
35
+ return /*#__PURE__*/React.createElement(IconMessage, _extends({}, props, {
36
+ messageDescriptor: messages.failed_to_upload
33
37
  }));
34
38
  };
35
39
  export var PreviewCurrentlyUnavailable = function PreviewCurrentlyUnavailable(props) {
@@ -1,122 +1,27 @@
1
1
  import _extends from "@babel/runtime/helpers/extends";
2
- import _classCallCheck from "@babel/runtime/helpers/classCallCheck";
3
- import _createClass from "@babel/runtime/helpers/createClass";
4
- import _assertThisInitialized from "@babel/runtime/helpers/assertThisInitialized";
5
- import _inherits from "@babel/runtime/helpers/inherits";
6
- import _possibleConstructorReturn from "@babel/runtime/helpers/possibleConstructorReturn";
7
- import _getPrototypeOf from "@babel/runtime/helpers/getPrototypeOf";
8
- import _defineProperty from "@babel/runtime/helpers/defineProperty";
9
-
10
- function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
11
-
12
- function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
13
-
14
- import React from 'react';
2
+ import React, { useEffect } from 'react';
15
3
  import { MediaImage } from '@atlaskit/media-ui';
16
- import { withAnalyticsEvents } from '@atlaskit/analytics-next';
17
- import { fireMediaCardEvent, RenderEventAction, getRenderSucceededEventPayload, getRenderFailedFileUriPayload, getRenderFailedExternalUriPayload } from '../../../utils/analytics';
18
- import { withFileAttributes } from '../../../utils/fileAttributesContext';
19
4
  import { resizeModeToMediaImageProps } from '../../../utils/resizeModeToMediaImageProps';
20
- export var ImageRendererBase = /*#__PURE__*/function (_React$Component) {
21
- _inherits(ImageRendererBase, _React$Component);
22
-
23
- var _super = _createSuper(ImageRendererBase);
24
-
25
- function ImageRendererBase() {
26
- var _this;
27
-
28
- _classCallCheck(this, ImageRendererBase);
29
-
30
- for (var _len = arguments.length, args = new Array(_len), _key = 0; _key < _len; _key++) {
31
- args[_key] = arguments[_key];
5
+ export var ImageRenderer = function ImageRenderer(_ref) {
6
+ var dataURI = _ref.dataURI,
7
+ previewOrientation = _ref.previewOrientation,
8
+ alt = _ref.alt,
9
+ resizeMode = _ref.resizeMode,
10
+ onImageLoad = _ref.onImageLoad,
11
+ onImageError = _ref.onImageError,
12
+ onDisplayImage = _ref.onDisplayImage,
13
+ mediaType = _ref.mediaType;
14
+ useEffect(function () {
15
+ // TODO: trigger accordingly with the succeeded event. This could be a breaking change
16
+ if (mediaType === 'image' && onDisplayImage) {
17
+ onDisplayImage();
32
18
  }
33
-
34
- _this = _super.call.apply(_super, [this].concat(args));
35
-
36
- _defineProperty(_assertThisInitialized(_this), "onImageLoad", function () {
37
- var _this$props = _this.props,
38
- createAnalyticsEvent = _this$props.createAnalyticsEvent,
39
- fileAttributes = _this$props.fileAttributes,
40
- timeElapsedTillCommenced = _this$props.timeElapsedTillCommenced;
41
-
42
- if (fileAttributes && _this.shouldFireEvent(RenderEventAction.SUCCEEDED)) {
43
- var timeElapsedTillSucceeded = performance.now();
44
- var durationSinceCommenced = timeElapsedTillCommenced && timeElapsedTillSucceeded - timeElapsedTillCommenced;
45
- var performanceAttributes = {
46
- overall: {
47
- durationSincePageStart: timeElapsedTillSucceeded,
48
- durationSinceCommenced: durationSinceCommenced
49
- }
50
- };
51
- fireMediaCardEvent(getRenderSucceededEventPayload(fileAttributes, performanceAttributes), createAnalyticsEvent);
52
- }
53
- });
54
-
55
- _defineProperty(_assertThisInitialized(_this), "onImageError", function () {
56
- var _this$props2 = _this.props,
57
- onImageError = _this$props2.onImageError,
58
- fileAttributes = _this$props2.fileAttributes;
59
- onImageError && onImageError();
60
-
61
- if (fileAttributes && _this.shouldFireEvent(RenderEventAction.FAILED)) {
62
- var _this$props3 = _this.props,
63
- createAnalyticsEvent = _this$props3.createAnalyticsEvent,
64
- mediaItemType = _this$props3.mediaItemType,
65
- timeElapsedTillCommenced = _this$props3.timeElapsedTillCommenced;
66
- var timeElapsedTillFailed = performance.now();
67
- var durationSinceCommenced = timeElapsedTillCommenced && timeElapsedTillFailed - timeElapsedTillCommenced;
68
- var performanceAttributes = {
69
- overall: {
70
- durationSincePageStart: timeElapsedTillFailed,
71
- durationSinceCommenced: durationSinceCommenced
72
- }
73
- };
74
-
75
- if (mediaItemType === 'file') {
76
- fireMediaCardEvent(getRenderFailedFileUriPayload(fileAttributes, performanceAttributes), createAnalyticsEvent);
77
- } else if (mediaItemType === 'external-image') {
78
- fireMediaCardEvent(getRenderFailedExternalUriPayload(fileAttributes, performanceAttributes), createAnalyticsEvent);
79
- }
80
- }
81
- });
82
-
83
- _defineProperty(_assertThisInitialized(_this), "shouldFireEvent", function (action) {
84
- return !_this.lastAnalyticsAction || _this.lastAnalyticsAction !== action;
85
- });
86
-
87
- return _this;
88
- }
89
-
90
- _createClass(ImageRendererBase, [{
91
- key: "componentDidMount",
92
- value: function componentDidMount() {
93
- // TODO: trigger accordingly with the succeeded event. This could be a breaking change
94
- var _this$props4 = this.props,
95
- onDisplayImage = _this$props4.onDisplayImage,
96
- mediaType = _this$props4.mediaType;
97
-
98
- if (mediaType === 'image' && onDisplayImage) {
99
- onDisplayImage();
100
- }
101
- }
102
- }, {
103
- key: "render",
104
- value: function render() {
105
- var _this$props5 = this.props,
106
- dataURI = _this$props5.dataURI,
107
- previewOrientation = _this$props5.previewOrientation,
108
- alt = _this$props5.alt,
109
- resizeMode = _this$props5.resizeMode;
110
- return /*#__PURE__*/React.createElement(MediaImage, _extends({
111
- dataURI: dataURI,
112
- alt: alt,
113
- previewOrientation: previewOrientation,
114
- onImageLoad: this.onImageLoad,
115
- onImageError: this.onImageError
116
- }, resizeModeToMediaImageProps(resizeMode)));
117
- }
118
- }]);
119
-
120
- return ImageRendererBase;
121
- }(React.Component);
122
- export var ImageRenderer = withAnalyticsEvents()(withFileAttributes(ImageRendererBase));
19
+ }, [mediaType, onDisplayImage]);
20
+ return /*#__PURE__*/React.createElement(MediaImage, _extends({
21
+ dataURI: dataURI,
22
+ alt: alt,
23
+ previewOrientation: previewOrientation,
24
+ onImageLoad: onImageLoad,
25
+ onImageError: onImageError
26
+ }, resizeModeToMediaImageProps(resizeMode)));
27
+ };
@@ -1,15 +1,18 @@
1
1
  import React from 'react';
2
2
  import { TitleBoxWrapper, ErrorMessageWrapper } from './styled';
3
3
  import EditorWarningIcon from '@atlaskit/icon/glyph/editor/warning';
4
+ import { messages } from '@atlaskit/media-ui';
4
5
  import { R300 } from '@atlaskit/theme/colors';
5
- import { getErrorMessage } from '../../../utils/getErrorMessage';
6
+ import { FormattedMessage } from 'react-intl';
6
7
  export var FailedTitleBox = function FailedTitleBox(_ref) {
7
- var breakpoint = _ref.breakpoint;
8
+ var breakpoint = _ref.breakpoint,
9
+ _ref$customMessage = _ref.customMessage,
10
+ customMessage = _ref$customMessage === void 0 ? messages.failed_to_load : _ref$customMessage;
8
11
  return /*#__PURE__*/React.createElement(TitleBoxWrapper, {
9
12
  breakpoint: breakpoint
10
13
  }, /*#__PURE__*/React.createElement(ErrorMessageWrapper, null, /*#__PURE__*/React.createElement(EditorWarningIcon, {
11
14
  label: 'Warning',
12
15
  size: 'small',
13
16
  primaryColor: R300
14
- }), getErrorMessage('error')));
17
+ }), /*#__PURE__*/React.createElement(FormattedMessage, customMessage)));
15
18
  };
@@ -2,14 +2,6 @@ import { getMediaClientErrorReason, isRequestError } from '@atlaskit/media-clien
2
2
  import { ANALYTICS_MEDIA_CHANNEL } from '@atlaskit/media-common';
3
3
  import { createAndFireEvent } from '@atlaskit/analytics-next';
4
4
  import { isMediaCardError } from '../errors';
5
- export var RenderEventAction;
6
-
7
- (function (RenderEventAction) {
8
- RenderEventAction["COMMENCED"] = "commenced";
9
- RenderEventAction["SUCCEEDED"] = "succeeded";
10
- RenderEventAction["FAILED"] = "failed";
11
- })(RenderEventAction || (RenderEventAction = {}));
12
-
13
5
  export var getFileAttributes = function getFileAttributes(metadata, fileStatus) {
14
6
  return {
15
7
  fileMediatype: metadata.mediaType,
@@ -34,7 +26,7 @@ export var getRenderPreviewableCardPayload = function getRenderPreviewableCardPa
34
26
  export var getRenderCommencedEventPayload = function getRenderCommencedEventPayload(fileAttributes, performanceAttributes) {
35
27
  return {
36
28
  eventType: 'operational',
37
- action: RenderEventAction.COMMENCED,
29
+ action: 'commenced',
38
30
  actionSubject: 'mediaCardRender',
39
31
  attributes: {
40
32
  fileAttributes: fileAttributes,
@@ -45,7 +37,7 @@ export var getRenderCommencedEventPayload = function getRenderCommencedEventPayl
45
37
  export var getRenderSucceededEventPayload = function getRenderSucceededEventPayload(fileAttributes, performanceAttributes) {
46
38
  return {
47
39
  eventType: 'operational',
48
- action: RenderEventAction.SUCCEEDED,
40
+ action: 'succeeded',
49
41
  actionSubject: 'mediaCardRender',
50
42
  attributes: {
51
43
  fileAttributes: fileAttributes,
@@ -54,33 +46,10 @@ export var getRenderSucceededEventPayload = function getRenderSucceededEventPayl
54
46
  }
55
47
  };
56
48
  };
57
- export var getFailedFileUriFailReason = function getFailedFileUriFailReason(fileStatus) {
58
- if (!fileStatus) {
59
- // This fail reason will come from a bug, most likely.
60
- return "unknown-uri";
61
- } else if (fileStatus === 'uploading') {
62
- return 'local-uri';
63
- }
64
-
65
- return 'remote-uri';
66
- };
67
- export var getRenderFailedFileUriPayload = function getRenderFailedFileUriPayload(fileAttributes, performanceAttributes) {
68
- return {
69
- eventType: 'operational',
70
- action: RenderEventAction.FAILED,
71
- actionSubject: 'mediaCardRender',
72
- attributes: {
73
- fileAttributes: fileAttributes,
74
- performanceAttributes: performanceAttributes,
75
- status: 'fail',
76
- failReason: getFailedFileUriFailReason(fileAttributes.fileStatus)
77
- }
78
- };
79
- };
80
49
  export var getRenderFailedExternalUriPayload = function getRenderFailedExternalUriPayload(fileAttributes, performanceAttributes) {
81
50
  return {
82
51
  eventType: 'operational',
83
- action: RenderEventAction.FAILED,
52
+ action: 'failed',
84
53
  actionSubject: 'mediaCardRender',
85
54
  attributes: {
86
55
  fileAttributes: fileAttributes,
@@ -123,7 +92,7 @@ export var getRenderErrorRequestMetadata = function getRenderErrorRequestMetadat
123
92
  export var getRenderErrorEventPayload = function getRenderErrorEventPayload(fileAttributes, performanceAttributes, error) {
124
93
  return {
125
94
  eventType: 'operational',
126
- action: RenderEventAction.FAILED,
95
+ action: 'failed',
127
96
  actionSubject: 'mediaCardRender',
128
97
  attributes: {
129
98
  fileAttributes: fileAttributes,
@@ -139,7 +108,7 @@ export var getRenderErrorEventPayload = function getRenderErrorEventPayload(file
139
108
  export var getRenderFailedFileStatusPayload = function getRenderFailedFileStatusPayload(fileAttributes, performanceAttributes) {
140
109
  return {
141
110
  eventType: 'operational',
142
- action: RenderEventAction.FAILED,
111
+ action: 'failed',
143
112
  actionSubject: 'mediaCardRender',
144
113
  attributes: {
145
114
  fileAttributes: fileAttributes,
@@ -20,7 +20,7 @@ export var canCompareDimension = function canCompareDimension(current, next) {
20
20
  return false;
21
21
  };
22
22
  export var isBigger = function isBigger(current, next) {
23
- if (canCompareDimension(current.width, next.width) && canCompareDimension(current.height, next.height)) {
23
+ if (!!current && !!next && canCompareDimension(current.width, next.width) && canCompareDimension(current.height, next.height)) {
24
24
  var nextIsHigher = parseInt("".concat(current.width), 10) < parseInt("".concat(next.width), 10);
25
25
  var nextIsWider = parseInt("".concat(current.height), 10) < parseInt("".concat(next.height), 10);
26
26
  return nextIsHigher || nextIsWider;
@@ -1,4 +1,4 @@
1
- import { isErrorFileState } from '@atlaskit/media-client';
1
+ import { isErrorFileState, isFileIdentifier } from '@atlaskit/media-client';
2
2
 
3
3
  var getProcessingStatusFromFileState = function getProcessingStatusFromFileState(status) {
4
4
  switch (status) {
@@ -13,8 +13,8 @@ var getProcessingStatusFromFileState = function getProcessingStatusFromFileState
13
13
  }
14
14
  };
15
15
 
16
- export var getFileDetails = function getFileDetails(state) {
17
- return !isErrorFileState(state) ? {
16
+ var getFileDetailsFromFileState = function getFileDetailsFromFileState(state) {
17
+ return {
18
18
  id: state.id,
19
19
  name: state.name,
20
20
  size: state.size,
@@ -22,7 +22,15 @@ export var getFileDetails = function getFileDetails(state) {
22
22
  createdAt: state.createdAt,
23
23
  mediaType: state.mediaType,
24
24
  processingStatus: getProcessingStatusFromFileState(state.status)
25
+ };
26
+ };
27
+
28
+ export var getFileDetails = function getFileDetails(identifier, fileState) {
29
+ return isFileIdentifier(identifier) ? fileState && !isErrorFileState(fileState) ? getFileDetailsFromFileState(fileState) : {
30
+ id: identifier.id
25
31
  } : {
26
- id: state.id
32
+ id: identifier.mediaItemType,
33
+ name: identifier.name || identifier.dataURI,
34
+ mediaType: 'image'
27
35
  };
28
36
  };
@@ -73,6 +73,12 @@ export var ObjectURLCache = /*#__PURE__*/function () {
73
73
  value: function set(key, value) {
74
74
  this.cache.set(key, value);
75
75
  }
76
+ }, {
77
+ key: "remove",
78
+ value: function remove(key) {
79
+ var removed = this.cache.remove(key);
80
+ removed && URL.revokeObjectURL(removed.dataURI);
81
+ }
76
82
  }]);
77
83
 
78
84
  return ObjectURLCache;
@@ -5,7 +5,7 @@ export var shouldDisplayImageThumbnail = function shouldDisplayImageThumbnail(ca
5
5
  }
6
6
 
7
7
  if (dataURI) {
8
- return mediaItemType === 'external-image' || mimeType && isMimeTypeSupportedByBrowser(mimeType) || cardStatus === 'complete';
8
+ return mediaItemType === 'external-image' || mimeType && isMimeTypeSupportedByBrowser(mimeType) || cardStatus === 'complete' || cardStatus === 'loading-preview';
9
9
  }
10
10
 
11
11
  return false;