@atlaskit/media-card 72.0.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 (80) hide show
  1. package/CHANGELOG.md +22 -0
  2. package/dist/cjs/errors.js +26 -6
  3. package/dist/cjs/root/card/cardLoader.js +66 -124
  4. package/dist/cjs/root/card/getCardPreview/index.js +90 -10
  5. package/dist/cjs/root/card/index.js +154 -84
  6. package/dist/cjs/root/cardView.js +41 -54
  7. package/dist/cjs/root/inline/mediaInlineCard.js +10 -5
  8. package/dist/cjs/root/ui/common.js +11 -5
  9. package/dist/cjs/root/ui/imageRenderer/imageRenderer.js +6 -2
  10. package/dist/cjs/root/ui/loadingRateLimited/loadingRateLimited.js +2 -2
  11. package/dist/cjs/root/ui/progressBar/progressBar.js +2 -2
  12. package/dist/cjs/root/ui/progressBar/styled.js +1 -3
  13. package/dist/cjs/root/ui/styled.js +80 -17
  14. package/dist/cjs/root/ui/titleBox/styled.js +1 -3
  15. package/dist/cjs/utils/cardActions/cardActionsDropdownMenu.js +16 -9
  16. package/dist/cjs/version.json +1 -1
  17. package/dist/es2019/errors.js +9 -1
  18. package/dist/es2019/root/card/cardLoader.js +47 -53
  19. package/dist/es2019/root/card/getCardPreview/index.js +45 -3
  20. package/dist/es2019/root/card/index.js +87 -20
  21. package/dist/es2019/root/cardView.js +26 -40
  22. package/dist/es2019/root/inline/mediaInlineCard.js +10 -5
  23. package/dist/es2019/root/ui/common.js +7 -1
  24. package/dist/es2019/root/ui/imageRenderer/imageRenderer.js +6 -2
  25. package/dist/es2019/root/ui/loadingRateLimited/loadingRateLimited.js +1 -1
  26. package/dist/es2019/root/ui/progressBar/progressBar.js +1 -1
  27. package/dist/es2019/root/ui/progressBar/styled.js +1 -2
  28. package/dist/es2019/root/ui/styled.js +64 -3
  29. package/dist/es2019/root/ui/titleBox/styled.js +1 -2
  30. package/dist/es2019/utils/cardActions/cardActionsDropdownMenu.js +8 -4
  31. package/dist/es2019/version.json +1 -1
  32. package/dist/esm/errors.js +23 -5
  33. package/dist/esm/root/card/cardLoader.js +66 -126
  34. package/dist/esm/root/card/getCardPreview/index.js +72 -10
  35. package/dist/esm/root/card/index.js +156 -85
  36. package/dist/esm/root/cardView.js +40 -52
  37. package/dist/esm/root/inline/mediaInlineCard.js +10 -5
  38. package/dist/esm/root/ui/common.js +7 -1
  39. package/dist/esm/root/ui/imageRenderer/imageRenderer.js +6 -2
  40. package/dist/esm/root/ui/loadingRateLimited/loadingRateLimited.js +1 -1
  41. package/dist/esm/root/ui/progressBar/progressBar.js +1 -1
  42. package/dist/esm/root/ui/progressBar/styled.js +1 -2
  43. package/dist/esm/root/ui/styled.js +61 -13
  44. package/dist/esm/root/ui/titleBox/styled.js +1 -2
  45. package/dist/esm/utils/cardActions/cardActionsDropdownMenu.js +16 -9
  46. package/dist/esm/version.json +1 -1
  47. package/dist/types/errors.d.ts +9 -3
  48. package/dist/types/index.d.ts +2 -1
  49. package/dist/types/root/card/cardLoader.d.ts +4 -18
  50. package/dist/types/root/card/getCardPreview/index.d.ts +7 -1
  51. package/dist/types/root/card/index.d.ts +2 -0
  52. package/dist/types/root/cardView.d.ts +3 -1
  53. package/dist/types/root/ui/common.d.ts +4 -1
  54. package/dist/types/root/ui/iconWrapper/styled.d.ts +1 -1
  55. package/dist/types/root/ui/imageRenderer/imageRenderer.d.ts +3 -2
  56. package/dist/types/root/ui/loadingRateLimited/loadingRateLimited.d.ts +1 -1
  57. package/dist/types/root/ui/loadingRateLimited/styled.d.ts +1 -1
  58. package/dist/types/root/ui/progressBar/progressBar.d.ts +1 -1
  59. package/dist/types/root/ui/progressBar/styled.d.ts +1 -1
  60. package/dist/types/root/ui/styled.d.ts +10 -3
  61. package/dist/types/root/ui/titleBox/failedTitleBox.d.ts +1 -1
  62. package/dist/types/root/ui/titleBox/styled.d.ts +1 -1
  63. package/dist/types/root/ui/titleBox/titleBox.d.ts +1 -1
  64. package/dist/types/types.d.ts +1 -1
  65. package/example-helpers/developmentUseMessage.tsx +14 -0
  66. package/example-helpers/index.tsx +34 -4
  67. package/example-helpers/selectableCard.tsx +2 -1
  68. package/package.json +8 -5
  69. package/dist/cjs/root/card/cardSSRView.js +0 -114
  70. package/dist/cjs/root/ui/Breakpoint.js +0 -13
  71. package/dist/cjs/root/ui/styledSSR.js +0 -108
  72. package/dist/es2019/root/card/cardSSRView.js +0 -93
  73. package/dist/es2019/root/ui/Breakpoint.js +0 -6
  74. package/dist/es2019/root/ui/styledSSR.js +0 -93
  75. package/dist/esm/root/card/cardSSRView.js +0 -92
  76. package/dist/esm/root/ui/Breakpoint.js +0 -6
  77. package/dist/esm/root/ui/styledSSR.js +0 -76
  78. package/dist/types/root/card/cardSSRView.d.ts +0 -13
  79. package/dist/types/root/ui/Breakpoint.d.ts +0 -4
  80. package/dist/types/root/ui/styledSSR.d.ts +0 -16
@@ -29,7 +29,9 @@ var ImageRenderer = function ImageRenderer(_ref) {
29
29
  onImageLoad = _ref.onImageLoad,
30
30
  onImageError = _ref.onImageError,
31
31
  onDisplayImage = _ref.onDisplayImage,
32
- mediaType = _ref.mediaType;
32
+ mediaType = _ref.mediaType,
33
+ nativeLazyLoad = _ref.nativeLazyLoad,
34
+ forceSyncDisplay = _ref.forceSyncDisplay;
33
35
  (0, _react.useEffect)(function () {
34
36
  // TODO: trigger accordingly with the succeeded event. This could be a breaking change
35
37
  if (mediaType === 'image' && onDisplayImage) {
@@ -41,7 +43,9 @@ var ImageRenderer = function ImageRenderer(_ref) {
41
43
  alt: alt,
42
44
  previewOrientation: previewOrientation,
43
45
  onImageLoad: onImageLoad,
44
- onImageError: onImageError
46
+ onImageError: onImageError,
47
+ loading: nativeLazyLoad ? 'lazy' : undefined,
48
+ forceSyncDisplay: forceSyncDisplay
45
49
  }, (0, _resizeModeToMediaImageProps.resizeModeToMediaImageProps)(resizeMode)));
46
50
  };
47
51
 
@@ -17,11 +17,11 @@ var _mediaUi = require("@atlaskit/media-ui");
17
17
 
18
18
  var _reactIntl = require("react-intl");
19
19
 
20
- var _Breakpoint = require("../Breakpoint");
20
+ var _common = require("../common");
21
21
 
22
22
  var LoadingRateLimited = function LoadingRateLimited(_ref) {
23
23
  var _ref$breakpoint = _ref.breakpoint,
24
- breakpoint = _ref$breakpoint === void 0 ? _Breakpoint.Breakpoint.SMALL : _ref$breakpoint,
24
+ breakpoint = _ref$breakpoint === void 0 ? _common.Breakpoint.SMALL : _ref$breakpoint,
25
25
  _ref$positionBottom = _ref.positionBottom,
26
26
  positionBottom = _ref$positionBottom === void 0 ? true : _ref$positionBottom;
27
27
  return /*#__PURE__*/_react.default.createElement(_styled.LoadingRateLimitedContainer, null, /*#__PURE__*/_react.default.createElement(_styled.WarningIconWrapper, null, _errorIcon.errorIcon), /*#__PURE__*/_react.default.createElement(_styled.LoadingRateLimitedTextWrapper, {
@@ -11,12 +11,12 @@ var _react = _interopRequireDefault(require("react"));
11
11
 
12
12
  var _styled = require("./styled");
13
13
 
14
- var _Breakpoint = require("../Breakpoint");
14
+ var _common = require("../common");
15
15
 
16
16
  var ProgressBar = function ProgressBar(_ref) {
17
17
  var progress = _ref.progress,
18
18
  _ref$breakpoint = _ref.breakpoint,
19
- breakpoint = _ref$breakpoint === void 0 ? _Breakpoint.Breakpoint.SMALL : _ref$breakpoint,
19
+ breakpoint = _ref$breakpoint === void 0 ? _common.Breakpoint.SMALL : _ref$breakpoint,
20
20
  _ref$positionBottom = _ref.positionBottom,
21
21
  positionBottom = _ref$positionBottom === void 0 ? false : _ref$positionBottom;
22
22
  var normalizedProgress = Math.min(1, Math.max(0, progress || 0)) * 100;
@@ -20,8 +20,6 @@ var _colors = require("@atlaskit/theme/colors");
20
20
 
21
21
  var _common = require("../common");
22
22
 
23
- var _Breakpoint = require("../Breakpoint");
24
-
25
23
  var _templateObject;
26
24
 
27
25
  var height = 3;
@@ -39,7 +37,7 @@ var largeSizeSettings = {
39
37
 
40
38
  function generateResponsiveStyles(breakpoint, positionBottom) {
41
39
  var multiplier = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1;
42
- var setting = breakpoint === _Breakpoint.Breakpoint.SMALL ? smallSizeSettings : largeSizeSettings;
40
+ var setting = breakpoint === _common.Breakpoint.SMALL ? smallSizeSettings : largeSizeSettings;
43
41
  var marginPositionBottom = _common.responsiveSettings[breakpoint].titleBox.verticalPadding;
44
42
  var marginBottom = setting.marginBottom * multiplier + (positionBottom ? marginPositionBottom : (0, _common.getTitleBoxHeight)(breakpoint));
45
43
  return "\n bottom: ".concat(marginBottom, "px\n ");
@@ -5,38 +5,91 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- exports.NewFileExperienceWrapper = void 0;
8
+ exports.CardImageContainer = exports.NewFileExperienceWrapper = exports.calcBreakpointSize = void 0;
9
9
 
10
10
  var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
11
11
 
12
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
13
+
12
14
  var _styledComponents = _interopRequireDefault(require("styled-components"));
13
15
 
14
16
  var _getCSSUnitValue = require("../../utils/getCSSUnitValue");
15
17
 
16
18
  var _cardDimensions = require("../../utils/cardDimensions");
17
19
 
20
+ var _constants = require("@atlaskit/theme/constants");
21
+
22
+ var _mediaUi = require("@atlaskit/media-ui");
23
+
24
+ var _colors = require("@atlaskit/theme/colors");
25
+
26
+ var _consts = require("@atlaskit/editor-shared-styles/consts");
27
+
18
28
  var _selection = require("@atlaskit/editor-shared-styles/selection");
19
29
 
30
+ var _styles = require("../../styles");
31
+
20
32
  var _styled = require("./tickBox/styled");
21
33
 
22
- var _styled2 = require("./actionsBar/styled");
34
+ var _styled2 = require("./blanket/styled");
23
35
 
24
- var _styled3 = require("./playButton/styled");
36
+ var _styled3 = require("./actionsBar/styled");
25
37
 
26
- var _styledSSR = require("./styledSSR");
38
+ var _styled4 = require("./playButton/styled");
27
39
 
28
- var _templateObject;
40
+ var _common = require("./common");
41
+
42
+ var _templateObject, _templateObject2;
43
+
44
+ var breakpointSizes = [[_common.Breakpoint.SMALL, 599], [_common.Breakpoint.LARGE, Infinity]];
45
+
46
+ var calcBreakpointSize = function calcBreakpointSize() {
47
+ var wrapperWidth = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 0;
48
+
49
+ var _ref = breakpointSizes.find(function (_ref3) {
50
+ var _ref4 = (0, _slicedToArray2.default)(_ref3, 2),
51
+ _breakpoint = _ref4[0],
52
+ limit = _ref4[1];
53
+
54
+ return wrapperWidth <= limit;
55
+ }) || [_common.Breakpoint.SMALL],
56
+ _ref2 = (0, _slicedToArray2.default)(_ref, 1),
57
+ breakpoint = _ref2[0];
58
+
59
+ return breakpoint;
60
+ };
61
+
62
+ exports.calcBreakpointSize = calcBreakpointSize;
63
+
64
+ var generateResponsiveStyles = function generateResponsiveStyles() {
65
+ var breakpoint = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _common.Breakpoint.SMALL;
66
+ var setting = _common.responsiveSettings[breakpoint];
67
+ return "\n font-size: ".concat(setting.fontSize, "px;\n line-height: ").concat(setting.lineHeight, "px;\n ");
68
+ };
29
69
 
30
70
  var getWrapperDimensions = function getWrapperDimensions(dimensions, appearance) {
31
- var _ref = dimensions || {},
32
- width = _ref.width,
33
- height = _ref.height;
71
+ var _ref5 = dimensions || {},
72
+ width = _ref5.width,
73
+ height = _ref5.height;
34
74
 
35
75
  var _getDefaultCardDimens = (0, _cardDimensions.getDefaultCardDimensions)(appearance),
36
76
  defaultWidth = _getDefaultCardDimens.width,
37
77
  defaultHeight = _getDefaultCardDimens.height;
38
78
 
39
79
  return "\n width: ".concat((0, _getCSSUnitValue.getCSSUnitValue)(width || defaultWidth), ";\n max-width: 100%;\n height: ").concat((0, _getCSSUnitValue.getCSSUnitValue)(height || defaultHeight), ";\n max-height: 100%;\n ");
80
+ }; // This is a trick to simulate the blue border without affecting the dimensions.
81
+ // CSS outline has no 'radius', therefore we can't achieve the same effect with it
82
+
83
+
84
+ var getWrapperShadow = function getWrapperShadow(disableOverlay, selected) {
85
+ var withOverlayShadow = !disableOverlay ? "0 1px 1px ".concat(_colors.N60A, ", 0 0 1px 0 ").concat(_colors.N60A) : '';
86
+ var selectedShadow = selected ? _consts.akEditorSelectedBoxShadow : '';
87
+ var shadow = [selectedShadow, withOverlayShadow].filter(Boolean).join(', ');
88
+ return shadow ? "box-shadow: ".concat(shadow, ";") : '';
89
+ };
90
+
91
+ var getCursorStyle = function getCursorStyle(shouldUsePointerCursor) {
92
+ return "cursor: ".concat(shouldUsePointerCursor ? 'pointer' : 'default', ";");
40
93
  };
41
94
 
42
95
  var getClickablePlayButtonStyles = function getClickablePlayButtonStyles(isPlayButtonClickable) {
@@ -44,7 +97,7 @@ var getClickablePlayButtonStyles = function getClickablePlayButtonStyles(isPlayB
44
97
  return '';
45
98
  }
46
99
 
47
- return "\n &:hover .".concat(_styled3.playButtonClassName, " {\n ").concat(_styled3.fixedPlayButtonStyles, "\n }\n ");
100
+ return "\n &:hover .".concat(_styled4.playButtonClassName, " {\n ").concat(_styled4.fixedPlayButtonStyles, "\n }\n ");
48
101
  };
49
102
 
50
103
  var getSelectableTickBoxStyles = function getSelectableTickBoxStyles(isTickBoxSelectable) {
@@ -55,13 +108,23 @@ var getSelectableTickBoxStyles = function getSelectableTickBoxStyles(isTickBoxSe
55
108
  return "\n &:hover .".concat(_styled.tickBoxClassName, " {\n ").concat(_styled.tickboxFixedStyles, "\n }\n ");
56
109
  };
57
110
 
58
- var NewFileExperienceWrapper = (0, _styledComponents.default)(_styledSSR.SSRFileExperienceWrapper)(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2.default)(["\n ", "\n"])), function (_ref2) {
59
- var dimensions = _ref2.dimensions,
60
- appearance = _ref2.appearance,
61
- isPlayButtonClickable = _ref2.isPlayButtonClickable,
62
- isTickBoxSelectable = _ref2.isTickBoxSelectable,
63
- shouldDisplayTooltip = _ref2.shouldDisplayTooltip;
64
- return "\n ".concat(_selection.hideNativeBrowserTextSelectionStyles, "\n\n /* We use classnames from here exceptionally to be able to handle styles when the Card is on hover */\n ").concat(getClickablePlayButtonStyles(isPlayButtonClickable), "\n ").concat(getSelectableTickBoxStyles(isTickBoxSelectable), "\n\n &:hover .").concat(_styled2.actionsBarClassName, " {\n ").concat(_styled2.fixedActionBarStyles, "\n }\n\n /* Tooltip does not support percentage dimensions. We enforce them here */\n ").concat(shouldDisplayTooltip ? "> div { ".concat(getWrapperDimensions(dimensions, appearance), " }") : '', "\n");
111
+ var NewFileExperienceWrapper = _styledComponents.default.div(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2.default)(["\n ", "\n"])), function (_ref6) {
112
+ var breakpoint = _ref6.breakpoint,
113
+ dimensions = _ref6.dimensions,
114
+ appearance = _ref6.appearance,
115
+ shouldUsePointerCursor = _ref6.shouldUsePointerCursor,
116
+ disableOverlay = _ref6.disableOverlay,
117
+ displayBackground = _ref6.displayBackground,
118
+ selected = _ref6.selected,
119
+ isPlayButtonClickable = _ref6.isPlayButtonClickable,
120
+ isTickBoxSelectable = _ref6.isTickBoxSelectable,
121
+ shouldDisplayTooltip = _ref6.shouldDisplayTooltip;
122
+ return "\n ".concat((0, _styles.transition)(), "\n box-sizing: border-box;\n * {\n box-sizing: border-box;\n }\n position: relative;\n font-family: ").concat((0, _constants.fontFamily)(), ";\n ").concat(getWrapperDimensions(dimensions, appearance), "\n ").concat(displayBackground ? "background-color: ".concat(_colors.N20, ";") : '', "\n ").concat(_mediaUi.borderRadius, "\n ").concat(getCursorStyle(shouldUsePointerCursor), "\n ").concat(getWrapperShadow(disableOverlay, selected), "\n ").concat(generateResponsiveStyles(breakpoint), "\n ").concat(_selection.hideNativeBrowserTextSelectionStyles, "\n\n /* We use classnames from here exceptionally to be able to handle styles when the Card is on hover */\n ").concat(getClickablePlayButtonStyles(isPlayButtonClickable), "\n ").concat(getSelectableTickBoxStyles(isTickBoxSelectable), "\n &:hover .").concat(_styled2.blanketClassName, " {\n ").concat(_styled2.fixedBlanketStyles, "\n }\n\n &:hover .").concat(_styled3.actionsBarClassName, " {\n ").concat(_styled3.fixedActionBarStyles, "\n }\n\n /* Tooltip does not support percentage dimensions. We enforce them here */\n ").concat(shouldDisplayTooltip ? "> div { ".concat(getWrapperDimensions(dimensions, appearance), " }") : '', "\n");
65
123
  });
124
+
66
125
  exports.NewFileExperienceWrapper = NewFileExperienceWrapper;
67
- NewFileExperienceWrapper.displayName = 'NewFileExperienceWrapper';
126
+ NewFileExperienceWrapper.displayName = 'NewFileExperienceWrapper';
127
+
128
+ var CardImageContainer = _styledComponents.default.div(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2.default)(["\n display: flex;\n position: relative;\n max-width: 100%;\n width: 100%;\n height: 100%;\n max-height: 100%;\n overflow: hidden;\n ", "\n"])), _mediaUi.borderRadius);
129
+
130
+ exports.CardImageContainer = CardImageContainer;
@@ -13,8 +13,6 @@ var _styledComponents = _interopRequireDefault(require("styled-components"));
13
13
 
14
14
  var _common = require("../common");
15
15
 
16
- var _Breakpoint = require("../Breakpoint");
17
-
18
16
  var _colors = require("@atlaskit/theme/colors");
19
17
 
20
18
  var _mixins = require("../../../styles/mixins");
@@ -22,7 +20,7 @@ var _mixins = require("../../../styles/mixins");
22
20
  var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5;
23
21
 
24
22
  var generateResponsiveStyles = function generateResponsiveStyles() {
25
- var breakpoint = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _Breakpoint.Breakpoint.SMALL;
23
+ var breakpoint = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : _common.Breakpoint.SMALL;
26
24
  var setting = _common.responsiveSettings[breakpoint];
27
25
  var verticalPadding = setting.titleBox.verticalPadding;
28
26
  var horizontalPadding = setting.titleBox.horizontalPadding;
@@ -9,6 +9,8 @@ Object.defineProperty(exports, "__esModule", {
9
9
  });
10
10
  exports.CardActionsDropdownMenu = void 0;
11
11
 
12
+ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
13
+
12
14
  var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/classCallCheck"));
13
15
 
14
16
  var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
@@ -103,16 +105,21 @@ var CardActionsDropdownMenu = /*#__PURE__*/function (_Component) {
103
105
 
104
106
  if (actions.length > 0) {
105
107
  return /*#__PURE__*/_react.default.createElement(_dropdownMenu.default, {
106
- "data-testid": "media-card-actions-menu",
108
+ testId: "media-card-actions-menu",
107
109
  onOpenChange: onOpenChange,
108
- trigger: /*#__PURE__*/_react.default.createElement(CardActionButtonWithAnalytics, {
109
- variant: triggerVariant,
110
- style: {
111
- color: triggerColor
112
- }
113
- }, /*#__PURE__*/_react.default.createElement(_more.default, {
114
- label: "more"
115
- }))
110
+ trigger: function trigger(_ref) {
111
+ var triggerRef = _ref.triggerRef,
112
+ providedProps = (0, _objectWithoutProperties2.default)(_ref, ["triggerRef"]);
113
+ return /*#__PURE__*/_react.default.createElement(CardActionButtonWithAnalytics, (0, _extends2.default)({
114
+ variant: triggerVariant,
115
+ style: {
116
+ color: triggerColor
117
+ },
118
+ ref: triggerRef
119
+ }, providedProps), /*#__PURE__*/_react.default.createElement(_more.default, {
120
+ label: "more"
121
+ }));
122
+ }
116
123
  }, /*#__PURE__*/_react.default.createElement(_dropdownMenu.DropdownItemGroup, null, actions.map(createDropdownItemWithAnalytics)));
117
124
  } else {
118
125
  return null;
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/media-card",
3
- "version": "72.0.0",
3
+ "version": "72.1.0",
4
4
  "sideEffects": false
5
5
  }
@@ -27,6 +27,14 @@ 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
+
30
38
  }
31
39
  export const getImageLoadPrimaryReason = source => {
32
40
  switch (source) {
@@ -68,4 +76,4 @@ export function isImageLoadError(err) {
68
76
  // We can use this helper to ensure that the error handled is the type of MediaCardError if unsure
69
77
 
70
78
  export const ensureMediaCardError = (primaryReason, error) => isMediaCardError(error) ? error : new MediaCardError(primaryReason, error);
71
- export const isUploadError = error => error.primaryReason === 'upload';
79
+ export const isUploadError = error => error && error.primaryReason === 'upload';
@@ -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;
@@ -2,7 +2,7 @@ import { isPreviewableFileState, addFileAttrsToUrl } from '@atlaskit/media-clien
2
2
  import { isMimeTypeSupportedByBrowser } from '@atlaskit/media-common';
3
3
  import cardPreviewCache from './cache';
4
4
  import { getCardPreviewFromFilePreview, getCardPreviewFromBackend } from './helpers';
5
- import { MediaCardError, isUnsupportedLocalPreviewError } from '../../../errors';
5
+ import { MediaCardError, SsrPreviewError, isUnsupportedLocalPreviewError } from '../../../errors';
6
6
  import { isBigger } from '../../../utils/dimensionComparer';
7
7
  import { extractFilePreviewStatus, isPreviewableStatus } from './filePreviewStatus';
8
8
  export { getCardPreviewFromFilePreview, getCardPreviewFromBackend, isSupportedLocalPreview } from './helpers';
@@ -28,6 +28,14 @@ const extendAndCachePreview = (id, dimensions, preview, mediaBlobUrlAttrs) => {
28
28
  source = 'cache-remote';
29
29
  break;
30
30
 
31
+ case 'ssr-server':
32
+ source = 'cache-ssr-server';
33
+ break;
34
+
35
+ case 'ssr-client':
36
+ source = 'cache-ssr-client';
37
+ break;
38
+
31
39
  default:
32
40
  source = preview.source;
33
41
  } // We want to embed some meta context into dataURI for Copy/Paste to work.
@@ -111,8 +119,7 @@ export const getCardPreview = async ({
111
119
  throw new MediaCardError('remote-preview-not-ready');
112
120
  }
113
121
 
114
- const remotePreview = await getCardPreviewFromBackend(mediaClient, id, imageUrlParams);
115
- return extendAndCachePreview(id, dimensions, remotePreview, mediaBlobUrlAttrs);
122
+ return fetchAndCacheRemotePreview(mediaClient, id, dimensions, imageUrlParams, mediaBlobUrlAttrs);
116
123
  };
117
124
  export const shouldResolvePreview = ({
118
125
  status,
@@ -126,4 +133,39 @@ export const shouldResolvePreview = ({
126
133
  const statusIsPreviewable = isPreviewableStatus(status, extractFilePreviewStatus(fileState, isBannedLocalPreview, featureFlags));
127
134
  const dimensionsAreBigger = isBigger(prevDimensions, dimensions);
128
135
  return statusIsPreviewable && (!hasCardPreview || dimensionsAreBigger);
136
+ };
137
+ export const getSSRCardPreview = (ssr, mediaClient, id, params, mediaBlobUrlAttrs) => {
138
+ let dataURI;
139
+
140
+ try {
141
+ const rawDataURI = mediaClient.getImageUrlSync(id, params); // We want to embed some meta context into dataURI for Copy/Paste to work.
142
+
143
+ dataURI = mediaBlobUrlAttrs ? addFileAttrsToUrl(rawDataURI, mediaBlobUrlAttrs) : rawDataURI;
144
+ const source = ssr === 'client' ? 'ssr-client' : 'ssr-server';
145
+ return {
146
+ dataURI,
147
+ source,
148
+ orientation: 1
149
+ };
150
+ } catch (e) {
151
+ const reason = ssr === 'server' ? 'ssr-server-uri' : 'ssr-client-uri';
152
+ throw new SsrPreviewError(reason, e);
153
+ }
154
+ };
155
+ export const isLocalPreview = preview => {
156
+ const localSources = ['local', 'cache-local'];
157
+ return localSources.includes(preview.source);
158
+ };
159
+ export const isSSRPreview = preview => isSSRClientPreview(preview) || isSSRServerPreview(preview);
160
+ export const isSSRServerPreview = preview => {
161
+ const ssrClientSources = ['ssr-server', 'cache-ssr-server'];
162
+ return ssrClientSources.includes(preview.source);
163
+ };
164
+ export const isSSRClientPreview = preview => {
165
+ const ssrClientSources = ['ssr-client', 'cache-ssr-client'];
166
+ return ssrClientSources.includes(preview.source);
167
+ };
168
+ export const fetchAndCacheRemotePreview = async (mediaClient, id, dimensions, params, mediaBlobUrlAttrs) => {
169
+ const remotePreview = await getCardPreviewFromBackend(mediaClient, id, params);
170
+ return extendAndCachePreview(id, dimensions, remotePreview, mediaBlobUrlAttrs);
129
171
  };