@atlaskit/media-card 70.11.0 → 73.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 (197) hide show
  1. package/CHANGELOG.md +104 -0
  2. package/dist/cjs/errors.js +78 -5
  3. package/dist/cjs/files/cardImageView/cardOverlay/styled.js +1 -1
  4. package/dist/cjs/files/cardImageView/index.js +53 -104
  5. package/dist/cjs/files/cardImageView/styled.js +1 -1
  6. package/dist/cjs/files/index.js +0 -6
  7. package/dist/cjs/index.js +12 -6
  8. package/dist/cjs/root/card/cardAnalytics.js +11 -17
  9. package/dist/cjs/root/card/cardLoader.js +66 -124
  10. package/dist/cjs/root/card/cardState.js +50 -0
  11. package/dist/cjs/root/card/getCardPreview/cache.js +6 -1
  12. package/dist/cjs/root/card/getCardPreview/filePreviewStatus.js +53 -0
  13. package/dist/cjs/root/card/getCardPreview/helpers.js +14 -22
  14. package/dist/cjs/root/card/getCardPreview/index.js +176 -102
  15. package/dist/cjs/root/card/getCardStatus.js +7 -1
  16. package/dist/cjs/root/card/index.js +361 -281
  17. package/dist/cjs/root/cardView.js +109 -86
  18. package/dist/cjs/root/index.js +9 -1
  19. package/dist/cjs/root/inline/loader.js +22 -21
  20. package/dist/cjs/root/inline/{inlineMediaCard.js → mediaInlineCard.js} +84 -26
  21. package/dist/cjs/root/inlinePlayer.js +4 -3
  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 +34 -124
  29. package/dist/cjs/root/ui/loadingRateLimited/loadingRateLimited.js +6 -4
  30. package/dist/cjs/root/ui/loadingRateLimited/styled.js +1 -1
  31. package/dist/cjs/root/ui/playButton/styled.js +1 -1
  32. package/dist/cjs/root/ui/progressBar/progressBar.js +2 -2
  33. package/dist/cjs/root/ui/progressBar/styled.js +2 -4
  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 +21 -43
  42. package/dist/cjs/utils/breakpoint.js +1 -1
  43. package/dist/cjs/utils/cardActions/cardActionsDropdownMenu.js +16 -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 +1 -1
  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/index.js +1 -1
  60. package/dist/es2019/root/card/cardAnalytics.js +7 -15
  61. package/dist/es2019/root/card/cardLoader.js +47 -53
  62. package/dist/es2019/root/card/cardState.js +26 -0
  63. package/dist/es2019/root/card/getCardPreview/cache.js +5 -0
  64. package/dist/es2019/root/card/getCardPreview/filePreviewStatus.js +38 -0
  65. package/dist/es2019/root/card/getCardPreview/helpers.js +2 -12
  66. package/dist/es2019/root/card/getCardPreview/index.js +112 -79
  67. package/dist/es2019/root/card/getCardStatus.js +1 -0
  68. package/dist/es2019/root/card/index.js +285 -190
  69. package/dist/es2019/root/cardView.js +93 -68
  70. package/dist/es2019/root/index.js +2 -1
  71. package/dist/es2019/root/inline/loader.js +16 -15
  72. package/dist/es2019/root/inline/mediaInlineCard.js +143 -0
  73. package/dist/es2019/root/inlinePlayer.js +3 -2
  74. package/dist/es2019/root/styled.js +2 -1
  75. package/dist/es2019/root/ui/common.js +7 -1
  76. package/dist/es2019/root/ui/iconMessage/index.js +8 -5
  77. package/dist/es2019/root/ui/imageRenderer/imageRenderer.js +25 -88
  78. package/dist/es2019/root/ui/loadingRateLimited/loadingRateLimited.js +4 -3
  79. package/dist/es2019/root/ui/progressBar/progressBar.js +1 -1
  80. package/dist/es2019/root/ui/progressBar/styled.js +1 -2
  81. package/dist/es2019/root/ui/styled.js +64 -3
  82. package/dist/es2019/root/ui/titleBox/failedTitleBox.js +6 -3
  83. package/dist/es2019/root/ui/titleBox/styled.js +1 -2
  84. package/dist/es2019/root/ui/titleBox/titleBox.js +1 -1
  85. package/dist/es2019/utils/analytics.js +15 -34
  86. package/dist/es2019/utils/cardActions/cardActionsDropdownMenu.js +8 -4
  87. package/dist/es2019/utils/dimensionComparer.js +1 -1
  88. package/dist/es2019/utils/getErrorMessage.js +1 -1
  89. package/dist/es2019/utils/metadata.js +12 -4
  90. package/dist/es2019/utils/objectURLCache.js +5 -0
  91. package/dist/es2019/utils/shouldDisplayImageThumbnail.js +1 -1
  92. package/dist/es2019/version.json +1 -1
  93. package/dist/esm/errors.js +60 -1
  94. package/dist/esm/files/cardImageView/index.js +51 -102
  95. package/dist/esm/files/index.js +1 -1
  96. package/dist/esm/index.js +1 -1
  97. package/dist/esm/root/card/cardAnalytics.js +7 -16
  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 +6 -0
  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 +142 -95
  104. package/dist/esm/root/card/getCardStatus.js +3 -0
  105. package/dist/esm/root/card/index.js +370 -284
  106. package/dist/esm/root/cardView.js +109 -84
  107. package/dist/esm/root/index.js +2 -1
  108. package/dist/esm/root/inline/loader.js +23 -22
  109. package/dist/esm/root/inline/mediaInlineCard.js +156 -0
  110. package/dist/esm/root/inlinePlayer.js +3 -2
  111. package/dist/esm/root/styled.js +3 -2
  112. package/dist/esm/root/ui/common.js +7 -1
  113. package/dist/esm/root/ui/iconMessage/index.js +10 -5
  114. package/dist/esm/root/ui/imageRenderer/imageRenderer.js +27 -118
  115. package/dist/esm/root/ui/loadingRateLimited/loadingRateLimited.js +4 -3
  116. package/dist/esm/root/ui/progressBar/progressBar.js +1 -1
  117. package/dist/esm/root/ui/progressBar/styled.js +1 -2
  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 +16 -35
  123. package/dist/esm/utils/cardActions/cardActionsDropdownMenu.js +16 -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/version.json +1 -1
  130. package/dist/types/errors.d.ts +15 -1
  131. package/dist/types/files/cardImageView/index.d.ts +4 -13
  132. package/dist/types/files/cardImageView/styled.d.ts +1 -1
  133. package/dist/types/files/index.d.ts +1 -1
  134. package/dist/types/index.d.ts +7 -5
  135. package/dist/types/root/card/cardAnalytics.d.ts +2 -6
  136. package/dist/types/root/card/cardLoader.d.ts +5 -19
  137. package/dist/types/root/card/cardState.d.ts +5 -0
  138. package/dist/types/root/card/getCardPreview/cache.d.ts +3 -1
  139. package/dist/types/root/card/getCardPreview/filePreviewStatus.d.ts +5 -0
  140. package/dist/types/root/card/getCardPreview/helpers.d.ts +3 -4
  141. package/dist/types/root/card/getCardPreview/index.d.ts +24 -14
  142. package/dist/types/root/card/getCardStatus.d.ts +1 -0
  143. package/dist/types/root/card/index.d.ts +19 -18
  144. package/dist/types/root/cardView.d.ts +13 -8
  145. package/dist/types/root/index.d.ts +1 -0
  146. package/dist/types/root/inline/loader.d.ts +8 -8
  147. package/dist/types/root/inline/{inlineMediaCard.d.ts → mediaInlineCard.d.ts} +4 -6
  148. package/dist/types/root/inlinePlayer.d.ts +1 -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 +5 -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 +2 -1
  158. package/dist/types/root/ui/progressBar/styled.d.ts +1 -1
  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 +14 -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/example-helpers/developmentUseMessage.tsx +14 -0
  173. package/example-helpers/index.tsx +55 -4
  174. package/example-helpers/selectableCard.tsx +2 -1
  175. package/package.json +20 -16
  176. package/dist/cjs/root/card/cardSSRView.js +0 -99
  177. package/dist/cjs/root/card/getCardPreview/types.js +0 -5
  178. package/dist/cjs/root/ui/Breakpoint.js +0 -13
  179. package/dist/cjs/root/ui/styledSSR.js +0 -108
  180. package/dist/cjs/utils/fileAttributesContext.js +0 -40
  181. package/dist/es2019/root/card/cardSSRView.js +0 -79
  182. package/dist/es2019/root/card/getCardPreview/types.js +0 -1
  183. package/dist/es2019/root/inline/inlineMediaCard.js +0 -92
  184. package/dist/es2019/root/ui/Breakpoint.js +0 -6
  185. package/dist/es2019/root/ui/styledSSR.js +0 -93
  186. package/dist/es2019/utils/fileAttributesContext.js +0 -19
  187. package/dist/esm/root/card/cardSSRView.js +0 -78
  188. package/dist/esm/root/card/getCardPreview/types.js +0 -1
  189. package/dist/esm/root/inline/inlineMediaCard.js +0 -100
  190. package/dist/esm/root/ui/Breakpoint.js +0 -6
  191. package/dist/esm/root/ui/styledSSR.js +0 -76
  192. package/dist/esm/utils/fileAttributesContext.js +0 -18
  193. package/dist/types/root/card/cardSSRView.d.ts +0 -12
  194. package/dist/types/root/card/getCardPreview/types.d.ts +0 -5
  195. package/dist/types/root/ui/Breakpoint.d.ts +0 -4
  196. package/dist/types/root/ui/styledSSR.d.ts +0 -16
  197. package/dist/types/utils/fileAttributesContext.d.ts +0 -10
@@ -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,20 @@ 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;
470
494
  return !!dataURI && /*#__PURE__*/React.createElement(ImageRenderer, {
471
495
  dataURI: dataURI,
472
496
  mediaType: mediaType,
473
- mediaItemType: mediaItemType,
474
497
  previewOrientation: previewOrientation,
475
498
  alt: alt,
476
499
  resizeMode: resizeMode,
477
500
  onDisplayImage: onDisplayImage,
478
- onImageError: this.onImageLoadError,
479
- timeElapsedTillCommenced: timeElapsedTillCommenced
501
+ onImageLoad: this.onImageLoad,
502
+ onImageError: this.onImageError,
503
+ nativeLazyLoad: nativeLazyLoad,
504
+ forceSyncDisplay: forceSyncDisplay
480
505
  });
481
506
  }
482
507
 
@@ -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,143 @@
1
+ import React, { useState, useEffect } from 'react';
2
+ import ReactDOM from 'react-dom';
3
+ import { injectIntl, IntlProvider, createIntl } from 'react-intl-next';
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
+ 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
+ });
61
+ useEffect(() => {
62
+ mediaClient.file.getFileState(identifier.id, {
63
+ collectionName: identifier.collectionName
64
+ }).subscribe({
65
+ next: fileState => {
66
+ setFileState(fileState);
67
+ },
68
+ error: () => {
69
+ setIsErrored(true);
70
+ }
71
+ });
72
+ }, [identifier.collectionName, identifier.id, mediaClient.file]);
73
+
74
+ if (!fileState) {
75
+ return /*#__PURE__*/React.createElement(MediaInlineCardLoadingView, {
76
+ message: (intl || defaultIntl).formatMessage(messages.loading_file),
77
+ isSelected: isSelected
78
+ });
79
+ }
80
+
81
+ if (isErrored) {
82
+ return /*#__PURE__*/React.createElement(MediaInlineCardErroredView, {
83
+ message: (intl || defaultIntl).formatMessage(messages.couldnt_load_file),
84
+ isSelected: isSelected
85
+ });
86
+ }
87
+
88
+ if (fileState.status === 'error') {
89
+ return /*#__PURE__*/React.createElement(MediaInlineCardErroredView, {
90
+ message: fileState.message || '',
91
+ isSelected: isSelected
92
+ });
93
+ }
94
+
95
+ if (fileState.status === 'failed-processing') {
96
+ return /*#__PURE__*/React.createElement(MediaInlineCardErroredView, {
97
+ message: (intl || defaultIntl).formatMessage(messages.couldnt_load_file),
98
+ isSelected: isSelected
99
+ });
100
+ }
101
+
102
+ if (fileState.status === 'uploading') {
103
+ return /*#__PURE__*/React.createElement(MediaInlineCardLoadingView, {
104
+ message: fileState.name,
105
+ isSelected: isSelected
106
+ });
107
+ }
108
+
109
+ const {
110
+ mediaType,
111
+ name
112
+ } = fileState;
113
+ const linkIcon = /*#__PURE__*/React.createElement(MediaTypeIcon, {
114
+ testId: 'media-inline-card-file-type-icon',
115
+ size: "small",
116
+ type: mediaType
117
+ });
118
+ const mediaViewer = renderMediaViewer();
119
+ let formattedDate;
120
+
121
+ if (fileState.createdAt) {
122
+ const {
123
+ locale = 'en'
124
+ } = intl || {
125
+ locale: 'en'
126
+ };
127
+ formattedDate = formatDate(fileState.createdAt, locale);
128
+ }
129
+
130
+ return renderContent( /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(Tooltip, {
131
+ position: "bottom",
132
+ content: formattedDate,
133
+ tag: "span"
134
+ }, /*#__PURE__*/React.createElement(MediaInlineCardLoadedView, {
135
+ icon: linkIcon,
136
+ title: name,
137
+ onClick: onMediaInlineCardClick,
138
+ isSelected: isSelected
139
+ })), mediaViewer));
140
+ };
141
+ export const MediaInlineCard = injectIntl(MediaInlineCardInternal, {
142
+ enforceContext: false
143
+ });
@@ -191,7 +191,7 @@ export class InlinePlayerBase extends Component {
191
191
  onClick: onClick,
192
192
  innerRef: forwardRef || undefined,
193
193
  dimensions: dimensions
194
- }, /*#__PURE__*/React.createElement(InactivityDetector, null, () => /*#__PURE__*/React.createElement(CustomMediaPlayer, {
194
+ }, /*#__PURE__*/React.createElement(InactivityDetector, null, checkMouseMovement => /*#__PURE__*/React.createElement(CustomMediaPlayer, {
195
195
  type: "video",
196
196
  src: fileSrc,
197
197
  fileId: identifier.id,
@@ -202,7 +202,8 @@ export class InlinePlayerBase extends Component {
202
202
  lastWatchTimeConfig: {
203
203
  contentId: identifier.id
204
204
  },
205
- originalDimensions: originalDimensions
205
+ originalDimensions: originalDimensions,
206
+ showControls: checkMouseMovement
206
207
  })));
207
208
  }
208
209
 
@@ -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,