@atlaskit/media-card 70.9.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 (181) hide show
  1. package/CHANGELOG.md +69 -0
  2. package/dist/cjs/errors.js +109 -6
  3. package/dist/cjs/files/cardImageView/index.js +58 -89
  4. package/dist/cjs/files/index.js +0 -6
  5. package/dist/cjs/index.js +16 -6
  6. package/dist/cjs/root/card/cardAnalytics.js +33 -19
  7. package/dist/cjs/root/card/cardConstants.js +8 -0
  8. package/dist/cjs/root/card/cardSSRView.js +114 -0
  9. package/dist/cjs/root/card/cardState.js +50 -0
  10. package/dist/cjs/root/card/getCardPreview/cache.js +49 -0
  11. package/dist/cjs/root/card/getCardPreview/filePreviewStatus.js +50 -0
  12. package/dist/cjs/root/card/getCardPreview/helpers.js +215 -0
  13. package/dist/cjs/root/card/getCardPreview/index.js +225 -0
  14. package/dist/cjs/root/card/getCardStatus.js +16 -21
  15. package/dist/cjs/root/card/index.js +339 -398
  16. package/dist/cjs/root/cardView.js +108 -56
  17. package/dist/cjs/root/index.js +9 -1
  18. package/dist/cjs/root/inline/loader.js +22 -21
  19. package/dist/cjs/root/inline/{inlineMediaCard.js → mediaInlineCard.js} +66 -24
  20. package/dist/cjs/root/inlinePlayer.js +5 -15
  21. package/dist/cjs/root/ui/Breakpoint.js +13 -0
  22. package/dist/cjs/root/ui/common.js +5 -11
  23. package/dist/cjs/root/ui/iconMessage/index.js +17 -9
  24. package/dist/cjs/root/ui/imageRenderer/imageRenderer.js +32 -115
  25. package/dist/cjs/root/ui/loadingRateLimited/loadingRateLimited.js +2 -2
  26. package/dist/cjs/root/ui/progressBar/progressBar.js +2 -2
  27. package/dist/cjs/root/ui/progressBar/styled.js +3 -1
  28. package/dist/cjs/root/ui/styled.js +17 -80
  29. package/dist/cjs/root/ui/styledSSR.js +108 -0
  30. package/dist/cjs/root/ui/titleBox/failedTitleBox.js +7 -3
  31. package/dist/cjs/root/ui/titleBox/styled.js +3 -1
  32. package/dist/cjs/utils/analytics.js +26 -43
  33. package/dist/cjs/utils/dimensionComparer.js +1 -1
  34. package/dist/cjs/utils/document.js +12 -0
  35. package/dist/cjs/utils/getDataURIDimension.js +13 -2
  36. package/dist/cjs/utils/metadata.js +11 -3
  37. package/dist/cjs/utils/objectURLCache.js +6 -0
  38. package/dist/cjs/utils/resizeModeToMediaImageProps.js +13 -0
  39. package/dist/cjs/utils/shouldDisplayImageThumbnail.js +1 -1
  40. package/dist/cjs/utils/videoSnapshot.js +45 -0
  41. package/dist/cjs/version.json +1 -1
  42. package/dist/es2019/errors.js +52 -2
  43. package/dist/es2019/files/cardImageView/index.js +12 -46
  44. package/dist/es2019/files/index.js +1 -1
  45. package/dist/es2019/index.js +3 -3
  46. package/dist/es2019/root/card/cardAnalytics.js +23 -17
  47. package/dist/es2019/root/card/cardConstants.js +1 -0
  48. package/dist/es2019/root/card/cardSSRView.js +93 -0
  49. package/dist/es2019/root/card/cardState.js +26 -0
  50. package/dist/es2019/root/card/getCardPreview/cache.js +29 -0
  51. package/dist/es2019/root/card/getCardPreview/filePreviewStatus.js +35 -0
  52. package/dist/es2019/root/card/getCardPreview/helpers.js +83 -0
  53. package/dist/es2019/root/card/getCardPreview/index.js +129 -0
  54. package/dist/es2019/root/card/getCardStatus.js +11 -15
  55. package/dist/es2019/root/card/index.js +292 -276
  56. package/dist/es2019/root/cardView.js +107 -53
  57. package/dist/es2019/root/index.js +2 -1
  58. package/dist/es2019/root/inline/loader.js +16 -15
  59. package/dist/es2019/root/inline/mediaInlineCard.js +127 -0
  60. package/dist/es2019/root/inlinePlayer.js +5 -13
  61. package/dist/es2019/root/ui/Breakpoint.js +6 -0
  62. package/dist/es2019/root/ui/common.js +1 -7
  63. package/dist/es2019/root/ui/iconMessage/index.js +10 -6
  64. package/dist/es2019/root/ui/imageRenderer/imageRenderer.js +22 -74
  65. package/dist/es2019/root/ui/loadingRateLimited/loadingRateLimited.js +1 -1
  66. package/dist/es2019/root/ui/progressBar/progressBar.js +1 -1
  67. package/dist/es2019/root/ui/progressBar/styled.js +2 -1
  68. package/dist/es2019/root/ui/styled.js +4 -64
  69. package/dist/es2019/root/ui/styledSSR.js +93 -0
  70. package/dist/es2019/root/ui/titleBox/failedTitleBox.js +5 -3
  71. package/dist/es2019/root/ui/titleBox/styled.js +2 -1
  72. package/dist/es2019/utils/analytics.js +29 -40
  73. package/dist/es2019/utils/dimensionComparer.js +1 -1
  74. package/dist/es2019/utils/document.js +1 -0
  75. package/dist/es2019/utils/getDataURIDimension.js +8 -0
  76. package/dist/es2019/utils/metadata.js +12 -4
  77. package/dist/es2019/utils/objectURLCache.js +5 -0
  78. package/dist/es2019/utils/resizeModeToMediaImageProps.js +6 -0
  79. package/dist/es2019/utils/shouldDisplayImageThumbnail.js +1 -1
  80. package/dist/es2019/utils/videoSnapshot.js +7 -0
  81. package/dist/es2019/version.json +1 -1
  82. package/dist/esm/errors.js +85 -2
  83. package/dist/esm/files/cardImageView/index.js +55 -87
  84. package/dist/esm/files/index.js +1 -1
  85. package/dist/esm/index.js +3 -3
  86. package/dist/esm/root/card/cardAnalytics.js +23 -18
  87. package/dist/esm/root/card/cardConstants.js +1 -0
  88. package/dist/esm/root/card/cardSSRView.js +92 -0
  89. package/dist/esm/root/card/cardState.js +32 -0
  90. package/dist/esm/root/card/getCardPreview/cache.js +33 -0
  91. package/dist/esm/root/card/getCardPreview/filePreviewStatus.js +35 -0
  92. package/dist/esm/root/card/getCardPreview/helpers.js +194 -0
  93. package/dist/esm/root/card/getCardPreview/index.js +174 -0
  94. package/dist/esm/root/card/getCardStatus.js +13 -17
  95. package/dist/esm/root/card/index.js +349 -401
  96. package/dist/esm/root/cardView.js +105 -52
  97. package/dist/esm/root/index.js +2 -1
  98. package/dist/esm/root/inline/loader.js +23 -22
  99. package/dist/esm/root/inline/{inlineMediaCard.js → mediaInlineCard.js} +62 -22
  100. package/dist/esm/root/inlinePlayer.js +5 -13
  101. package/dist/esm/root/ui/Breakpoint.js +6 -0
  102. package/dist/esm/root/ui/common.js +1 -7
  103. package/dist/esm/root/ui/iconMessage/index.js +12 -7
  104. package/dist/esm/root/ui/imageRenderer/imageRenderer.js +24 -106
  105. package/dist/esm/root/ui/loadingRateLimited/loadingRateLimited.js +1 -1
  106. package/dist/esm/root/ui/progressBar/progressBar.js +1 -1
  107. package/dist/esm/root/ui/progressBar/styled.js +2 -1
  108. package/dist/esm/root/ui/styled.js +13 -61
  109. package/dist/esm/root/ui/styledSSR.js +76 -0
  110. package/dist/esm/root/ui/titleBox/failedTitleBox.js +6 -3
  111. package/dist/esm/root/ui/titleBox/styled.js +2 -1
  112. package/dist/esm/utils/analytics.js +22 -35
  113. package/dist/esm/utils/dimensionComparer.js +1 -1
  114. package/dist/esm/utils/document.js +3 -0
  115. package/dist/esm/utils/getDataURIDimension.js +8 -0
  116. package/dist/esm/utils/metadata.js +12 -4
  117. package/dist/esm/utils/objectURLCache.js +6 -0
  118. package/dist/esm/utils/resizeModeToMediaImageProps.js +6 -0
  119. package/dist/esm/utils/shouldDisplayImageThumbnail.js +1 -1
  120. package/dist/esm/utils/videoSnapshot.js +31 -0
  121. package/dist/esm/version.json +1 -1
  122. package/dist/types/__tests_external__/page-objects/MediaCard.d.ts +4 -3
  123. package/dist/types/errors.d.ts +24 -2
  124. package/dist/types/files/cardImageView/index.d.ts +5 -12
  125. package/dist/types/files/cardImageView/styled.d.ts +1 -1
  126. package/dist/types/files/index.d.ts +1 -1
  127. package/dist/types/index.d.ts +9 -12
  128. package/dist/types/root/card/cardAnalytics.d.ts +5 -7
  129. package/dist/types/root/card/cardConstants.d.ts +1 -0
  130. package/dist/types/root/card/cardSSRView.d.ts +13 -0
  131. package/dist/types/root/card/cardState.d.ts +5 -0
  132. package/dist/types/root/card/getCardPreview/cache.d.ts +18 -0
  133. package/dist/types/root/card/getCardPreview/filePreviewStatus.d.ts +5 -0
  134. package/dist/types/root/card/getCardPreview/helpers.d.ts +9 -0
  135. package/dist/types/root/card/getCardPreview/index.d.ts +44 -0
  136. package/dist/types/root/card/getCardStatus.d.ts +4 -14
  137. package/dist/types/root/card/index.d.ts +17 -21
  138. package/dist/types/root/cardView.d.ts +12 -8
  139. package/dist/types/root/index.d.ts +1 -0
  140. package/dist/types/root/inline/loader.d.ts +8 -8
  141. package/dist/types/root/inline/{inlineMediaCard.d.ts → mediaInlineCard.d.ts} +4 -4
  142. package/dist/types/root/inlinePlayer.d.ts +1 -1
  143. package/dist/types/root/ui/Breakpoint.d.ts +4 -0
  144. package/dist/types/root/ui/common.d.ts +1 -4
  145. package/dist/types/root/ui/iconMessage/index.d.ts +7 -2
  146. package/dist/types/root/ui/iconWrapper/styled.d.ts +1 -1
  147. package/dist/types/root/ui/imageRenderer/imageRenderer.d.ts +2 -16
  148. package/dist/types/root/ui/loadingRateLimited/loadingRateLimited.d.ts +1 -1
  149. package/dist/types/root/ui/loadingRateLimited/styled.d.ts +1 -1
  150. package/dist/types/root/ui/progressBar/progressBar.d.ts +1 -1
  151. package/dist/types/root/ui/progressBar/styled.d.ts +1 -1
  152. package/dist/types/root/ui/styled.d.ts +3 -10
  153. package/dist/types/root/ui/styledSSR.d.ts +16 -0
  154. package/dist/types/root/ui/titleBox/failedTitleBox.d.ts +3 -1
  155. package/dist/types/root/ui/titleBox/styled.d.ts +1 -1
  156. package/dist/types/root/ui/titleBox/titleBox.d.ts +1 -1
  157. package/dist/types/types.d.ts +15 -1
  158. package/dist/types/utils/analytics.d.ts +20 -21
  159. package/dist/types/utils/cardDimensions.d.ts +5 -1
  160. package/dist/types/utils/dimensionComparer.d.ts +1 -1
  161. package/dist/types/utils/document.d.ts +2 -0
  162. package/dist/types/utils/getDataURIDimension.d.ts +3 -1
  163. package/dist/types/utils/index.d.ts +1 -0
  164. package/dist/types/utils/lazyContent/styled.d.ts +1 -1
  165. package/dist/types/utils/lightCards/types.d.ts +1 -1
  166. package/dist/types/utils/metadata.d.ts +2 -2
  167. package/dist/types/utils/objectURLCache.d.ts +2 -1
  168. package/dist/types/utils/resizeModeToMediaImageProps.d.ts +5 -0
  169. package/dist/types/utils/shouldDisplayImageThumbnail.d.ts +1 -1
  170. package/dist/types/utils/videoSnapshot.d.ts +1 -0
  171. package/example-helpers/index.tsx +21 -0
  172. package/package.json +19 -17
  173. package/dist/cjs/root/card/getCardPreview.js +0 -173
  174. package/dist/cjs/utils/fileAttributesContext.js +0 -40
  175. package/dist/es2019/root/card/getCardPreview.js +0 -86
  176. package/dist/es2019/root/inline/inlineMediaCard.js +0 -92
  177. package/dist/es2019/utils/fileAttributesContext.js +0 -19
  178. package/dist/esm/root/card/getCardPreview.js +0 -153
  179. package/dist/esm/utils/fileAttributesContext.js +0 -18
  180. package/dist/types/root/card/getCardPreview.d.ts +0 -8
  181. package/dist/types/utils/fileAttributesContext.d.ts +0 -10
@@ -12,8 +12,9 @@ import { Wrapper } from './styled';
12
12
  import { createAndFireMediaCardEvent } from '../utils/analytics';
13
13
  import { attachDetailsToActions } from '../actions';
14
14
  import { getErrorMessage } from '../utils/getErrorMessage';
15
- import { toHumanReadableMediaSize } from '@atlaskit/media-ui';
16
- import { NewFileExperienceWrapper, CardImageContainer, calcBreakpointSize } from './ui/styled';
15
+ import { toHumanReadableMediaSize, messages } from '@atlaskit/media-ui';
16
+ import { NewFileExperienceWrapper } from './ui/styled';
17
+ import { CardImageContainer, calcBreakpointSize } from './ui/styledSSR';
17
18
  import { ImageRenderer } from './ui/imageRenderer/imageRenderer';
18
19
  import { TitleBox } from './ui/titleBox/titleBox';
19
20
  import { FailedTitleBox } from './ui/titleBox/failedTitleBox';
@@ -26,10 +27,10 @@ import Tooltip from '@atlaskit/tooltip';
26
27
  import { IconWrapper } from './ui/iconWrapper/styled';
27
28
  import { MimeTypeIcon } from '@atlaskit/media-ui/mime-type-icon';
28
29
  import SpinnerIcon from '@atlaskit/spinner';
29
- import { PreviewUnavailable, CreatingPreview, RateLimited, PreviewCurrentlyUnavailable } from './ui/iconMessage';
30
- import { LoadingRateLimited } from './ui/loadingRateLimited/loadingRateLimited';
30
+ import { PreviewUnavailable, CreatingPreview, FailedToUpload, PreviewCurrentlyUnavailable, FailedToLoad } from './ui/iconMessage';
31
31
  import { isRateLimitedError, isPollingError } from '@atlaskit/media-client';
32
- export const newFileExperienceClassName = 'new-file-experience-wrapper';
32
+ import { newFileExperienceClassName } from './card/cardConstants';
33
+ import { isUploadError } from '../errors';
33
34
 
34
35
  /**
35
36
  * This is classic vanilla CardView class. To create an instance of class one would need to supply
@@ -40,15 +41,37 @@ export class CardViewBase extends React.Component {
40
41
  super(...args);
41
42
 
42
43
  _defineProperty(this, "state", {
43
- isImageFailedToLoad: false
44
+ didImageRender: false
44
45
  });
45
46
 
46
47
  _defineProperty(this, "divRef", /*#__PURE__*/React.createRef());
47
48
 
48
- _defineProperty(this, "onImageLoadError", () => {
49
+ _defineProperty(this, "onImageLoad", () => {
50
+ const {
51
+ onImageLoad
52
+ } = this.props; // We render the icon & icon message always, even if there is dataURI available.
53
+ // If the image fails to load/render, the icon will remain, i.e. the user won't see a change until
54
+ // the root card decides to chage status to error.
55
+ // If the image renders successfully, we switch this variable to hide the icon & icon message
56
+ // behind the thumbnail in case the image has transparency.
57
+ // It is less likely that root component replaces a suceeded dataURI for a failed one
58
+ // than the opposite case. Therefore we prefer to hide the icon instead show when the image fails,
59
+ // for a smoother transition
60
+
61
+ this.setState({
62
+ didImageRender: true
63
+ });
64
+ onImageLoad && onImageLoad();
65
+ });
66
+
67
+ _defineProperty(this, "onImageError", () => {
68
+ const {
69
+ onImageError
70
+ } = this.props;
49
71
  this.setState({
50
- isImageFailedToLoad: true
72
+ didImageRender: false
51
73
  });
74
+ onImageError && onImageError();
52
75
  });
53
76
 
54
77
  _defineProperty(this, "saveElementWidth", () => {
@@ -87,11 +110,10 @@ export class CardViewBase extends React.Component {
87
110
  dataURI
88
111
  } = this.props;
89
112
  const {
90
- mediaType,
91
113
  name
92
114
  } = metadata || {};
93
115
  const shouldUsePointerCursor = status !== 'error' && status !== 'failed-processing';
94
- const shouldDisplayBackground = !dataURI || !disableOverlay;
116
+ const shouldDisplayBackground = !dataURI || !disableOverlay || status === 'error' || status === 'failed-processing';
95
117
  const isPlayButtonClickable = !!(this.shouldRenderPlayButton() && disableOverlay);
96
118
  const isTickBoxSelectable = !disableOverlay && !!selectable && !selected; // Make tooltip optional for media singles - images, videos.
97
119
  // Intention is to show full file name when it's truncate in titlebox,
@@ -106,7 +128,6 @@ export class CardViewBase extends React.Component {
106
128
  onClick: onClick,
107
129
  onMouseEnter: onMouseEnter,
108
130
  innerRef: this.divRef,
109
- mediaType: mediaType,
110
131
  breakpoint: this.breakpoint,
111
132
  shouldUsePointerCursor: shouldUsePointerCursor,
112
133
  disableOverlay: !!disableOverlay,
@@ -166,7 +187,9 @@ export class CardViewBase extends React.Component {
166
187
  actions: actionsWithDetails,
167
188
  disableOverlay: disableOverlay,
168
189
  previewOrientation: previewOrientation,
169
- alt: alt
190
+ alt: alt,
191
+ onImageLoad: this.onImageLoad,
192
+ onImageError: this.onImageError
170
193
  });
171
194
  });
172
195
 
@@ -177,23 +200,23 @@ export class CardViewBase extends React.Component {
177
200
  metadata,
178
201
  disableOverlay,
179
202
  error,
180
- selectable
203
+ selectable,
204
+ disableAnimation
181
205
  } = this.props;
182
206
  const {
183
207
  name,
184
208
  mediaType
185
209
  } = metadata || {};
186
210
  const {
187
- isImageFailedToLoad
211
+ didImageRender
188
212
  } = this.state;
189
213
  const isZeroSize = !!(metadata && metadata.size === 0);
190
214
  const defaultConfig = {
191
- renderTypeIcon: isImageFailedToLoad || !dataURI,
192
- renderImageRenderer: !!dataURI && !isImageFailedToLoad,
215
+ renderTypeIcon: !didImageRender,
216
+ renderImageRenderer: !!dataURI,
193
217
  renderPlayButton: !!dataURI && mediaType === 'video',
194
218
  renderBlanket: !disableOverlay,
195
- renderTitleBox: !!name && !isImageFailedToLoad && !disableOverlay,
196
- renderFailedTitleBox: !!isImageFailedToLoad,
219
+ renderTitleBox: !disableOverlay && !!name,
197
220
  renderTickBox: !disableOverlay && !!selectable
198
221
  };
199
222
 
@@ -206,46 +229,74 @@ export class CardViewBase extends React.Component {
206
229
  };
207
230
 
208
231
  case 'processing':
232
+ case 'loading-preview':
209
233
  return { ...defaultConfig,
210
- iconMessage: (isImageFailedToLoad || !dataURI) && !isZeroSize ? /*#__PURE__*/React.createElement(CreatingPreview, null) : undefined
234
+ iconMessage: !didImageRender && !isZeroSize ? /*#__PURE__*/React.createElement(CreatingPreview, {
235
+ disableAnimation: disableAnimation
236
+ }) : undefined
211
237
  };
212
238
 
213
239
  case 'complete':
214
- return { ...defaultConfig
215
- };
240
+ return defaultConfig;
216
241
 
217
242
  case 'error':
218
- if (error && isPollingError(error)) {
219
- return { ...defaultConfig,
220
- renderTitleBox: !!name,
221
- renderFailedTitleBox: false,
222
- iconMessage: !!metadata && !isZeroSize ? /*#__PURE__*/React.createElement(PreviewCurrentlyUnavailable, null) : undefined
223
- };
224
- } else if (isRateLimitedError(error) && !disableOverlay) {
225
- return {
226
- renderTypeIcon: !!metadata && (isImageFailedToLoad || !dataURI),
227
- renderTitleBox: !!metadata,
228
- iconMessage: !!metadata ? /*#__PURE__*/React.createElement(RateLimited, null) : undefined,
229
- renderLoadingRateLimited: !metadata
243
+ case 'failed-processing':
244
+ const baseErrorConfig = { ...defaultConfig,
245
+ renderTypeIcon: true,
246
+ renderImageRenderer: false,
247
+ renderTitleBox: false,
248
+ renderPlayButton: false
249
+ };
250
+ let iconMessage;
251
+
252
+ if (!!metadata) {
253
+ if (error) {
254
+ const {
255
+ secondaryError
256
+ } = error;
257
+
258
+ if (isRateLimitedError(secondaryError) || secondaryError && isPollingError(secondaryError)) {
259
+ iconMessage = /*#__PURE__*/React.createElement(PreviewCurrentlyUnavailable, null);
260
+ }
261
+ } else if (!isZeroSize) {
262
+ iconMessage = /*#__PURE__*/React.createElement(PreviewUnavailable, null);
263
+ }
264
+ } else if (!!disableOverlay) {
265
+ iconMessage = /*#__PURE__*/React.createElement(FailedToLoad, null);
266
+ }
267
+
268
+ if (error && isUploadError(error)) {
269
+ if (!disableOverlay) {
270
+ return { ...baseErrorConfig,
271
+ renderFailedTitleBox: true,
272
+ customTitleMessage: messages.failed_to_upload
273
+ };
274
+ }
275
+
276
+ return { ...baseErrorConfig,
277
+ renderTitleBox: !metadata && !!name,
278
+ iconMessage: /*#__PURE__*/React.createElement(FailedToUpload, null)
230
279
  };
231
- } else {
232
- return { ...defaultConfig,
233
- renderTitleBox: defaultConfig.renderTitleBox && !!dataURI,
234
- renderFailedTitleBox: !!isImageFailedToLoad || !dataURI
280
+ }
281
+
282
+ if (!disableOverlay) {
283
+ return { ...baseErrorConfig,
284
+ renderTitleBox: !!name,
285
+ renderFailedTitleBox: !metadata,
286
+ iconMessage
235
287
  };
236
288
  }
237
289
 
238
- case 'failed-processing':
239
- return { ...defaultConfig,
240
- renderFailedTitleBox: !!isImageFailedToLoad || !dataURI && !metadata,
241
- iconMessage: !!metadata && !isZeroSize ? /*#__PURE__*/React.createElement(PreviewUnavailable, null) : undefined
290
+ return { ...baseErrorConfig,
291
+ iconMessage
242
292
  };
243
293
 
244
294
  case 'loading':
245
295
  default:
246
296
  return { ...defaultConfig,
297
+ renderPlayButton: false,
247
298
  renderTypeIcon: false,
248
- renderSpinner: true
299
+ renderSpinner: !didImageRender
249
300
  };
250
301
  }
251
302
  });
@@ -263,7 +314,7 @@ export class CardViewBase extends React.Component {
263
314
  renderFailedTitleBox,
264
315
  renderTickBox,
265
316
  isFixedBlanket,
266
- renderLoadingRateLimited
317
+ customTitleMessage
267
318
  } = this.getRenderConfigByStatus();
268
319
  const {
269
320
  progress,
@@ -282,7 +333,7 @@ export class CardViewBase extends React.Component {
282
333
  "data-test-status": status,
283
334
  "data-test-progress": progress,
284
335
  "data-test-selected": selected ? true : undefined
285
- }, 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(!renderTitleBox), renderLoadingRateLimited && /*#__PURE__*/React.createElement(LoadingRateLimited, null), renderTickBox && this.renderTickBox()), this.renderActionsBar());
336
+ }, 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());
286
337
  });
287
338
  }
288
339
 
@@ -299,13 +350,14 @@ export class CardViewBase extends React.Component {
299
350
  }) {
300
351
  const {
301
352
  dataURI
302
- } = this.props;
353
+ } = this.props; // We should only switch didImageRender to false
354
+ // when dataURI goes undefined, not when it is updated.
355
+ // as this method could be triggered after onImageLoad callback,
356
+ // falling on a race condition
303
357
 
304
- if (prevDataURI !== dataURI) {
305
- this.setState({
306
- isImageFailedToLoad: false
307
- });
308
- }
358
+ prevDataURI && !dataURI && this.setState({
359
+ didImageRender: false
360
+ });
309
361
  }
310
362
 
311
363
  // This width is only used to calculate breakpoints, dimensions are passed down as
@@ -424,9 +476,10 @@ export class CardViewBase extends React.Component {
424
476
  });
425
477
  }
426
478
 
427
- renderFailedTitleBox() {
479
+ renderFailedTitleBox(customMessage) {
428
480
  return /*#__PURE__*/React.createElement(FailedTitleBox, {
429
- breakpoint: this.breakpoint
481
+ breakpoint: this.breakpoint,
482
+ customMessage: customMessage
430
483
  });
431
484
  }
432
485
 
@@ -461,7 +514,8 @@ export class CardViewBase extends React.Component {
461
514
  alt: alt,
462
515
  resizeMode: resizeMode,
463
516
  onDisplayImage: onDisplayImage,
464
- onImageError: this.onImageLoadError
517
+ onImageLoad: this.onImageLoad,
518
+ onImageError: this.onImageError
465
519
  });
466
520
  }
467
521
 
@@ -1 +1,2 @@
1
- export { default as Card } from './card/cardLoader';
1
+ export { default as Card } from './card/cardLoader';
2
+ export { default as MediaInlineCard } from './inline/loader';
@@ -1,30 +1,31 @@
1
1
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
2
  import React from 'react';
3
- import { InlineCardResolvingView } from '@atlaskit/media-ui';
4
- export default class InlineMediaCardLoader extends React.PureComponent {
3
+ import { MediaInlineCardLoadingView } from '@atlaskit/media-ui';
4
+ export default class MediaInlineCardLoader extends React.PureComponent {
5
5
  constructor(...args) {
6
6
  super(...args);
7
7
 
8
8
  _defineProperty(this, "state", {
9
- InlineMediaCard: InlineMediaCardLoader.InlineMediaCard
9
+ MediaInlineCard: MediaInlineCardLoader.MediaInlineCard,
10
+ ErrorBoundary: MediaInlineCardLoader.ErrorBoundary
10
11
  });
11
12
  }
12
13
 
13
14
  async componentDidMount() {
14
- if (!this.state.InlineMediaCard) {
15
+ if (!this.state.MediaInlineCard) {
15
16
  try {
16
17
  const [mediaClient, cardModule, mediaCardErrorBoundaryModule] = await Promise.all([import(
17
18
  /* webpackChunkName: "@atlaskit-internal_media-client" */
18
19
  '@atlaskit/media-client'), import(
19
20
  /* webpackChunkName: "@atlaskit-internal_inline-media-card" */
20
- './inlineMediaCard'), import(
21
+ './mediaInlineCard'), import(
21
22
  /* webpackChunkName: "@atlaskit-internal_media-card-error-boundary" */
22
23
  '../media-card-analytics-error-boundary')]);
23
- InlineMediaCardLoader.InlineMediaCard = mediaClient.withMediaClient(cardModule.InlineMediaCard);
24
- InlineMediaCardLoader.ErrorBoundary = mediaCardErrorBoundaryModule.default;
24
+ MediaInlineCardLoader.MediaInlineCard = mediaClient.withMediaClient(cardModule.MediaInlineCard);
25
+ MediaInlineCardLoader.ErrorBoundary = mediaCardErrorBoundaryModule.default;
25
26
  this.setState({
26
- InlineMediaCard: InlineMediaCardLoader.InlineMediaCard,
27
- ErrorBoundary: InlineMediaCardLoader.ErrorBoundary
27
+ MediaInlineCard: MediaInlineCardLoader.MediaInlineCard,
28
+ ErrorBoundary: MediaInlineCardLoader.ErrorBoundary
28
29
  });
29
30
  } catch (error) {}
30
31
  }
@@ -32,19 +33,19 @@ export default class InlineMediaCardLoader extends React.PureComponent {
32
33
 
33
34
  render() {
34
35
  const {
35
- InlineMediaCard,
36
+ MediaInlineCard,
36
37
  ErrorBoundary
37
38
  } = this.state;
38
39
 
39
- if (!InlineMediaCard || !ErrorBoundary) {
40
- return /*#__PURE__*/React.createElement(InlineCardResolvingView, {
41
- url: ""
40
+ if (!MediaInlineCard || !ErrorBoundary) {
41
+ return /*#__PURE__*/React.createElement(MediaInlineCardLoadingView, {
42
+ message: ""
42
43
  });
43
44
  }
44
45
 
45
- return /*#__PURE__*/React.createElement(ErrorBoundary, null, /*#__PURE__*/React.createElement(InlineMediaCard, this.props));
46
+ return /*#__PURE__*/React.createElement(ErrorBoundary, null, /*#__PURE__*/React.createElement(MediaInlineCard, this.props));
46
47
  }
47
48
 
48
49
  }
49
50
 
50
- _defineProperty(InlineMediaCardLoader, "displayName", 'InlineMediaCardLoader');
51
+ _defineProperty(MediaInlineCardLoader, "displayName", 'MediaInlineCardLoader');
@@ -0,0 +1,127 @@
1
+ import React, { useState, useEffect } from 'react';
2
+ import ReactDOM from 'react-dom';
3
+ import { injectIntl } from 'react-intl';
4
+ import { MediaInlineCardLoadedView, MediaInlineCardLoadingView, MediaInlineCardErroredView, messages } from '@atlaskit/media-ui';
5
+ import { MediaTypeIcon } from '@atlaskit/media-ui/media-type-icon';
6
+ import { MediaViewer } from '@atlaskit/media-viewer';
7
+ import Tooltip from '@atlaskit/tooltip';
8
+ import { formatDate } from '@atlaskit/media-ui/formatDate';
9
+ // UI component which renders an inline link in the appropiate state based on a media file
10
+ export const MediaInlineCardInternal = ({
11
+ mediaClient,
12
+ identifier,
13
+ shouldOpenMediaViewer,
14
+ isSelected,
15
+ onClick,
16
+ mediaViewerDataSource,
17
+ intl
18
+ }) => {
19
+ const [fileState, setFileState] = useState();
20
+ const [isErrored, setIsErrored] = useState(false);
21
+ const [isMediaViewerVisible, setMediaViewerVisible] = useState(false);
22
+
23
+ const onMediaInlineCardClick = event => {
24
+ if (shouldOpenMediaViewer) {
25
+ setMediaViewerVisible(true);
26
+ }
27
+
28
+ if (onClick) {
29
+ onClick(event);
30
+ }
31
+ };
32
+
33
+ const onMediaViewerClose = () => setMediaViewerVisible(false);
34
+
35
+ const renderMediaViewer = () => {
36
+ if (isMediaViewerVisible) {
37
+ const dataSource = mediaViewerDataSource || {
38
+ list: []
39
+ };
40
+ return /*#__PURE__*/ReactDOM.createPortal( /*#__PURE__*/React.createElement(MediaViewer, {
41
+ collectionName: identifier.collectionName || '',
42
+ dataSource: dataSource,
43
+ mediaClientConfig: mediaClient.mediaClientConfig,
44
+ selectedItem: identifier,
45
+ onClose: onMediaViewerClose
46
+ }), document.body);
47
+ }
48
+
49
+ return null;
50
+ };
51
+
52
+ useEffect(() => {
53
+ mediaClient.file.getFileState(identifier.id, {
54
+ collectionName: identifier.collectionName
55
+ }).subscribe({
56
+ next: fileState => {
57
+ setFileState(fileState);
58
+ },
59
+ error: () => {
60
+ setIsErrored(true);
61
+ }
62
+ });
63
+ }, [identifier.collectionName, identifier.id, mediaClient.file]);
64
+
65
+ if (!fileState) {
66
+ return /*#__PURE__*/React.createElement(MediaInlineCardLoadingView, {
67
+ message: intl.formatMessage(messages.loading_file)
68
+ });
69
+ }
70
+
71
+ if (isErrored) {
72
+ return /*#__PURE__*/React.createElement(MediaInlineCardErroredView, {
73
+ message: intl.formatMessage(messages.couldnt_load_file)
74
+ });
75
+ }
76
+
77
+ if (fileState.status === 'error') {
78
+ return /*#__PURE__*/React.createElement(MediaInlineCardErroredView, {
79
+ message: fileState.message || ''
80
+ });
81
+ }
82
+
83
+ if (fileState.status === 'failed-processing') {
84
+ return /*#__PURE__*/React.createElement(MediaInlineCardErroredView, {
85
+ message: intl.formatMessage(messages.couldnt_load_file)
86
+ });
87
+ }
88
+
89
+ if (fileState.status === 'uploading') {
90
+ return /*#__PURE__*/React.createElement(MediaInlineCardLoadingView, {
91
+ message: fileState.name
92
+ });
93
+ }
94
+
95
+ const {
96
+ mediaType,
97
+ name
98
+ } = fileState;
99
+ const linkIcon = /*#__PURE__*/React.createElement(MediaTypeIcon, {
100
+ testId: 'media-inline-card-file-type-icon',
101
+ size: "small",
102
+ type: mediaType
103
+ });
104
+ const mediaViewer = renderMediaViewer();
105
+ let formattedDate;
106
+
107
+ if (fileState.createdAt) {
108
+ const {
109
+ locale = 'en'
110
+ } = intl || {
111
+ locale: 'en'
112
+ };
113
+ formattedDate = formatDate(fileState.createdAt, locale);
114
+ }
115
+
116
+ return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Tooltip, {
117
+ position: "bottom",
118
+ content: formattedDate,
119
+ tag: "span"
120
+ }, /*#__PURE__*/React.createElement(MediaInlineCardLoadedView, {
121
+ icon: linkIcon,
122
+ title: name,
123
+ onClick: onMediaInlineCardClick,
124
+ isSelected: isSelected
125
+ })), mediaViewer);
126
+ };
127
+ export const MediaInlineCard = injectIntl(MediaInlineCardInternal);
@@ -7,8 +7,6 @@ import { CustomMediaPlayer, InactivityDetector } from '@atlaskit/media-ui';
7
7
  import { InlinePlayerWrapper } from './styled';
8
8
  import { defaultImageCardDimensions } from '..';
9
9
  import { CardLoading } from '../utils/lightCards/cardLoading';
10
- import { withAnalyticsEvents } from '@atlaskit/analytics-next';
11
- import { createAndFireMediaCardEvent } from '../utils/analytics';
12
10
  export const inlinePlayerClassName = 'media-card-inline-player';
13
11
  export const getPreferredVideoArtifact = fileState => {
14
12
  if (fileState.status === 'processed' || fileState.status === 'processing') {
@@ -193,9 +191,10 @@ export class InlinePlayerBase extends Component {
193
191
  onClick: onClick,
194
192
  innerRef: forwardRef || undefined,
195
193
  dimensions: dimensions
196
- }, /*#__PURE__*/React.createElement(InactivityDetector, null, () => /*#__PURE__*/React.createElement(CustomMediaPlayer, {
194
+ }, /*#__PURE__*/React.createElement(InactivityDetector, null, checkMouseMovement => /*#__PURE__*/React.createElement(CustomMediaPlayer, {
197
195
  type: "video",
198
196
  src: fileSrc,
197
+ fileId: identifier.id,
199
198
  isAutoPlay: true,
200
199
  isHDAvailable: false,
201
200
  onDownloadClick: this.onDownloadClick,
@@ -203,7 +202,8 @@ export class InlinePlayerBase extends Component {
203
202
  lastWatchTimeConfig: {
204
203
  contentId: identifier.id
205
204
  },
206
- originalDimensions: originalDimensions
205
+ originalDimensions: originalDimensions,
206
+ showControls: checkMouseMovement
207
207
  })));
208
208
  }
209
209
 
@@ -218,12 +218,4 @@ const InlinePlayerForwardRef = /*#__PURE__*/React.forwardRef((props, ref) => {
218
218
  forwardRef: ref
219
219
  }));
220
220
  });
221
- export const InlinePlayer = withAnalyticsEvents({
222
- onClick: createAndFireMediaCardEvent({
223
- eventType: 'ui',
224
- action: 'clicked',
225
- actionSubject: 'mediaCard',
226
- actionSubjectId: 'mediaCardInlinePlayer',
227
- attributes: {}
228
- })
229
- })(InlinePlayerForwardRef);
221
+ export const InlinePlayer = InlinePlayerForwardRef;
@@ -0,0 +1,6 @@
1
+ export let Breakpoint;
2
+
3
+ (function (Breakpoint) {
4
+ Breakpoint["SMALL"] = "small";
5
+ Breakpoint["LARGE"] = "large";
6
+ })(Breakpoint || (Breakpoint = {}));
@@ -1,10 +1,4 @@
1
- export let Breakpoint;
2
-
3
- (function (Breakpoint) {
4
- Breakpoint["SMALL"] = "small";
5
- Breakpoint["LARGE"] = "large";
6
- })(Breakpoint || (Breakpoint = {}));
7
-
1
+ import { Breakpoint } from './Breakpoint';
8
2
  export const responsiveSettings = {
9
3
  [Breakpoint.SMALL]: {
10
4
  fontSize: 11,
@@ -13,16 +13,20 @@ export const IconMessage = ({
13
13
  reducedFont: reducedFont
14
14
  }, /*#__PURE__*/React.createElement(FormattedMessage, messageDescriptor));
15
15
  };
16
- export const CreatingPreview = props => /*#__PURE__*/React.createElement(IconMessage, _extends({}, props, {
16
+ export const CreatingPreview = ({
17
+ disableAnimation
18
+ }) => /*#__PURE__*/React.createElement(IconMessage, {
17
19
  messageDescriptor: messages.creating_preview,
18
- animated: true
19
- }));
20
+ animated: !disableAnimation
21
+ });
20
22
  export const PreviewUnavailable = props => /*#__PURE__*/React.createElement(IconMessage, _extends({}, props, {
21
23
  messageDescriptor: messages.preview_unavailable
22
24
  }));
23
- export const RateLimited = props => /*#__PURE__*/React.createElement(IconMessage, _extends({}, props, {
24
- messageDescriptor: messages.preview_rateLimited,
25
- reducedFont: true
25
+ export const FailedToLoad = props => /*#__PURE__*/React.createElement(IconMessage, _extends({}, props, {
26
+ messageDescriptor: messages.failed_to_load
27
+ }));
28
+ export const FailedToUpload = props => /*#__PURE__*/React.createElement(IconMessage, _extends({}, props, {
29
+ messageDescriptor: messages.failed_to_upload
26
30
  }));
27
31
  export const PreviewCurrentlyUnavailable = props => /*#__PURE__*/React.createElement(IconMessage, _extends({}, props, {
28
32
  messageDescriptor: messages.preview_currently_unavailable,