@atlaskit/media-card 70.10.0 → 72.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 (150) hide show
  1. package/CHANGELOG.md +79 -0
  2. package/dist/cjs/errors.js +76 -5
  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/cardLoader.js +66 -124
  9. package/dist/cjs/root/card/cardState.js +50 -0
  10. package/dist/cjs/root/card/getCardPreview/cache.js +5 -0
  11. package/dist/cjs/root/card/getCardPreview/filePreviewStatus.js +50 -0
  12. package/dist/cjs/root/card/getCardPreview/helpers.js +13 -21
  13. package/dist/cjs/root/card/getCardPreview/index.js +171 -100
  14. package/dist/cjs/root/card/getCardStatus.js +7 -1
  15. package/dist/cjs/root/card/index.js +407 -322
  16. package/dist/cjs/root/cardView.js +115 -76
  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} +72 -25
  20. package/dist/cjs/root/inlinePlayer.js +5 -15
  21. package/dist/cjs/root/ui/iconMessage/index.js +17 -9
  22. package/dist/cjs/root/ui/imageRenderer/imageRenderer.js +36 -115
  23. package/dist/cjs/root/ui/styled.js +1 -1
  24. package/dist/cjs/root/ui/titleBox/failedTitleBox.js +7 -3
  25. package/dist/cjs/utils/analytics.js +26 -43
  26. package/dist/cjs/utils/cardActions/cardActionsDropdownMenu.js +16 -9
  27. package/dist/cjs/utils/dimensionComparer.js +1 -1
  28. package/dist/cjs/utils/document.js +12 -0
  29. package/dist/cjs/utils/getDataURIDimension.js +13 -2
  30. package/dist/cjs/utils/metadata.js +11 -3
  31. package/dist/cjs/utils/objectURLCache.js +6 -0
  32. package/dist/cjs/utils/resizeModeToMediaImageProps.js +13 -0
  33. package/dist/cjs/utils/shouldDisplayImageThumbnail.js +1 -1
  34. package/dist/cjs/version.json +1 -1
  35. package/dist/es2019/errors.js +42 -2
  36. package/dist/es2019/files/cardImageView/index.js +12 -46
  37. package/dist/es2019/files/index.js +1 -1
  38. package/dist/es2019/index.js +3 -3
  39. package/dist/es2019/root/card/cardAnalytics.js +23 -17
  40. package/dist/es2019/root/card/cardConstants.js +1 -0
  41. package/dist/es2019/root/card/cardLoader.js +47 -53
  42. package/dist/es2019/root/card/cardState.js +26 -0
  43. package/dist/es2019/root/card/getCardPreview/cache.js +5 -0
  44. package/dist/es2019/root/card/getCardPreview/filePreviewStatus.js +35 -0
  45. package/dist/es2019/root/card/getCardPreview/helpers.js +2 -12
  46. package/dist/es2019/root/card/getCardPreview/index.js +112 -79
  47. package/dist/es2019/root/card/getCardStatus.js +1 -0
  48. package/dist/es2019/root/card/index.js +356 -254
  49. package/dist/es2019/root/cardView.js +98 -58
  50. package/dist/es2019/root/index.js +2 -1
  51. package/dist/es2019/root/inline/loader.js +16 -15
  52. package/dist/es2019/root/inline/mediaInlineCard.js +132 -0
  53. package/dist/es2019/root/inlinePlayer.js +5 -13
  54. package/dist/es2019/root/ui/iconMessage/index.js +10 -6
  55. package/dist/es2019/root/ui/imageRenderer/imageRenderer.js +26 -74
  56. package/dist/es2019/root/ui/styled.js +1 -0
  57. package/dist/es2019/root/ui/titleBox/failedTitleBox.js +5 -3
  58. package/dist/es2019/utils/analytics.js +29 -40
  59. package/dist/es2019/utils/cardActions/cardActionsDropdownMenu.js +8 -4
  60. package/dist/es2019/utils/dimensionComparer.js +1 -1
  61. package/dist/es2019/utils/document.js +1 -0
  62. package/dist/es2019/utils/getDataURIDimension.js +8 -0
  63. package/dist/es2019/utils/metadata.js +12 -4
  64. package/dist/es2019/utils/objectURLCache.js +5 -0
  65. package/dist/es2019/utils/resizeModeToMediaImageProps.js +6 -0
  66. package/dist/es2019/utils/shouldDisplayImageThumbnail.js +1 -1
  67. package/dist/es2019/version.json +1 -1
  68. package/dist/esm/errors.js +60 -1
  69. package/dist/esm/files/cardImageView/index.js +55 -87
  70. package/dist/esm/files/index.js +1 -1
  71. package/dist/esm/index.js +3 -3
  72. package/dist/esm/root/card/cardAnalytics.js +23 -18
  73. package/dist/esm/root/card/cardConstants.js +1 -0
  74. package/dist/esm/root/card/cardLoader.js +66 -126
  75. package/dist/esm/root/card/cardState.js +32 -0
  76. package/dist/esm/root/card/getCardPreview/cache.js +6 -0
  77. package/dist/esm/root/card/getCardPreview/filePreviewStatus.js +35 -0
  78. package/dist/esm/root/card/getCardPreview/helpers.js +13 -21
  79. package/dist/esm/root/card/getCardPreview/index.js +142 -95
  80. package/dist/esm/root/card/getCardStatus.js +3 -0
  81. package/dist/esm/root/card/index.js +416 -325
  82. package/dist/esm/root/cardView.js +114 -73
  83. package/dist/esm/root/index.js +2 -1
  84. package/dist/esm/root/inline/loader.js +23 -22
  85. package/dist/esm/root/inline/mediaInlineCard.js +145 -0
  86. package/dist/esm/root/inlinePlayer.js +5 -13
  87. package/dist/esm/root/ui/iconMessage/index.js +12 -7
  88. package/dist/esm/root/ui/imageRenderer/imageRenderer.js +28 -106
  89. package/dist/esm/root/ui/styled.js +1 -1
  90. package/dist/esm/root/ui/titleBox/failedTitleBox.js +6 -3
  91. package/dist/esm/utils/analytics.js +22 -35
  92. package/dist/esm/utils/cardActions/cardActionsDropdownMenu.js +16 -9
  93. package/dist/esm/utils/dimensionComparer.js +1 -1
  94. package/dist/esm/utils/document.js +3 -0
  95. package/dist/esm/utils/getDataURIDimension.js +8 -0
  96. package/dist/esm/utils/metadata.js +12 -4
  97. package/dist/esm/utils/objectURLCache.js +6 -0
  98. package/dist/esm/utils/resizeModeToMediaImageProps.js +6 -0
  99. package/dist/esm/utils/shouldDisplayImageThumbnail.js +1 -1
  100. package/dist/esm/version.json +1 -1
  101. package/dist/types/errors.d.ts +15 -1
  102. package/dist/types/files/cardImageView/index.d.ts +5 -12
  103. package/dist/types/files/cardImageView/styled.d.ts +1 -1
  104. package/dist/types/files/index.d.ts +1 -1
  105. package/dist/types/index.d.ts +11 -13
  106. package/dist/types/root/card/cardAnalytics.d.ts +5 -7
  107. package/dist/types/root/card/cardConstants.d.ts +1 -0
  108. package/dist/types/root/card/cardLoader.d.ts +4 -18
  109. package/dist/types/root/card/cardState.d.ts +5 -0
  110. package/dist/types/root/card/getCardPreview/cache.d.ts +4 -2
  111. package/dist/types/root/card/getCardPreview/filePreviewStatus.d.ts +5 -0
  112. package/dist/types/root/card/getCardPreview/helpers.d.ts +4 -5
  113. package/dist/types/root/card/getCardPreview/index.d.ts +25 -14
  114. package/dist/types/root/card/getCardStatus.d.ts +1 -0
  115. package/dist/types/root/card/index.d.ts +18 -15
  116. package/dist/types/root/cardView.d.ts +14 -8
  117. package/dist/types/root/index.d.ts +1 -0
  118. package/dist/types/root/inline/loader.d.ts +8 -8
  119. package/dist/types/root/inline/{inlineMediaCard.d.ts → mediaInlineCard.d.ts} +4 -4
  120. package/dist/types/root/inlinePlayer.d.ts +1 -1
  121. package/dist/types/root/ui/iconMessage/index.d.ts +7 -2
  122. package/dist/types/root/ui/imageRenderer/imageRenderer.d.ts +5 -18
  123. package/dist/types/root/ui/titleBox/failedTitleBox.d.ts +2 -0
  124. package/dist/types/types.d.ts +9 -1
  125. package/dist/types/utils/analytics.d.ts +20 -21
  126. package/dist/types/utils/cardDimensions.d.ts +5 -1
  127. package/dist/types/utils/dimensionComparer.d.ts +1 -1
  128. package/dist/types/utils/document.d.ts +2 -0
  129. package/dist/types/utils/getDataURIDimension.d.ts +3 -1
  130. package/dist/types/utils/index.d.ts +1 -0
  131. package/dist/types/utils/lazyContent/styled.d.ts +1 -1
  132. package/dist/types/utils/lightCards/types.d.ts +1 -1
  133. package/dist/types/utils/metadata.d.ts +2 -2
  134. package/dist/types/utils/objectURLCache.d.ts +2 -1
  135. package/dist/types/utils/resizeModeToMediaImageProps.d.ts +5 -0
  136. package/dist/types/utils/shouldDisplayImageThumbnail.d.ts +1 -1
  137. package/example-helpers/developmentUseMessage.tsx +14 -0
  138. package/example-helpers/index.tsx +55 -4
  139. package/example-helpers/selectableCard.tsx +2 -1
  140. package/package.json +18 -14
  141. package/dist/cjs/root/card/getCardPreview/types.js +0 -5
  142. package/dist/cjs/utils/fileAttributesContext.js +0 -40
  143. package/dist/es2019/root/card/getCardPreview/types.js +0 -1
  144. package/dist/es2019/root/inline/inlineMediaCard.js +0 -92
  145. package/dist/es2019/utils/fileAttributesContext.js +0 -19
  146. package/dist/esm/root/card/getCardPreview/types.js +0 -1
  147. package/dist/esm/root/inline/inlineMediaCard.js +0 -100
  148. package/dist/esm/utils/fileAttributesContext.js +0 -18
  149. package/dist/types/root/card/getCardPreview/types.d.ts +0 -5
  150. package/dist/types/utils/fileAttributesContext.d.ts +0 -10
@@ -27,13 +27,53 @@ export class RemotePreviewError extends MediaCardError {
27
27
  this.secondaryError = secondaryError;
28
28
  }
29
29
 
30
+ }
31
+ export class SsrPreviewError extends MediaCardError {
32
+ constructor(primaryReason, secondaryError) {
33
+ super(primaryReason, secondaryError);
34
+ this.primaryReason = primaryReason;
35
+ this.secondaryError = secondaryError;
36
+ }
37
+
38
+ }
39
+ export const getImageLoadPrimaryReason = source => {
40
+ switch (source) {
41
+ case 'cache-remote':
42
+ return 'cache-remote-uri';
43
+
44
+ case 'cache-local':
45
+ return 'cache-local-uri';
46
+
47
+ case 'external':
48
+ return 'external-uri';
49
+
50
+ case 'local':
51
+ return 'local-uri';
52
+
53
+ case 'remote':
54
+ return 'remote-uri';
55
+ // This fail reason will come from a bug, most likely.
56
+
57
+ default:
58
+ return `unknown-uri`;
59
+ }
60
+ };
61
+ export class ImageLoadError extends MediaCardError {
62
+ constructor(source) {
63
+ super(getImageLoadPrimaryReason(source));
64
+ }
65
+
30
66
  }
31
67
  export function isMediaCardError(err) {
32
68
  return err instanceof MediaCardError;
33
69
  }
34
70
  export const isLocalPreviewError = err => err instanceof LocalPreviewError;
35
71
  export const isRemotePreviewError = err => err instanceof RemotePreviewError;
36
- export const isUnsupportedLocalPreviewError = err => isMediaCardError(err) && err.primaryReason === 'local-preview-unsupported'; // In a try/catch statement, the error caught is the type of any.
72
+ export const isUnsupportedLocalPreviewError = err => isMediaCardError(err) && err.primaryReason === 'local-preview-unsupported';
73
+ export function isImageLoadError(err) {
74
+ return err instanceof ImageLoadError;
75
+ } // In a try/catch statement, the error caught is the type of any.
37
76
  // We can use this helper to ensure that the error handled is the type of MediaCardError if unsure
38
77
 
39
- export const ensureMediaCardError = (primaryReason, error) => isMediaCardError(error) ? error : new MediaCardError(primaryReason, error);
78
+ export const ensureMediaCardError = (primaryReason, error) => isMediaCardError(error) ? error : new MediaCardError(primaryReason, error);
79
+ export const isUploadError = error => error && error.primaryReason === 'upload';
@@ -9,11 +9,9 @@ import { CardLoading } from '../../utils/lightCards/cardLoading';
9
9
  import { shouldDisplayImageThumbnail } from '../../utils/shouldDisplayImageThumbnail';
10
10
  import { ProgressBar } from '../../utils/progressBar';
11
11
  import CardActions from '../../utils/cardActions';
12
- import { withAnalyticsEvents } from '@atlaskit/analytics-next';
13
- import { fireMediaCardEvent, RenderEventAction, getRenderSucceededEventPayload, getRenderFailedFileUriPayload, getRenderFailedExternalUriPayload } from '../../utils/analytics';
14
- import { withFileAttributes } from '../../utils/fileAttributesContext';
15
12
  export const fileCardImageViewSelector = 'media-file-card-view';
16
- export class FileCardImageViewBase extends Component {
13
+ export const fileCardImageViewSelectedSelector = 'media-file-card-view-selected';
14
+ export class FileCardImageView extends Component {
17
15
  constructor(...args) {
18
16
  super(...args);
19
17
 
@@ -34,7 +32,7 @@ export class FileCardImageViewBase extends Component {
34
32
  // immediately, even if there's no image preview
35
33
 
36
34
 
37
- const isZeroSize = fileSize === '' && status === 'processing';
35
+ const isZeroSize = fileSize === '' && ['processing', 'loading-preview'].includes(status);
38
36
 
39
37
  if (mediaType !== 'video' && !this.isFileCardImageReadyForDisplay && !isZeroSize) {
40
38
  return this.renderLoadingContents();
@@ -140,36 +138,6 @@ export class FileCardImageViewBase extends Component {
140
138
  })));
141
139
  });
142
140
 
143
- _defineProperty(this, "onImageLoad", () => {
144
- const {
145
- createAnalyticsEvent,
146
- fileAttributes
147
- } = this.props;
148
-
149
- if (fileAttributes && this.shouldFireEvent(RenderEventAction.SUCCEEDED)) {
150
- fireMediaCardEvent(getRenderSucceededEventPayload(fileAttributes), createAnalyticsEvent);
151
- }
152
- });
153
-
154
- _defineProperty(this, "onImageError", () => {
155
- const {
156
- fileAttributes
157
- } = this.props;
158
-
159
- if (fileAttributes && this.shouldFireEvent(RenderEventAction.FAILED)) {
160
- const {
161
- createAnalyticsEvent,
162
- mediaItemType
163
- } = this.props;
164
-
165
- if (mediaItemType === 'file') {
166
- fireMediaCardEvent(getRenderFailedFileUriPayload(fileAttributes), createAnalyticsEvent);
167
- } else if (mediaItemType === 'external-image') {
168
- fireMediaCardEvent(getRenderFailedExternalUriPayload(fileAttributes), createAnalyticsEvent);
169
- }
170
- }
171
- });
172
-
173
141
  _defineProperty(this, "renderMediaImage", () => {
174
142
  const {
175
143
  status,
@@ -179,7 +147,9 @@ export class FileCardImageViewBase extends Component {
179
147
  mimeType,
180
148
  previewOrientation,
181
149
  onDisplayImage,
182
- alt
150
+ alt,
151
+ onImageLoad,
152
+ onImageError
183
153
  } = this.props;
184
154
 
185
155
  if (!shouldDisplayImageThumbnail(status, mediaItemType, dataURI, mediaType, mimeType)) {
@@ -197,13 +167,11 @@ export class FileCardImageViewBase extends Component {
197
167
  crop: this.isCropped,
198
168
  stretch: this.isStretched,
199
169
  previewOrientation: previewOrientation,
200
- onImageLoad: this.onImageLoad,
201
- onImageError: this.onImageError
170
+ onImageLoad: onImageLoad,
171
+ onImageError: onImageError
202
172
  });
203
173
  });
204
174
 
205
- _defineProperty(this, "shouldFireEvent", action => !this.lastAnalyticsAction || this.lastAnalyticsAction !== action);
206
-
207
175
  _defineProperty(this, "renderProgressBar", () => {
208
176
  const {
209
177
  mediaName,
@@ -298,7 +266,7 @@ export class FileCardImageViewBase extends Component {
298
266
  selectable: selectable,
299
267
  selected: selected,
300
268
  mediaType: mediaType,
301
- className: fileCardImageViewSelector
269
+ className: `${fileCardImageViewSelector} ${selected ? fileCardImageViewSelectedSelector : ''}`
302
270
  }, this.renderCardContents());
303
271
  }
304
272
 
@@ -307,7 +275,7 @@ export class FileCardImageViewBase extends Component {
307
275
  dataURI,
308
276
  status
309
277
  } = this.props;
310
- return !!dataURI || !['loading', 'processing'].includes(status);
278
+ return !!dataURI || !['loading', 'processing', 'loading-preview'].includes(status);
311
279
  }
312
280
 
313
281
  get isCropped() {
@@ -326,9 +294,7 @@ export class FileCardImageViewBase extends Component {
326
294
 
327
295
  }
328
296
 
329
- _defineProperty(FileCardImageViewBase, "defaultProps", {
297
+ _defineProperty(FileCardImageView, "defaultProps", {
330
298
  resizeMode: 'crop',
331
299
  disableOverlay: false
332
- });
333
-
334
- export const FileCardImageView = withAnalyticsEvents()(withFileAttributes(FileCardImageViewBase));
300
+ });
@@ -1 +1 @@
1
- export { FileCardImageView, FileCardImageViewBase } from './cardImageView';
1
+ export { FileCardImageView } from './cardImageView';
@@ -1,7 +1,7 @@
1
- export { default as Card } from './root/card/cardLoader';
1
+ export { Card, MediaInlineCard } from './root';
2
2
  export { CardLoading } from './utils/lightCards/cardLoading';
3
3
  export { CardError } from './utils/lightCards/cardError';
4
4
  export { defaultImageCardDimensions } from './utils/cardDimensions';
5
- export { fileCardImageViewSelector } from './files/cardImageView';
5
+ export { fileCardImageViewSelector, fileCardImageViewSelectedSelector } from './files/cardImageView';
6
6
  export { inlinePlayerClassName } from './root/inlinePlayer';
7
- export { newFileExperienceClassName } from './root/cardView';
7
+ export { newFileExperienceClassName } from './root/card/cardConstants';
@@ -1,30 +1,36 @@
1
- import { fireMediaCardEvent, getRenderSucceededEventPayload, getRenderErrorEventPayload, getRenderFailedFileStatusPayload } from '../../utils/analytics';
2
- export const relevantFeatureFlagNames = ['newCardExperience', 'poll_intervalMs', 'poll_maxAttempts', 'poll_backoffFactor', 'poll_maxIntervalMs', 'captions'];
3
- export const fireOperationalEvent = (createAnalyticsEvent, status, fileAttributes, {
4
- cardPreview,
5
- error
6
- } = {}) => {
1
+ import { fireMediaCardEvent, getRenderSucceededEventPayload, getRenderErrorEventPayload, getRenderFailedFileStatusPayload, getCopiedFilePayload, getRenderCommencedEventPayload, getRenderPreviewableCardPayload } from '../../utils/analytics';
2
+ export const relevantFeatureFlagNames = ['newCardExperience', 'captions'];
3
+ export const fireOperationalEvent = (createAnalyticsEvent, status, fileAttributes, performanceAttributes, error) => {
7
4
  const fireEvent = payload => fireMediaCardEvent(payload, createAnalyticsEvent);
8
5
 
9
6
  switch (status) {
10
7
  case 'complete':
11
- /**
12
- * A Card that is considered Complete and has no preview,
13
- * reflects an expected behaviour, and thus a legitimate
14
- * success case to be logged.
15
- */
16
- if (!(cardPreview !== null && cardPreview !== void 0 && cardPreview.dataURI)) {
17
- fireEvent(getRenderSucceededEventPayload(fileAttributes));
18
- }
19
-
8
+ fireEvent(getRenderSucceededEventPayload(fileAttributes, performanceAttributes));
20
9
  break;
21
10
 
22
11
  case 'failed-processing':
23
- fireEvent(getRenderFailedFileStatusPayload(fileAttributes));
12
+ fireEvent(getRenderFailedFileStatusPayload(fileAttributes, performanceAttributes));
24
13
  break;
25
14
 
26
15
  case 'error':
27
- error && fireEvent(getRenderErrorEventPayload(fileAttributes, error));
16
+ error && fireEvent(getRenderErrorEventPayload(fileAttributes, performanceAttributes, error));
28
17
  break;
29
18
  }
19
+ };
20
+ export const fireCommencedEvent = (createAnalyticsEvent, fileAttributes, performanceAttributes) => {
21
+ fireMediaCardEvent(getRenderCommencedEventPayload(fileAttributes, performanceAttributes), createAnalyticsEvent);
22
+ };
23
+ export const fireCopiedEvent = (createAnalyticsEvent, fileId, cardRef) => {
24
+ if (typeof window.getSelection === 'function') {
25
+ var _selection$containsNo;
26
+
27
+ const selection = window.getSelection();
28
+
29
+ if (selection !== null && selection !== void 0 && (_selection$containsNo = selection.containsNode) !== null && _selection$containsNo !== void 0 && _selection$containsNo.call(selection, cardRef, true)) {
30
+ fireMediaCardEvent(getCopiedFilePayload(fileId), createAnalyticsEvent);
31
+ }
32
+ }
33
+ };
34
+ export const fireScreenEvent = (createAnalyticsEvent, fileAttributes) => {
35
+ fireMediaCardEvent(getRenderPreviewableCardPayload(fileAttributes), createAnalyticsEvent);
30
36
  };
@@ -0,0 +1 @@
1
+ export const newFileExperienceClassName = 'new-file-experience-wrapper';
@@ -1,59 +1,53 @@
1
- import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
- import React from 'react';
1
+ import _extends from "@babel/runtime/helpers/extends";
2
+ import React, { useContext } from 'react';
3
+ import { useMemoizeFeatureFlags } from '@atlaskit/media-common';
4
+ import Loadable from 'react-loadable';
3
5
  import { CardLoading } from '../..';
4
- export default class CardLoader extends React.PureComponent {
5
- constructor(...args) {
6
- super(...args);
6
+ const MediaCardContext = /*#__PURE__*/React.createContext({});
7
7
 
8
- _defineProperty(this, "state", {
9
- Card: CardLoader.Card,
10
- MediaCardErrorBoundary: CardLoader.MediaCardErrorBoundary
11
- });
12
- }
8
+ const CardLoadingWithContext = () => {
9
+ const props = useContext(MediaCardContext);
10
+ return /*#__PURE__*/React.createElement(CardLoading, props);
11
+ };
13
12
 
14
- async componentDidMount() {
15
- if (!this.state.Card) {
16
- try {
17
- const [mediaClient, cardModule, mediaCardErrorBoundaryModule] = await Promise.all([import(
18
- /* webpackChunkName: "@atlaskit-internal_media-client" */
19
- '@atlaskit/media-client'), import(
20
- /* webpackChunkName: "@atlaskit-internal_media-card" */
21
- './index'), import(
22
- /* webpackChunkName: "@atlaskit-internal_media-card-error-boundary" */
23
- '../media-card-analytics-error-boundary')]);
24
- CardLoader.Card = mediaClient.withMediaClient(cardModule.Card, this.props.featureFlags);
25
- CardLoader.MediaCardErrorBoundary = mediaCardErrorBoundaryModule.default;
26
- this.setState({
27
- Card: CardLoader.Card,
28
- MediaCardErrorBoundary: CardLoader.MediaCardErrorBoundary
29
- });
30
- } catch (error) {// TODO [MS-2278]: Add operational error to catch async import error
31
- }
32
- }
33
- }
13
+ const MediaCard = Loadable({
14
+ loader: () => import(
15
+ /* webpackChunkName: "@atlaskit-internal_media-card" */
16
+ './index').then(mod => mod.Card),
17
+ loading: () => /*#__PURE__*/React.createElement(CardLoadingWithContext, null)
18
+ });
19
+ const MediaCardErrorBoundary = Loadable({
20
+ loader: () => import(
21
+ /* webpackChunkName: "@atlaskit-internal_media-card-error-boundary" */
22
+ '../media-card-analytics-error-boundary').then(mod => mod.default),
23
+ loading: () => /*#__PURE__*/React.createElement(CardLoadingWithContext, null)
24
+ });
25
+ const MediaCardWithMediaClient = Loadable({
26
+ loader: () => import(
27
+ /* webpackChunkName: "@atlaskit-internal_media-client" */
28
+ '@atlaskit/media-client'),
29
+ loading: () => /*#__PURE__*/React.createElement(CardLoadingWithContext, null),
30
+ render: (loaded, props) => /*#__PURE__*/React.createElement(CardWithMediaClient, _extends({}, props, {
31
+ withMediaClient: loaded.withMediaClient
32
+ }))
33
+ });
34
34
 
35
- render() {
36
- const {
37
- dimensions,
38
- testId,
39
- featureFlags
40
- } = this.props;
41
- const {
42
- Card,
43
- MediaCardErrorBoundary
44
- } = this.state;
35
+ const CardWithMediaClient = props => {
36
+ const {
37
+ withMediaClient,
38
+ featureFlags
39
+ } = props;
40
+ const memoizedFeatureFlags = useMemoizeFeatureFlags(featureFlags);
41
+ const Card = React.useMemo(() => {
42
+ return withMediaClient(MediaCard, memoizedFeatureFlags);
43
+ }, [withMediaClient, memoizedFeatureFlags]);
44
+ return /*#__PURE__*/React.createElement(MediaCardErrorBoundary, null, /*#__PURE__*/React.createElement(Card, props));
45
+ };
45
46
 
46
- if (!Card || !MediaCardErrorBoundary) {
47
- return /*#__PURE__*/React.createElement(CardLoading, {
48
- testId: testId,
49
- dimensions: dimensions,
50
- featureFlags: featureFlags
51
- });
52
- }
47
+ const CardLoader = props => {
48
+ return /*#__PURE__*/React.createElement(MediaCardContext.Provider, {
49
+ value: props
50
+ }, /*#__PURE__*/React.createElement(MediaCardWithMediaClient, props));
51
+ };
53
52
 
54
- return /*#__PURE__*/React.createElement(MediaCardErrorBoundary, null, /*#__PURE__*/React.createElement(Card, this.props));
55
- }
56
-
57
- }
58
-
59
- _defineProperty(CardLoader, "displayName", 'AsyncCard');
53
+ export default CardLoader;
@@ -0,0 +1,26 @@
1
+ import { isErrorFileState } from '@atlaskit/media-client';
2
+ import { MediaCardError } from '../../errors';
3
+ import { getCardStatus, isFinalCardStatus } from './getCardStatus';
4
+ import { extractFilePreviewStatus } from './getCardPreview';
5
+ export const createStateUpdater = newState => prevState => {
6
+ // Only override if previous status is non-final
7
+ // or new status is 'complete'
8
+ if (isFinalCardStatus(prevState.status) && newState.status !== 'complete') {
9
+ return prevState;
10
+ }
11
+
12
+ return { ...prevState,
13
+ ...newState
14
+ };
15
+ };
16
+ export const getCardStateFromFileState = (fileState, isBannedLocalPreview, featureFlags) => {
17
+ const status = getCardStatus(fileState.status, extractFilePreviewStatus(fileState, isBannedLocalPreview, featureFlags));
18
+ const error = status === 'error' && isErrorFileState(fileState) ? new MediaCardError('error-file-state', new Error(fileState.message)) : undefined;
19
+ const progress = status === 'uploading' && fileState.status === 'uploading' ? fileState.progress : 1;
20
+ return {
21
+ fileState,
22
+ status,
23
+ progress,
24
+ error
25
+ };
26
+ };
@@ -17,6 +17,11 @@ export class CardPreviewCacheImpl {
17
17
  this.previewCache.set(cacheKey, cardPreview);
18
18
  });
19
19
 
20
+ _defineProperty(this, "remove", (id, dimensions) => {
21
+ const cacheKey = getCacheKey(id, dimensions);
22
+ this.previewCache.remove(cacheKey);
23
+ });
24
+
20
25
  this.previewCache = previewCache;
21
26
  }
22
27
 
@@ -0,0 +1,35 @@
1
+ import { isMimeTypeSupportedByBrowser } from '@atlaskit/media-common';
2
+ import { isPreviewableFileState, isPreviewableType, isImageRepresentationReady } from '@atlaskit/media-client';
3
+ import { isSupportedLocalPreview } from './helpers'; // TODO: align these checks with helpers from Media Client
4
+ // https://product-fabric.atlassian.net/browse/BMPT-1300
5
+
6
+ export const extractFilePreviewStatus = (fileState, isBannedLocalPreview, featureFlags) => {
7
+ const hasFilesize = 'size' in fileState && !!fileState.size;
8
+ const {
9
+ mediaType
10
+ } = 'mediaType' in fileState && fileState || {};
11
+ const {
12
+ mimeType
13
+ } = 'mimeType' in fileState && fileState || {};
14
+ const isPreviewable = !!mediaType && isPreviewableType(mediaType, featureFlags); // Local preview is available only if it's supported by browser and supported by Media Card (isSupportedLocalPreview)
15
+ // For example, SVGs are mime type NOT supported by browser but media type supported by Media Card (image)
16
+ // Then, local Preview NOT available
17
+
18
+ const hasLocalPreview = !isBannedLocalPreview && isPreviewableFileState(fileState) && isSupportedLocalPreview(mediaType) && !!mimeType && isMimeTypeSupportedByBrowser(mimeType);
19
+ const hasRemotePreview = isImageRepresentationReady(fileState);
20
+ const hasPreview = hasLocalPreview || hasRemotePreview;
21
+ const isSupportedByBrowser = !!mimeType && isMimeTypeSupportedByBrowser(mimeType);
22
+ return {
23
+ hasFilesize,
24
+ isPreviewable,
25
+ hasPreview,
26
+ isSupportedByBrowser
27
+ };
28
+ };
29
+ export const isPreviewableStatus = (cardStatus, {
30
+ isPreviewable,
31
+ hasPreview,
32
+ isSupportedByBrowser
33
+ }) => {
34
+ return hasPreview && isPreviewable && (cardStatus === 'complete' || cardStatus === 'loading-preview' || cardStatus === 'uploading' || cardStatus === 'processing' && isSupportedByBrowser);
35
+ };
@@ -69,19 +69,9 @@ export const getCardPreviewFromFilePreview = async filePreview => {
69
69
 
70
70
  throw new LocalPreviewError('local-preview-unsupported');
71
71
  };
72
- export const getCardPreviewFromBackend = async (mediaClient, id, {
73
- width,
74
- height
75
- }, collectionName, resizeMode) => {
72
+ export const getCardPreviewFromBackend = async (mediaClient, id, params) => {
76
73
  try {
77
- const mode = resizeMode === 'stretchy-fit' ? 'full-fit' : resizeMode;
78
- const blob = await mediaClient.getImage(id, {
79
- collection: collectionName,
80
- mode,
81
- width,
82
- height,
83
- allowAnimated: true
84
- });
74
+ const blob = await mediaClient.getImage(id, params);
85
75
  return {
86
76
  dataURI: URL.createObjectURL(blob),
87
77
  orientation: 1,