@atlaskit/media-card 71.0.0 → 73.1.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 (204) hide show
  1. package/CHANGELOG.md +104 -0
  2. package/dist/cjs/actions.js +2 -2
  3. package/dist/cjs/errors.js +83 -8
  4. package/dist/cjs/files/cardImageView/cardOverlay/styled.js +1 -1
  5. package/dist/cjs/files/cardImageView/index.js +53 -104
  6. package/dist/cjs/files/cardImageView/styled.js +1 -1
  7. package/dist/cjs/files/index.js +0 -6
  8. package/dist/cjs/index.js +8 -8
  9. package/dist/cjs/root/card/cardAnalytics.js +4 -16
  10. package/dist/cjs/root/card/cardLoader.js +66 -124
  11. package/dist/cjs/root/card/cardState.js +50 -0
  12. package/dist/cjs/root/card/getCardPreview/cache.js +10 -5
  13. package/dist/cjs/root/card/getCardPreview/filePreviewStatus.js +53 -0
  14. package/dist/cjs/root/card/getCardPreview/helpers.js +14 -22
  15. package/dist/cjs/root/card/getCardPreview/index.js +177 -97
  16. package/dist/cjs/root/card/getCardStatus.js +7 -1
  17. package/dist/cjs/root/card/index.js +384 -285
  18. package/dist/cjs/root/cardView.js +113 -88
  19. package/dist/cjs/root/inline/loader.js +47 -15
  20. package/dist/cjs/root/inline/mediaInlineCard.js +33 -12
  21. package/dist/cjs/root/inlinePlayer.js +77 -24
  22. package/dist/cjs/root/styled.js +7 -3
  23. package/dist/cjs/root/ui/actionsBar/styled.js +1 -1
  24. package/dist/cjs/root/ui/blanket/styled.js +1 -1
  25. package/dist/cjs/root/ui/common.js +11 -5
  26. package/dist/cjs/root/ui/iconMessage/index.js +16 -7
  27. package/dist/cjs/root/ui/iconWrapper/styled.js +1 -1
  28. package/dist/cjs/root/ui/imageRenderer/imageRenderer.js +47 -123
  29. package/dist/cjs/root/ui/loadingRateLimited/loadingRateLimited.js +6 -4
  30. package/dist/cjs/root/ui/loadingRateLimited/styled.js +2 -2
  31. package/dist/cjs/root/ui/playButton/styled.js +1 -1
  32. package/dist/cjs/root/ui/progressBar/progressBar.js +7 -4
  33. package/dist/cjs/root/ui/progressBar/styled.js +8 -9
  34. package/dist/cjs/root/ui/styled.js +80 -17
  35. package/dist/cjs/root/ui/tickBox/styled.js +1 -1
  36. package/dist/cjs/root/ui/titleBox/failedTitleBox.js +9 -3
  37. package/dist/cjs/root/ui/titleBox/styled.js +2 -4
  38. package/dist/cjs/root/ui/titleBox/titleBox.js +2 -2
  39. package/dist/cjs/styles/index.js +25 -23
  40. package/dist/cjs/styles/mixins.js +1 -1
  41. package/dist/cjs/utils/analytics.js +7 -44
  42. package/dist/cjs/utils/breakpoint.js +1 -1
  43. package/dist/cjs/utils/cardActions/cardActionsDropdownMenu.js +18 -9
  44. package/dist/cjs/utils/cardActions/index.js +10 -10
  45. package/dist/cjs/utils/cardActions/styled.js +1 -1
  46. package/dist/cjs/utils/cardDimensions.js +1 -1
  47. package/dist/cjs/utils/dimensionComparer.js +1 -1
  48. package/dist/cjs/utils/getErrorMessage.js +2 -2
  49. package/dist/cjs/utils/index.js +46 -46
  50. package/dist/cjs/utils/lightCards/styled.js +1 -1
  51. package/dist/cjs/utils/metadata.js +11 -3
  52. package/dist/cjs/utils/objectURLCache.js +7 -1
  53. package/dist/cjs/utils/shouldDisplayImageThumbnail.js +1 -1
  54. package/dist/cjs/utils/viewportDetector.js +49 -22
  55. package/dist/cjs/version.json +1 -1
  56. package/dist/es2019/errors.js +42 -2
  57. package/dist/es2019/files/cardImageView/index.js +8 -61
  58. package/dist/es2019/files/index.js +1 -1
  59. package/dist/es2019/root/card/cardAnalytics.js +3 -14
  60. package/dist/es2019/root/card/cardLoader.js +47 -53
  61. package/dist/es2019/root/card/cardState.js +26 -0
  62. package/dist/es2019/root/card/getCardPreview/cache.js +5 -0
  63. package/dist/es2019/root/card/getCardPreview/filePreviewStatus.js +38 -0
  64. package/dist/es2019/root/card/getCardPreview/helpers.js +2 -12
  65. package/dist/es2019/root/card/getCardPreview/index.js +112 -73
  66. package/dist/es2019/root/card/getCardStatus.js +1 -0
  67. package/dist/es2019/root/card/index.js +308 -190
  68. package/dist/es2019/root/cardView.js +97 -68
  69. package/dist/es2019/root/inline/loader.js +17 -5
  70. package/dist/es2019/root/inline/mediaInlineCard.js +32 -11
  71. package/dist/es2019/root/inlinePlayer.js +56 -4
  72. package/dist/es2019/root/styled.js +2 -1
  73. package/dist/es2019/root/ui/common.js +7 -1
  74. package/dist/es2019/root/ui/iconMessage/index.js +8 -5
  75. package/dist/es2019/root/ui/imageRenderer/imageRenderer.js +35 -88
  76. package/dist/es2019/root/ui/loadingRateLimited/loadingRateLimited.js +4 -3
  77. package/dist/es2019/root/ui/loadingRateLimited/styled.js +1 -1
  78. package/dist/es2019/root/ui/progressBar/progressBar.js +5 -3
  79. package/dist/es2019/root/ui/progressBar/styled.js +7 -6
  80. package/dist/es2019/root/ui/styled.js +65 -4
  81. package/dist/es2019/root/ui/titleBox/failedTitleBox.js +6 -3
  82. package/dist/es2019/root/ui/titleBox/styled.js +1 -2
  83. package/dist/es2019/root/ui/titleBox/titleBox.js +1 -1
  84. package/dist/es2019/utils/analytics.js +5 -34
  85. package/dist/es2019/utils/cardActions/cardActionsDropdownMenu.js +8 -4
  86. package/dist/es2019/utils/dimensionComparer.js +1 -1
  87. package/dist/es2019/utils/getErrorMessage.js +1 -1
  88. package/dist/es2019/utils/metadata.js +12 -4
  89. package/dist/es2019/utils/objectURLCache.js +5 -0
  90. package/dist/es2019/utils/shouldDisplayImageThumbnail.js +1 -1
  91. package/dist/es2019/utils/viewportDetector.js +48 -18
  92. package/dist/es2019/version.json +1 -1
  93. package/dist/esm/actions.js +2 -2
  94. package/dist/esm/errors.js +64 -4
  95. package/dist/esm/files/cardImageView/index.js +51 -102
  96. package/dist/esm/files/index.js +1 -1
  97. package/dist/esm/root/card/cardAnalytics.js +3 -15
  98. package/dist/esm/root/card/cardLoader.js +66 -126
  99. package/dist/esm/root/card/cardState.js +32 -0
  100. package/dist/esm/root/card/getCardPreview/cache.js +9 -2
  101. package/dist/esm/root/card/getCardPreview/filePreviewStatus.js +38 -0
  102. package/dist/esm/root/card/getCardPreview/helpers.js +13 -21
  103. package/dist/esm/root/card/getCardPreview/index.js +144 -91
  104. package/dist/esm/root/card/getCardStatus.js +3 -0
  105. package/dist/esm/root/card/index.js +396 -288
  106. package/dist/esm/root/cardView.js +113 -86
  107. package/dist/esm/root/inline/loader.js +48 -15
  108. package/dist/esm/root/inline/mediaInlineCard.js +32 -11
  109. package/dist/esm/root/inlinePlayer.js +74 -23
  110. package/dist/esm/root/styled.js +3 -2
  111. package/dist/esm/root/ui/common.js +7 -1
  112. package/dist/esm/root/ui/iconMessage/index.js +10 -5
  113. package/dist/esm/root/ui/imageRenderer/imageRenderer.js +37 -116
  114. package/dist/esm/root/ui/loadingRateLimited/loadingRateLimited.js +4 -3
  115. package/dist/esm/root/ui/loadingRateLimited/styled.js +1 -1
  116. package/dist/esm/root/ui/progressBar/progressBar.js +6 -3
  117. package/dist/esm/root/ui/progressBar/styled.js +7 -7
  118. package/dist/esm/root/ui/styled.js +61 -13
  119. package/dist/esm/root/ui/titleBox/failedTitleBox.js +7 -3
  120. package/dist/esm/root/ui/titleBox/styled.js +1 -2
  121. package/dist/esm/root/ui/titleBox/titleBox.js +1 -1
  122. package/dist/esm/utils/analytics.js +5 -36
  123. package/dist/esm/utils/cardActions/cardActionsDropdownMenu.js +17 -9
  124. package/dist/esm/utils/dimensionComparer.js +1 -1
  125. package/dist/esm/utils/getErrorMessage.js +1 -1
  126. package/dist/esm/utils/metadata.js +12 -4
  127. package/dist/esm/utils/objectURLCache.js +6 -0
  128. package/dist/esm/utils/shouldDisplayImageThumbnail.js +1 -1
  129. package/dist/esm/utils/viewportDetector.js +48 -21
  130. package/dist/esm/version.json +1 -1
  131. package/dist/types/errors.d.ts +15 -1
  132. package/dist/types/files/cardImageView/index.d.ts +4 -13
  133. package/dist/types/files/cardImageView/styled.d.ts +1 -1
  134. package/dist/types/files/index.d.ts +1 -1
  135. package/dist/types/index.d.ts +7 -4
  136. package/dist/types/root/card/cardAnalytics.d.ts +1 -6
  137. package/dist/types/root/card/cardLoader.d.ts +5 -19
  138. package/dist/types/root/card/cardState.d.ts +5 -0
  139. package/dist/types/root/card/getCardPreview/cache.d.ts +3 -1
  140. package/dist/types/root/card/getCardPreview/filePreviewStatus.d.ts +5 -0
  141. package/dist/types/root/card/getCardPreview/helpers.d.ts +3 -4
  142. package/dist/types/root/card/getCardPreview/index.d.ts +24 -14
  143. package/dist/types/root/card/getCardStatus.d.ts +1 -0
  144. package/dist/types/root/card/index.d.ts +20 -18
  145. package/dist/types/root/cardView.d.ts +13 -8
  146. package/dist/types/root/inline/loader.d.ts +2 -0
  147. package/dist/types/root/inline/mediaInlineCard.d.ts +3 -5
  148. package/dist/types/root/inlinePlayer.d.ts +8 -1
  149. package/dist/types/root/styled.d.ts +1 -0
  150. package/dist/types/root/ui/common.d.ts +4 -1
  151. package/dist/types/root/ui/iconMessage/index.d.ts +4 -3
  152. package/dist/types/root/ui/iconWrapper/styled.d.ts +1 -1
  153. package/dist/types/root/ui/imageRenderer/imageRenderer.d.ts +14 -15
  154. package/dist/types/root/ui/loadingRateLimited/loadingRateLimited.d.ts +2 -1
  155. package/dist/types/root/ui/loadingRateLimited/styled.d.ts +1 -1
  156. package/dist/types/root/ui/playButton/playButton.d.ts +1 -0
  157. package/dist/types/root/ui/progressBar/progressBar.d.ts +4 -2
  158. package/dist/types/root/ui/progressBar/styled.d.ts +3 -2
  159. package/dist/types/root/ui/styled.d.ts +10 -3
  160. package/dist/types/root/ui/tickBox/tickBox.d.ts +1 -0
  161. package/dist/types/root/ui/titleBox/failedTitleBox.d.ts +3 -1
  162. package/dist/types/root/ui/titleBox/styled.d.ts +1 -1
  163. package/dist/types/root/ui/titleBox/titleBox.d.ts +2 -10
  164. package/dist/types/styles/mixins.d.ts +1 -1
  165. package/dist/types/types.d.ts +7 -1
  166. package/dist/types/utils/analytics.d.ts +6 -15
  167. package/dist/types/utils/cardDimensions.d.ts +4 -4
  168. package/dist/types/utils/dimensionComparer.d.ts +1 -1
  169. package/dist/types/utils/getErrorMessage.d.ts +1 -0
  170. package/dist/types/utils/metadata.d.ts +2 -2
  171. package/dist/types/utils/objectURLCache.d.ts +2 -1
  172. package/dist/types/utils/viewportDetector.d.ts +13 -5
  173. package/example-helpers/developmentUseMessage.tsx +14 -0
  174. package/example-helpers/index.tsx +55 -4
  175. package/example-helpers/selectableCard.tsx +2 -1
  176. package/package.json +18 -16
  177. package/dist/cjs/root/card/cardSSRView.js +0 -112
  178. package/dist/cjs/root/card/getCardPreview/types.js +0 -5
  179. package/dist/cjs/root/ui/Breakpoint.js +0 -13
  180. package/dist/cjs/root/ui/styledSSR.js +0 -108
  181. package/dist/cjs/utils/fileAttributesContext.js +0 -40
  182. package/dist/cjs/utils/lazyContent/index.js +0 -56
  183. package/dist/cjs/utils/lazyContent/styled.js +0 -23
  184. package/dist/es2019/root/card/cardSSRView.js +0 -92
  185. package/dist/es2019/root/card/getCardPreview/types.js +0 -1
  186. package/dist/es2019/root/ui/Breakpoint.js +0 -6
  187. package/dist/es2019/root/ui/styledSSR.js +0 -93
  188. package/dist/es2019/utils/fileAttributesContext.js +0 -19
  189. package/dist/es2019/utils/lazyContent/index.js +0 -18
  190. package/dist/es2019/utils/lazyContent/styled.js +0 -12
  191. package/dist/esm/root/card/cardSSRView.js +0 -91
  192. package/dist/esm/root/card/getCardPreview/types.js +0 -1
  193. package/dist/esm/root/ui/Breakpoint.js +0 -6
  194. package/dist/esm/root/ui/styledSSR.js +0 -76
  195. package/dist/esm/utils/fileAttributesContext.js +0 -18
  196. package/dist/esm/utils/lazyContent/index.js +0 -41
  197. package/dist/esm/utils/lazyContent/styled.js +0 -14
  198. package/dist/types/root/card/cardSSRView.d.ts +0 -13
  199. package/dist/types/root/card/getCardPreview/types.d.ts +0 -5
  200. package/dist/types/root/ui/Breakpoint.d.ts +0 -4
  201. package/dist/types/root/ui/styledSSR.d.ts +0 -16
  202. package/dist/types/utils/fileAttributesContext.d.ts +0 -10
  203. package/dist/types/utils/lazyContent/index.d.ts +0 -11
  204. package/dist/types/utils/lazyContent/styled.d.ts +0 -5
@@ -12,9 +12,8 @@ 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 } from './ui/styled';
17
- import { CardImageContainer, calcBreakpointSize } from './ui/styledSSR';
15
+ import { toHumanReadableMediaSize, messages } from '@atlaskit/media-ui';
16
+ import { NewFileExperienceWrapper, CardImageContainer, calcBreakpointSize } from './ui/styled';
18
17
  import { ImageRenderer } from './ui/imageRenderer/imageRenderer';
19
18
  import { TitleBox } from './ui/titleBox/titleBox';
20
19
  import { FailedTitleBox } from './ui/titleBox/failedTitleBox';
@@ -27,10 +26,10 @@ import Tooltip from '@atlaskit/tooltip';
27
26
  import { IconWrapper } from './ui/iconWrapper/styled';
28
27
  import { MimeTypeIcon } from '@atlaskit/media-ui/mime-type-icon';
29
28
  import SpinnerIcon from '@atlaskit/spinner';
30
- import { PreviewUnavailable, CreatingPreview, RateLimited, PreviewCurrentlyUnavailable } from './ui/iconMessage';
31
- import { LoadingRateLimited } from './ui/loadingRateLimited/loadingRateLimited';
29
+ import { PreviewUnavailable, CreatingPreview, FailedToUpload, PreviewCurrentlyUnavailable, FailedToLoad } from './ui/iconMessage';
32
30
  import { isRateLimitedError, isPollingError } from '@atlaskit/media-client';
33
31
  import { newFileExperienceClassName } from './card/cardConstants';
32
+ import { isUploadError } from '../errors';
34
33
 
35
34
  /**
36
35
  * This is classic vanilla CardView class. To create an instance of class one would need to supply
@@ -41,15 +40,37 @@ export class CardViewBase extends React.Component {
41
40
  super(...args);
42
41
 
43
42
  _defineProperty(this, "state", {
44
- isImageFailedToLoad: false
43
+ didImageRender: false
45
44
  });
46
45
 
47
46
  _defineProperty(this, "divRef", /*#__PURE__*/React.createRef());
48
47
 
49
- _defineProperty(this, "onImageLoadError", () => {
48
+ _defineProperty(this, "onImageLoad", () => {
49
+ const {
50
+ onImageLoad
51
+ } = this.props; // We render the icon & icon message always, even if there is dataURI available.
52
+ // If the image fails to load/render, the icon will remain, i.e. the user won't see a change until
53
+ // the root card decides to chage status to error.
54
+ // If the image renders successfully, we switch this variable to hide the icon & icon message
55
+ // behind the thumbnail in case the image has transparency.
56
+ // It is less likely that root component replaces a suceeded dataURI for a failed one
57
+ // than the opposite case. Therefore we prefer to hide the icon instead show when the image fails,
58
+ // for a smoother transition
59
+
60
+ this.setState({
61
+ didImageRender: true
62
+ });
63
+ onImageLoad && onImageLoad();
64
+ });
65
+
66
+ _defineProperty(this, "onImageError", () => {
67
+ const {
68
+ onImageError
69
+ } = this.props;
50
70
  this.setState({
51
- isImageFailedToLoad: true
71
+ didImageRender: false
52
72
  });
73
+ onImageError && onImageError();
53
74
  });
54
75
 
55
76
  _defineProperty(this, "saveElementWidth", () => {
@@ -91,13 +112,11 @@ export class CardViewBase extends React.Component {
91
112
  name
92
113
  } = metadata || {};
93
114
  const shouldUsePointerCursor = status !== 'error' && status !== 'failed-processing';
94
- const shouldDisplayBackground = !dataURI || !disableOverlay;
115
+ const shouldDisplayBackground = !dataURI || !disableOverlay || status === 'error' || status === 'failed-processing';
95
116
  const isPlayButtonClickable = !!(this.shouldRenderPlayButton() && disableOverlay);
96
- const isTickBoxSelectable = !disableOverlay && !!selectable && !selected; // Make tooltip optional for media singles - images, videos.
97
- // Intention is to show full file name when it's truncate in titlebox,
98
- // and to hide it when no titlebox exists.
117
+ const isTickBoxSelectable = !disableOverlay && !!selectable && !selected; // Disable tooltip for Media Single
99
118
 
100
- const shouldDisplayTooltip = !!name && !disableOverlay;
119
+ const shouldDisplayTooltip = !disableOverlay;
101
120
  return /*#__PURE__*/React.createElement(NewFileExperienceWrapper, {
102
121
  className: newFileExperienceClassName,
103
122
  "data-testid": testId || 'media-card-view',
@@ -136,8 +155,7 @@ export class CardViewBase extends React.Component {
136
155
  previewOrientation,
137
156
  alt,
138
157
  onDisplayImage,
139
- actions,
140
- timeElapsedTillCommenced
158
+ actions
141
159
  } = this.props;
142
160
  const {
143
161
  name,
@@ -167,7 +185,8 @@ export class CardViewBase extends React.Component {
167
185
  disableOverlay: disableOverlay,
168
186
  previewOrientation: previewOrientation,
169
187
  alt: alt,
170
- timeElapsedTillCommenced: timeElapsedTillCommenced
188
+ onImageLoad: this.onImageLoad,
189
+ onImageError: this.onImageError
171
190
  });
172
191
  });
173
192
 
@@ -186,16 +205,15 @@ export class CardViewBase extends React.Component {
186
205
  mediaType
187
206
  } = metadata || {};
188
207
  const {
189
- isImageFailedToLoad
208
+ didImageRender
190
209
  } = this.state;
191
210
  const isZeroSize = !!(metadata && metadata.size === 0);
192
211
  const defaultConfig = {
193
- renderTypeIcon: isImageFailedToLoad || !dataURI,
194
- renderImageRenderer: !!dataURI && !isImageFailedToLoad,
212
+ renderTypeIcon: !didImageRender,
213
+ renderImageRenderer: !!dataURI,
195
214
  renderPlayButton: !!dataURI && mediaType === 'video',
196
215
  renderBlanket: !disableOverlay,
197
- renderTitleBox: !!name && !disableOverlay,
198
- renderFailedTitleBox: !!isImageFailedToLoad && !metadata,
216
+ renderTitleBox: !disableOverlay && !!name,
199
217
  renderTickBox: !disableOverlay && !!selectable
200
218
  };
201
219
 
@@ -210,55 +228,59 @@ export class CardViewBase extends React.Component {
210
228
  case 'processing':
211
229
  case 'loading-preview':
212
230
  return { ...defaultConfig,
213
- iconMessage: (isImageFailedToLoad || !dataURI) && !isZeroSize ? /*#__PURE__*/React.createElement(CreatingPreview, {
231
+ iconMessage: !didImageRender && !isZeroSize ? /*#__PURE__*/React.createElement(CreatingPreview, {
214
232
  disableAnimation: disableAnimation
215
233
  }) : undefined
216
234
  };
217
235
 
218
236
  case 'complete':
219
- return { ...defaultConfig,
220
- iconMessage: !!isImageFailedToLoad && !!metadata ? /*#__PURE__*/React.createElement(PreviewUnavailable, null) : undefined
221
- };
237
+ return defaultConfig;
222
238
 
223
239
  case 'error':
224
- if (error && isPollingError(error)) {
225
- return { ...defaultConfig,
226
- renderTypeIcon: true,
227
- renderImageRenderer: false,
228
- renderTitleBox: !!name,
229
- renderFailedTitleBox: false,
230
- iconMessage: !!metadata && !isZeroSize ? /*#__PURE__*/React.createElement(PreviewCurrentlyUnavailable, null) : undefined
231
- };
232
- } else if (isRateLimitedError(error) && !disableOverlay) {
233
- return {
234
- renderTypeIcon: !!metadata,
235
- renderTitleBox: !!metadata,
236
- iconMessage: !!metadata ? /*#__PURE__*/React.createElement(RateLimited, null) : undefined,
237
- renderLoadingRateLimited: !metadata
238
- };
240
+ case 'failed-processing':
241
+ const baseErrorConfig = { ...defaultConfig,
242
+ renderTypeIcon: true,
243
+ renderImageRenderer: false,
244
+ renderTitleBox: false,
245
+ renderPlayButton: false
246
+ };
247
+ let iconMessage;
248
+ let customTitleMessage;
249
+ const {
250
+ secondaryError
251
+ } = error || {};
252
+
253
+ if (isRateLimitedError(secondaryError) || isPollingError(secondaryError)) {
254
+ iconMessage = /*#__PURE__*/React.createElement(PreviewCurrentlyUnavailable, null);
255
+ } else if (isUploadError(error)) {
256
+ iconMessage = /*#__PURE__*/React.createElement(FailedToUpload, null);
257
+ customTitleMessage = messages.failed_to_upload;
258
+ } else if (!metadata) {
259
+ iconMessage = /*#__PURE__*/React.createElement(FailedToLoad, null);
239
260
  } else {
240
- return { ...defaultConfig,
241
- renderTypeIcon: true,
242
- renderImageRenderer: false,
243
- renderTitleBox: false,
244
- renderFailedTitleBox: true
261
+ iconMessage = /*#__PURE__*/React.createElement(PreviewUnavailable, null);
262
+ }
263
+
264
+ if (!disableOverlay) {
265
+ const renderFailedTitleBox = !name || !!customTitleMessage;
266
+ return { ...baseErrorConfig,
267
+ renderTitleBox: !!name && !customTitleMessage,
268
+ renderFailedTitleBox,
269
+ iconMessage: !renderFailedTitleBox ? iconMessage : undefined,
270
+ customTitleMessage
245
271
  };
246
272
  }
247
273
 
248
- case 'failed-processing':
249
- return { ...defaultConfig,
250
- renderTypeIcon: true,
251
- renderImageRenderer: false,
252
- renderTitleBox: !!name && !disableOverlay,
253
- renderFailedTitleBox: !metadata,
254
- iconMessage: !!metadata && !isZeroSize ? /*#__PURE__*/React.createElement(PreviewUnavailable, null) : undefined
274
+ return { ...baseErrorConfig,
275
+ iconMessage
255
276
  };
256
277
 
257
278
  case 'loading':
258
279
  default:
259
280
  return { ...defaultConfig,
281
+ renderPlayButton: false,
260
282
  renderTypeIcon: false,
261
- renderSpinner: true
283
+ renderSpinner: !didImageRender
262
284
  };
263
285
  }
264
286
  });
@@ -276,7 +298,7 @@ export class CardViewBase extends React.Component {
276
298
  renderFailedTitleBox,
277
299
  renderTickBox,
278
300
  isFixedBlanket,
279
- renderLoadingRateLimited
301
+ customTitleMessage
280
302
  } = this.getRenderConfigByStatus();
281
303
  const {
282
304
  progress,
@@ -295,7 +317,7 @@ export class CardViewBase extends React.Component {
295
317
  "data-test-status": status,
296
318
  "data-test-progress": progress,
297
319
  "data-test-selected": selected ? true : undefined
298
- }, 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());
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(customTitleMessage), renderProgressBar && this.renderProgressBar(!hasTitleBox), renderTickBox && this.renderTickBox()), this.renderActionsBar());
299
321
  });
300
322
  }
301
323
 
@@ -312,13 +334,14 @@ export class CardViewBase extends React.Component {
312
334
  }) {
313
335
  const {
314
336
  dataURI
315
- } = this.props;
337
+ } = this.props; // We should only switch didImageRender to false
338
+ // when dataURI goes undefined, not when it is updated.
339
+ // as this method could be triggered after onImageLoad callback,
340
+ // falling on a race condition
316
341
 
317
- if (prevDataURI !== dataURI) {
318
- this.setState({
319
- isImageFailedToLoad: false
320
- });
321
- }
342
+ prevDataURI && !dataURI && this.setState({
343
+ didImageRender: false
344
+ });
322
345
  }
323
346
 
324
347
  // This width is only used to calculate breakpoints, dimensions are passed down as
@@ -437,9 +460,10 @@ export class CardViewBase extends React.Component {
437
460
  });
438
461
  }
439
462
 
440
- renderFailedTitleBox() {
463
+ renderFailedTitleBox(customMessage) {
441
464
  return /*#__PURE__*/React.createElement(FailedTitleBox, {
442
- breakpoint: this.breakpoint
465
+ breakpoint: this.breakpoint,
466
+ customMessage: customMessage
443
467
  });
444
468
  }
445
469
 
@@ -464,19 +488,24 @@ export class CardViewBase extends React.Component {
464
488
  alt,
465
489
  resizeMode,
466
490
  onDisplayImage,
467
- mediaItemType,
468
- timeElapsedTillCommenced
491
+ nativeLazyLoad,
492
+ forceSyncDisplay
469
493
  } = this.props;
494
+ const {
495
+ didImageRender
496
+ } = this.state;
470
497
  return !!dataURI && /*#__PURE__*/React.createElement(ImageRenderer, {
471
498
  dataURI: dataURI,
472
499
  mediaType: mediaType,
473
- mediaItemType: mediaItemType,
474
500
  previewOrientation: previewOrientation,
475
501
  alt: alt,
476
502
  resizeMode: resizeMode,
477
503
  onDisplayImage: onDisplayImage,
478
- onImageError: this.onImageLoadError,
479
- timeElapsedTillCommenced: timeElapsedTillCommenced
504
+ onImageLoad: this.onImageLoad,
505
+ onImageError: this.onImageError,
506
+ nativeLazyLoad: nativeLazyLoad,
507
+ forceSyncDisplay: forceSyncDisplay,
508
+ isImageVisible: forceSyncDisplay || didImageRender
480
509
  });
481
510
  }
482
511
 
@@ -5,12 +5,17 @@ export default class MediaInlineCardLoader extends React.PureComponent {
5
5
  constructor(...args) {
6
6
  super(...args);
7
7
 
8
+ _defineProperty(this, "isMounted", false);
9
+
8
10
  _defineProperty(this, "state", {
9
- MediaInlineCard: MediaInlineCardLoader.MediaInlineCard
11
+ MediaInlineCard: MediaInlineCardLoader.MediaInlineCard,
12
+ ErrorBoundary: MediaInlineCardLoader.ErrorBoundary
10
13
  });
11
14
  }
12
15
 
13
16
  async componentDidMount() {
17
+ this.isMounted = true;
18
+
14
19
  if (!this.state.MediaInlineCard) {
15
20
  try {
16
21
  const [mediaClient, cardModule, mediaCardErrorBoundaryModule] = await Promise.all([import(
@@ -22,14 +27,21 @@ export default class MediaInlineCardLoader extends React.PureComponent {
22
27
  '../media-card-analytics-error-boundary')]);
23
28
  MediaInlineCardLoader.MediaInlineCard = mediaClient.withMediaClient(cardModule.MediaInlineCard);
24
29
  MediaInlineCardLoader.ErrorBoundary = mediaCardErrorBoundaryModule.default;
25
- this.setState({
26
- MediaInlineCard: MediaInlineCardLoader.MediaInlineCard,
27
- ErrorBoundary: MediaInlineCardLoader.ErrorBoundary
28
- });
30
+
31
+ if (this.isMounted) {
32
+ this.setState({
33
+ MediaInlineCard: MediaInlineCardLoader.MediaInlineCard,
34
+ ErrorBoundary: MediaInlineCardLoader.ErrorBoundary
35
+ });
36
+ }
29
37
  } catch (error) {}
30
38
  }
31
39
  }
32
40
 
41
+ async componentWillUnmount() {
42
+ this.isMounted = false;
43
+ }
44
+
33
45
  render() {
34
46
  const {
35
47
  MediaInlineCard,
@@ -1,6 +1,6 @@
1
1
  import React, { useState, useEffect } from 'react';
2
2
  import ReactDOM from 'react-dom';
3
- import { injectIntl } from 'react-intl';
3
+ import { injectIntl, IntlProvider, createIntl } from 'react-intl-next';
4
4
  import { MediaInlineCardLoadedView, MediaInlineCardLoadingView, MediaInlineCardErroredView, messages } from '@atlaskit/media-ui';
5
5
  import { MediaTypeIcon } from '@atlaskit/media-ui/media-type-icon';
6
6
  import { MediaViewer } from '@atlaskit/media-viewer';
@@ -49,46 +49,64 @@ export const MediaInlineCardInternal = ({
49
49
  return null;
50
50
  };
51
51
 
52
+ const renderContent = children => {
53
+ return intl ? children : /*#__PURE__*/React.createElement(IntlProvider, {
54
+ locale: "en"
55
+ }, children);
56
+ };
57
+
58
+ const defaultIntl = createIntl({
59
+ locale: 'en'
60
+ });
52
61
  useEffect(() => {
53
- mediaClient.file.getFileState(identifier.id, {
62
+ const subscription = mediaClient.file.getFileState(identifier.id, {
54
63
  collectionName: identifier.collectionName
55
64
  }).subscribe({
56
65
  next: fileState => {
57
66
  setFileState(fileState);
67
+ setIsErrored(false);
58
68
  },
59
69
  error: () => {
60
70
  setIsErrored(true);
61
71
  }
62
72
  });
73
+ return () => {
74
+ subscription.unsubscribe();
75
+ };
63
76
  }, [identifier.collectionName, identifier.id, mediaClient.file]);
64
77
 
65
78
  if (!fileState) {
66
79
  return /*#__PURE__*/React.createElement(MediaInlineCardLoadingView, {
67
- message: intl.formatMessage(messages.loading_file)
80
+ message: (intl || defaultIntl).formatMessage(messages.loading_file),
81
+ isSelected: isSelected
68
82
  });
69
83
  }
70
84
 
71
85
  if (isErrored) {
72
86
  return /*#__PURE__*/React.createElement(MediaInlineCardErroredView, {
73
- message: intl.formatMessage(messages.couldnt_load_file)
87
+ message: (intl || defaultIntl).formatMessage(messages.couldnt_load_file),
88
+ isSelected: isSelected
74
89
  });
75
90
  }
76
91
 
77
92
  if (fileState.status === 'error') {
78
93
  return /*#__PURE__*/React.createElement(MediaInlineCardErroredView, {
79
- message: fileState.message || ''
94
+ message: fileState.message || '',
95
+ isSelected: isSelected
80
96
  });
81
97
  }
82
98
 
83
99
  if (fileState.status === 'failed-processing') {
84
100
  return /*#__PURE__*/React.createElement(MediaInlineCardErroredView, {
85
- message: intl.formatMessage(messages.couldnt_load_file)
101
+ message: (intl || defaultIntl).formatMessage(messages.couldnt_load_file),
102
+ isSelected: isSelected
86
103
  });
87
104
  }
88
105
 
89
106
  if (fileState.status === 'uploading') {
90
107
  return /*#__PURE__*/React.createElement(MediaInlineCardLoadingView, {
91
- message: fileState.name
108
+ message: fileState.name,
109
+ isSelected: isSelected
92
110
  });
93
111
  }
94
112
 
@@ -113,14 +131,17 @@ export const MediaInlineCardInternal = ({
113
131
  formattedDate = formatDate(fileState.createdAt, locale);
114
132
  }
115
133
 
116
- return /*#__PURE__*/React.createElement(Tooltip, {
134
+ return renderContent( /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Tooltip, {
117
135
  position: "bottom",
118
- content: formattedDate
136
+ content: formattedDate,
137
+ tag: "span"
119
138
  }, /*#__PURE__*/React.createElement(MediaInlineCardLoadedView, {
120
139
  icon: linkIcon,
121
140
  title: name,
122
141
  onClick: onMediaInlineCardClick,
123
142
  isSelected: isSelected
124
- }), mediaViewer);
143
+ })), mediaViewer));
125
144
  };
126
- export const MediaInlineCard = injectIntl(MediaInlineCardInternal);
145
+ export const MediaInlineCard = injectIntl(MediaInlineCardInternal, {
146
+ enforceContext: false
147
+ });
@@ -7,6 +7,10 @@ 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 { ProgressBar } from './ui/progressBar/progressBar';
11
+ import { calcBreakpointSize } from './ui/styled';
12
+ import { isValidPercentageUnit } from '../utils/isValidPercentageUnit';
13
+ import { getElementDimension } from '../utils/getElementDimension';
10
14
  export const inlinePlayerClassName = 'media-card-inline-player';
11
15
  export const getPreferredVideoArtifact = fileState => {
12
16
  if (fileState.status === 'processed' || fileState.status === 'processing') {
@@ -29,6 +33,8 @@ export class InlinePlayerBase extends Component {
29
33
 
30
34
  _defineProperty(this, "state", {});
31
35
 
36
+ _defineProperty(this, "divRef", /*#__PURE__*/React.createRef());
37
+
32
38
  _defineProperty(this, "setFileSrc", fileSrc => {
33
39
  this.setState({
34
40
  fileSrc
@@ -93,9 +99,31 @@ export class InlinePlayerBase extends Component {
93
99
  viewingLevel: 'full'
94
100
  });
95
101
  });
102
+
103
+ _defineProperty(this, "saveElementWidth", () => {
104
+ const {
105
+ dimensions
106
+ } = this.props;
107
+
108
+ if (!dimensions) {
109
+ return;
110
+ }
111
+
112
+ const {
113
+ width
114
+ } = dimensions;
115
+
116
+ if (width && isValidPercentageUnit(width) && !!this.divRef.current) {
117
+ const elementWidth = getElementDimension(this.divRef.current, 'width');
118
+ this.setState({
119
+ elementWidth
120
+ });
121
+ }
122
+ });
96
123
  }
97
124
 
98
125
  componentDidMount() {
126
+ this.saveElementWidth();
99
127
  const {
100
128
  mediaClient,
101
129
  identifier
@@ -110,6 +138,17 @@ export class InlinePlayerBase extends Component {
110
138
  collectionName
111
139
  }).subscribe({
112
140
  next: async fileState => {
141
+ if (fileState.status === 'uploading') {
142
+ this.setState({
143
+ isUploading: true,
144
+ progress: fileState.progress
145
+ });
146
+ } else {
147
+ this.setState({
148
+ isUploading: false
149
+ });
150
+ }
151
+
113
152
  const {
114
153
  fileSrc: existingFileSrc
115
154
  } = this.state; // we want to reuse the existing fileSrc to prevent re renders
@@ -163,6 +202,11 @@ export class InlinePlayerBase extends Component {
163
202
  this.revoke();
164
203
  }
165
204
 
205
+ get breakpoint() {
206
+ const width = this.state.elementWidth || (this.props.dimensions ? this.props.dimensions.width : '') || defaultImageCardDimensions.width;
207
+ return calcBreakpointSize(parseInt(`${width}`, 10));
208
+ }
209
+
166
210
  render() {
167
211
  const {
168
212
  onClick,
@@ -171,10 +215,13 @@ export class InlinePlayerBase extends Component {
171
215
  selected,
172
216
  testId,
173
217
  identifier,
174
- forwardRef
218
+ forwardRef,
219
+ autoplay
175
220
  } = this.props;
176
221
  const {
177
- fileSrc
222
+ fileSrc,
223
+ isUploading,
224
+ progress
178
225
  } = this.state;
179
226
 
180
227
  if (!fileSrc) {
@@ -195,7 +242,7 @@ export class InlinePlayerBase extends Component {
195
242
  type: "video",
196
243
  src: fileSrc,
197
244
  fileId: identifier.id,
198
- isAutoPlay: true,
245
+ isAutoPlay: autoplay,
199
246
  isHDAvailable: false,
200
247
  onDownloadClick: this.onDownloadClick,
201
248
  onFirstPlay: this.onFirstPlay,
@@ -204,7 +251,12 @@ export class InlinePlayerBase extends Component {
204
251
  },
205
252
  originalDimensions: originalDimensions,
206
253
  showControls: checkMouseMovement
207
- })));
254
+ })), isUploading ? /*#__PURE__*/React.createElement(ProgressBar, {
255
+ progress: progress,
256
+ breakpoint: this.breakpoint,
257
+ positionBottom: true,
258
+ showOnTop: true
259
+ }) : null);
208
260
  }
209
261
 
210
262
  }
@@ -42,4 +42,5 @@ export const InlinePlayerWrapper = styled.div`
42
42
  height: 100%;
43
43
  }
44
44
  `;
45
- InlinePlayerWrapper.displayName = 'InlinePlayerWrapper';
45
+ InlinePlayerWrapper.displayName = 'InlinePlayerWrapper';
46
+ export const FormattedMessageWrapper = styled.span``;
@@ -1,4 +1,10 @@
1
- import { Breakpoint } from './Breakpoint';
1
+ export let Breakpoint;
2
+
3
+ (function (Breakpoint) {
4
+ Breakpoint["SMALL"] = "small";
5
+ Breakpoint["LARGE"] = "large";
6
+ })(Breakpoint || (Breakpoint = {}));
7
+
2
8
  export const responsiveSettings = {
3
9
  [Breakpoint.SMALL]: {
4
10
  fontSize: 11,
@@ -2,7 +2,8 @@ import _extends from "@babel/runtime/helpers/extends";
2
2
  import React from 'react';
3
3
  import { IconMessageWrapper } from './styled';
4
4
  import { messages } from '@atlaskit/media-ui';
5
- import { FormattedMessage } from 'react-intl';
5
+ import { FormattedMessage } from 'react-intl-next';
6
+ import { FormattedMessageWrapper } from '../../styled';
6
7
  export const IconMessage = ({
7
8
  messageDescriptor,
8
9
  animated = false,
@@ -11,7 +12,7 @@ export const IconMessage = ({
11
12
  return /*#__PURE__*/React.createElement(IconMessageWrapper, {
12
13
  animated: animated,
13
14
  reducedFont: reducedFont
14
- }, /*#__PURE__*/React.createElement(FormattedMessage, messageDescriptor));
15
+ }, /*#__PURE__*/React.createElement(FormattedMessageWrapper, null, /*#__PURE__*/React.createElement(FormattedMessage, messageDescriptor)));
15
16
  };
16
17
  export const CreatingPreview = ({
17
18
  disableAnimation
@@ -22,9 +23,11 @@ export const CreatingPreview = ({
22
23
  export const PreviewUnavailable = props => /*#__PURE__*/React.createElement(IconMessage, _extends({}, props, {
23
24
  messageDescriptor: messages.preview_unavailable
24
25
  }));
25
- export const RateLimited = props => /*#__PURE__*/React.createElement(IconMessage, _extends({}, props, {
26
- messageDescriptor: messages.preview_rateLimited,
27
- reducedFont: true
26
+ export const FailedToLoad = props => /*#__PURE__*/React.createElement(IconMessage, _extends({}, props, {
27
+ messageDescriptor: messages.failed_to_load
28
+ }));
29
+ export const FailedToUpload = props => /*#__PURE__*/React.createElement(IconMessage, _extends({}, props, {
30
+ messageDescriptor: messages.failed_to_upload
28
31
  }));
29
32
  export const PreviewCurrentlyUnavailable = props => /*#__PURE__*/React.createElement(IconMessage, _extends({}, props, {
30
33
  messageDescriptor: messages.preview_currently_unavailable,