@atlaskit/smart-card 21.1.3 → 21.3.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 (75) hide show
  1. package/CHANGELOG.md +25 -0
  2. package/dist/cjs/extractors/block/index.js +3 -2
  3. package/dist/cjs/extractors/common/actions/extractPreviewAction.js +2 -0
  4. package/dist/cjs/state/hooks-external/useSmartLinkActions.js +12 -2
  5. package/dist/cjs/version.json +1 -1
  6. package/dist/cjs/view/BlockCard/actions/PreviewAction.js +1 -1
  7. package/dist/cjs/view/BlockCard/index.js +10 -0
  8. package/dist/cjs/view/CardWithUrl/component.js +1 -1
  9. package/dist/cjs/view/EmbedModal/components/size-experiment/index.js +41 -0
  10. package/dist/cjs/view/EmbedModal/components/size-experiment/types.js +5 -0
  11. package/dist/cjs/view/EmbedModal/index.js +7 -3
  12. package/dist/cjs/view/FlexibleCard/components/blocks/block/index.js +17 -3
  13. package/dist/cjs/view/FlexibleCard/components/blocks/preview-block/index.js +5 -2
  14. package/dist/cjs/view/FlexibleCard/components/common/atlaskit-icon/index.js +20 -8
  15. package/dist/cjs/view/FlexibleCard/components/common/image-icon/index.js +4 -2
  16. package/dist/cjs/view/FlexibleCard/components/common/loading-skeleton/index.js +1 -2
  17. package/dist/cjs/view/FlexibleCard/components/elements/media/index.js +5 -2
  18. package/dist/cjs/view/HoverCard/components/HoverCardContent.js +21 -4
  19. package/dist/cjs/view/HoverCard/components/SnippetOrPreview.js +74 -0
  20. package/dist/cjs/view/HoverCard/styled.js +11 -3
  21. package/dist/es2019/extractors/block/index.js +2 -1
  22. package/dist/es2019/extractors/common/actions/extractPreviewAction.js +2 -1
  23. package/dist/es2019/state/hooks-external/useSmartLinkActions.js +11 -2
  24. package/dist/es2019/version.json +1 -1
  25. package/dist/es2019/view/BlockCard/actions/PreviewAction.js +1 -1
  26. package/dist/es2019/view/BlockCard/index.js +9 -0
  27. package/dist/es2019/view/CardWithUrl/component.js +1 -1
  28. package/dist/es2019/view/EmbedModal/components/size-experiment/index.js +28 -0
  29. package/dist/es2019/view/EmbedModal/components/size-experiment/types.js +1 -0
  30. package/dist/es2019/view/EmbedModal/index.js +5 -3
  31. package/dist/es2019/view/FlexibleCard/components/blocks/block/index.js +17 -7
  32. package/dist/es2019/view/FlexibleCard/components/blocks/preview-block/index.js +4 -1
  33. package/dist/es2019/view/FlexibleCard/components/common/atlaskit-icon/index.js +17 -6
  34. package/dist/es2019/view/FlexibleCard/components/common/image-icon/index.js +4 -2
  35. package/dist/es2019/view/FlexibleCard/components/common/loading-skeleton/index.js +2 -3
  36. package/dist/es2019/view/FlexibleCard/components/elements/media/index.js +5 -2
  37. package/dist/es2019/view/HoverCard/components/HoverCardContent.js +21 -6
  38. package/dist/es2019/view/HoverCard/components/SnippetOrPreview.js +42 -0
  39. package/dist/es2019/view/HoverCard/styled.js +8 -0
  40. package/dist/esm/extractors/block/index.js +3 -2
  41. package/dist/esm/extractors/common/actions/extractPreviewAction.js +2 -0
  42. package/dist/esm/state/hooks-external/useSmartLinkActions.js +11 -2
  43. package/dist/esm/version.json +1 -1
  44. package/dist/esm/view/BlockCard/actions/PreviewAction.js +1 -1
  45. package/dist/esm/view/BlockCard/index.js +9 -0
  46. package/dist/esm/view/CardWithUrl/component.js +1 -1
  47. package/dist/esm/view/EmbedModal/components/size-experiment/index.js +28 -0
  48. package/dist/esm/view/EmbedModal/components/size-experiment/types.js +1 -0
  49. package/dist/esm/view/EmbedModal/index.js +6 -3
  50. package/dist/esm/view/FlexibleCard/components/blocks/block/index.js +11 -3
  51. package/dist/esm/view/FlexibleCard/components/blocks/preview-block/index.js +5 -2
  52. package/dist/esm/view/FlexibleCard/components/common/atlaskit-icon/index.js +18 -8
  53. package/dist/esm/view/FlexibleCard/components/common/image-icon/index.js +4 -2
  54. package/dist/esm/view/FlexibleCard/components/common/loading-skeleton/index.js +1 -2
  55. package/dist/esm/view/FlexibleCard/components/elements/media/index.js +5 -2
  56. package/dist/esm/view/HoverCard/components/HoverCardContent.js +21 -6
  57. package/dist/esm/view/HoverCard/components/SnippetOrPreview.js +53 -0
  58. package/dist/esm/view/HoverCard/styled.js +6 -2
  59. package/dist/types/extractors/block/types.d.ts +2 -0
  60. package/dist/types/extractors/common/actions/extractPreviewAction.d.ts +2 -1
  61. package/dist/types/view/BlockCard/actions/PreviewAction.d.ts +4 -2
  62. package/dist/types/view/Card/index.d.ts +1 -1
  63. package/dist/types/view/EmbedModal/components/size-experiment/index.d.ts +6 -0
  64. package/dist/types/view/EmbedModal/components/size-experiment/types.d.ts +4 -0
  65. package/dist/types/view/EmbedModal/index.d.ts +1 -1
  66. package/dist/types/view/EmbedModal/types.d.ts +4 -0
  67. package/dist/types/view/FlexibleCard/components/blocks/preview-block/types.d.ts +7 -1
  68. package/dist/types/view/FlexibleCard/components/blocks/types.d.ts +15 -0
  69. package/dist/types/view/FlexibleCard/components/common/image-icon/types.d.ts +1 -0
  70. package/dist/types/view/FlexibleCard/components/elements/media/types.d.ts +5 -0
  71. package/dist/types/view/HoverCard/components/SnippetOrPreview.d.ts +4 -0
  72. package/dist/types/view/HoverCard/styled.d.ts +2 -0
  73. package/dist/types/view/HoverCard/types.d.ts +5 -0
  74. package/package.json +5 -5
  75. package/report.api.md +23 -2
package/CHANGELOG.md CHANGED
@@ -1,5 +1,30 @@
1
1
  # @atlaskit/smart-card
2
2
 
3
+ ## 21.3.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`1c76ddcd2f3`](https://bitbucket.org/atlassian/atlassian-frontend/commits/1c76ddcd2f3) - [ux] Flex-UI: - Add props to generic block: - onRender - onTransitionEnd - blockRef
8
+ HoverCard: - use the above properties in Hover Card to apply transition to preview block and fallback to snippet
9
+
10
+ ## 21.2.0
11
+
12
+ ### Minor Changes
13
+
14
+ - [`d2439a3c65d`](https://bitbucket.org/atlassian/atlassian-frontend/commits/d2439a3c65d) - [ux] Embed Preview Modal: Add experiment modal with new UX and resize functionality (behind feature flag)
15
+
16
+ ### Patch Changes
17
+
18
+ - [`6dd64ce82a8`](https://bitbucket.org/atlassian/atlassian-frontend/commits/6dd64ce82a8) - [ux] This changes icon loading for Flexible Smart Links. Previously, all `@atlaskit/icon-file-type/glyph/` icons in Flexible Smart Links would be loaded asynchronously. This change makes it so that the `@atlaskit/icon-file-type/glyph/blog` and `@atlaskit/icon-file-type/glyph/document`icons load synchronously in order to better support SSR use cases.
19
+ - Updated dependencies
20
+
21
+ ## 21.1.4
22
+
23
+ ### Patch Changes
24
+
25
+ - [`8d4228767b0`](https://bitbucket.org/atlassian/atlassian-frontend/commits/8d4228767b0) - Upgrade Typescript from `4.2.4` to `4.3.5`.
26
+ - Updated dependencies
27
+
3
28
  ## 21.1.3
4
29
 
5
30
  ### Patch Changes
@@ -55,13 +55,14 @@ var extractBlockDetails = function extractBlockDetails(jsonLd) {
55
55
 
56
56
  var extractBlockActions = function extractBlockActions(props, jsonLd, opts, platform) {
57
57
  if (opts) {
58
- var handleInvoke = opts.handleInvoke,
58
+ var featureFlags = opts.featureFlags,
59
+ handleInvoke = opts.handleInvoke,
59
60
  handleAnalytics = opts.handleAnalytics,
60
61
  extensionKey = opts.extensionKey,
61
62
  source = opts.source,
62
63
  testId = opts.testId;
63
64
  var actions = (0, _extractActions.extractActions)(jsonLd, handleInvoke);
64
- var previewAction = (0, _extractPreviewAction.extractPreviewAction)(extensionKey, props, jsonLd, handleInvoke, handleAnalytics, testId, platform, source); // The previewAction should always be the last action
65
+ var previewAction = (0, _extractPreviewAction.extractPreviewAction)(extensionKey, props, jsonLd, handleInvoke, handleAnalytics, testId, platform, source, featureFlags); // The previewAction should always be the last action
65
66
 
66
67
  if (previewAction) {
67
68
  actions.push(previewAction);
@@ -72,6 +72,7 @@ var extractPreviewAction = function extractPreviewAction() {
72
72
  var testId = arguments.length > 5 ? arguments[5] : undefined;
73
73
  var platform = arguments.length > 6 ? arguments[6] : undefined;
74
74
  var source = arguments.length > 7 ? arguments[7] : undefined;
75
+ var featureFlags = arguments.length > 8 ? arguments[8] : undefined;
75
76
  // Extract metadata from view props & raw JSON-LD.
76
77
  var metadataFromJsonLd = getMetadataFromJsonLd(jsonLd, platform);
77
78
  var metadataFromViewProps = getMetadataFromResolvedProps(viewProps);
@@ -83,6 +84,7 @@ var extractPreviewAction = function extractPreviewAction() {
83
84
  // Build action using instrumentation hooks.
84
85
  var key = extensionKey;
85
86
  var previewAction = (0, _BlockCard.PreviewAction)(_objectSpread(_objectSpread({}, metadata), {}, {
87
+ featureFlags: featureFlags,
86
88
  testId: testId,
87
89
  onOpen: function onOpen() {
88
90
  handleAnalytics((0, _analytics.uiRenderSuccessEvent)('preview', 'resolved', key));
@@ -13,6 +13,8 @@ var _react = require("react");
13
13
 
14
14
  var _uuid = _interopRequireDefault(require("uuid"));
15
15
 
16
+ var _linkProvider = require("@atlaskit/link-provider");
17
+
16
18
  var _block = require("../../extractors/block");
17
19
 
18
20
  var _actions = require("../actions");
@@ -40,13 +42,21 @@ function useSmartLinkActions(_ref) {
40
42
 
41
43
  var linkState = (0, _store.useSmartCardState)(url);
42
44
  var linkAnalytics = (0, _analytics.useSmartLinkAnalytics)(url, analyticsHandler, id);
43
- var linkActions = (0, _actions.useSmartCardActions)(id, url, linkAnalytics);
45
+ var linkActions = (0, _actions.useSmartCardActions)(id, url, linkAnalytics); // Actions do not have access to the react tree, so we need to obtain
46
+ // feature flags here where we still can access SmartLinkContext context
47
+ // and pass the flags down to the extractor. See PreviewAction.tsx for details.
48
+
49
+ var embedModalSize = (0, _linkProvider.useFeatureFlag)('embedModalSize');
44
50
  (0, _react.useEffect)(function () {
45
51
  if (!linkState.details) {
46
52
  return;
47
53
  }
48
54
 
55
+ var featureFlags = {
56
+ embedModalSize: embedModalSize
57
+ };
49
58
  var cardProperties = (0, _block.extractBlockProps)(linkState.details.data, linkState.details.meta, {
59
+ featureFlags: featureFlags,
50
60
  handleInvoke: function handleInvoke(opts) {
51
61
  return linkActions.invoke(opts, appearance);
52
62
  },
@@ -67,6 +77,6 @@ function useSmartLinkActions(_ref) {
67
77
  };
68
78
  });
69
79
  setActions(cardActions);
70
- }, [linkState, linkActions, analyticsHandler, appearance, platform]);
80
+ }, [linkState, linkActions, analyticsHandler, appearance, platform, embedModalSize]);
71
81
  return actions;
72
82
  }
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/smart-card",
3
- "version": "21.1.3",
3
+ "version": "21.3.0",
4
4
  "sideEffects": false
5
5
  }
@@ -81,7 +81,7 @@ function _previewFunction() {
81
81
 
82
82
  _context.next = 5;
83
83
  return Promise.resolve().then(function () {
84
- return _interopRequireWildcard(require('../../common/Modal'));
84
+ return _interopRequireWildcard(require('../../EmbedModal'));
85
85
  });
86
86
 
87
87
  case 5:
@@ -93,6 +93,8 @@ var _ForbiddenView = require("./views/ForbiddenView");
93
93
 
94
94
  var _ErroredView = require("./views/ErroredView");
95
95
 
96
+ var _linkProvider = require("@atlaskit/link-provider");
97
+
96
98
  var BlockCard = function BlockCard(_ref) {
97
99
  var _details$meta, _forbiddenViewProps$c;
98
100
 
@@ -113,9 +115,17 @@ var BlockCard = function BlockCard(_ref) {
113
115
  testId = _ref.testId,
114
116
  showActions = _ref.showActions,
115
117
  platform = _ref.platform;
118
+ // Actions do not have access to the react tree, so we need to obtain
119
+ // feature flags here where we still can access SmartLinkContext context
120
+ // and pass the flags down to the extractor. See PreviewAction.tsx for details.
121
+ var embedModalSize = (0, _linkProvider.useFeatureFlag)('embedModalSize');
122
+ var featureFlags = {
123
+ embedModalSize: embedModalSize
124
+ };
116
125
  var data = details && details.data || (0, _jsonld.getEmptyJsonLd)();
117
126
  var meta = details && details.meta;
118
127
  var extractorOpts = {
128
+ featureFlags: featureFlags,
119
129
  handleAnalytics: handleAnalytics,
120
130
  handleInvoke: handleInvoke,
121
131
  extensionKey: (0, _helpers.getExtensionKey)(details)
@@ -80,7 +80,7 @@ function CardWithUrlContent(_ref) {
80
80
  var showHoverPreviewFlag = (0, _linkProvider.useFeatureFlag)('showHoverPreview');
81
81
 
82
82
  if (showHoverPreview === undefined && showHoverPreviewFlag !== undefined) {
83
- showHoverPreview = showHoverPreviewFlag;
83
+ showHoverPreview = Boolean(showHoverPreviewFlag);
84
84
  } // Setup UI handlers.
85
85
 
86
86
 
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.default = void 0;
9
+
10
+ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
11
+
12
+ var _react = _interopRequireDefault(require("react"));
13
+
14
+ var _Modal = _interopRequireDefault(require("../../../common/Modal"));
15
+
16
+ var _constants = require("../../constants");
17
+
18
+ var withSizeExperiment = function withSizeExperiment(Component) {
19
+ return function (props) {
20
+ var _props$featureFlags = props.featureFlags,
21
+ featureFlags = _props$featureFlags === void 0 ? {} : _props$featureFlags,
22
+ _props$closeLabel = props.closeLabel,
23
+ closeLabel = _props$closeLabel === void 0 ? 'Close Preview' : _props$closeLabel;
24
+ var embedModalSize = featureFlags.embedModalSize; // Experiment
25
+
26
+ if (embedModalSize === 'large' || embedModalSize === 'small') {
27
+ var size = embedModalSize === 'large' ? _constants.MAX_MODAL_SIZE : _constants.MIN_MODAL_SIZE;
28
+ return /*#__PURE__*/_react.default.createElement(Component, (0, _extends2.default)({}, props, {
29
+ size: size
30
+ }));
31
+ } // Control
32
+
33
+
34
+ return /*#__PURE__*/_react.default.createElement(_Modal.default, (0, _extends2.default)({}, props, {
35
+ closeLabel: closeLabel
36
+ }));
37
+ };
38
+ };
39
+
40
+ var _default = withSizeExperiment;
41
+ exports.default = _default;
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
@@ -23,6 +23,8 @@ var _embedContent = _interopRequireDefault(require("./components/embed-content")
23
23
 
24
24
  var _errorBoundary = _interopRequireDefault(require("./components/error-boundary"));
25
25
 
26
+ var _sizeExperiment = _interopRequireDefault(require("./components/size-experiment"));
27
+
26
28
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
27
29
 
28
30
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
@@ -39,9 +41,11 @@ var EmbedModal = function EmbedModal(_ref) {
39
41
  onViewActionClick = _ref.onViewActionClick,
40
42
  providerName = _ref.providerName,
41
43
  showModal = _ref.showModal,
44
+ _ref$size = _ref.size,
45
+ defaultSize = _ref$size === void 0 ? _constants.MIN_MODAL_SIZE : _ref$size,
42
46
  src = _ref.src,
43
47
  _ref$testId = _ref.testId,
44
- testId = _ref$testId === void 0 ? 'smart-links-preview-modal' : _ref$testId,
48
+ testId = _ref$testId === void 0 ? 'smart-embed-preview-modal' : _ref$testId,
45
49
  title = _ref.title,
46
50
  url = _ref.url;
47
51
 
@@ -50,7 +54,7 @@ var EmbedModal = function EmbedModal(_ref) {
50
54
  isOpen = _useState2[0],
51
55
  setIsOpen = _useState2[1];
52
56
 
53
- var _useState3 = (0, _react.useState)(_constants.MIN_MODAL_SIZE),
57
+ var _useState3 = (0, _react.useState)(defaultSize),
54
58
  _useState4 = (0, _slicedToArray2.default)(_useState3, 2),
55
59
  size = _useState4[0],
56
60
  setSize = _useState4[1];
@@ -88,6 +92,6 @@ var EmbedModal = function EmbedModal(_ref) {
88
92
  }))));
89
93
  };
90
94
 
91
- var _default = (0, _errorBoundary.default)(EmbedModal);
95
+ var _default = (0, _sizeExperiment.default)((0, _errorBoundary.default)(EmbedModal));
92
96
 
93
97
  exports.default = _default;
@@ -2,6 +2,8 @@
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
4
 
5
+ var _typeof = require("@babel/runtime/helpers/typeof");
6
+
5
7
  Object.defineProperty(exports, "__esModule", {
6
8
  value: true
7
9
  });
@@ -9,7 +11,7 @@ exports.default = void 0;
9
11
 
10
12
  var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
11
13
 
12
- var _react = _interopRequireDefault(require("react"));
14
+ var _react = _interopRequireWildcard(require("react"));
13
15
 
14
16
  var _core = require("@emotion/core");
15
17
 
@@ -19,6 +21,10 @@ var _utils = require("../utils");
19
21
 
20
22
  var _templateObject;
21
23
 
24
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
25
+
26
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
27
+
22
28
  var getBlockStyles = function getBlockStyles(direction, size) {
23
29
  return (0, _core.css)(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2.default)(["\n ", "\n ", "\n justify-content: flex-start;\n [data-separator] + [data-separator]:before {\n content: '\u2022';\n margin-right: ", "rem;\n }\n // Pull request elements: source branch \u2192 target branch\n [data-smart-element='", "']\n + [data-smart-element='", "']:before {\n content: '\u2192';\n }\n // Pull request elements: target branch \u2190 source branch\n [data-smart-element='", "']\n + [data-smart-element='", "']:before {\n content: '\u2190';\n }\n"])), (0, _utils.getBaseStyles)(direction, size), _utils.highlightRemoveStyles, (0, _utils.getGapSize)(size), _constants.ElementName.SourceBranch, _constants.ElementName.TargetBranch, _constants.ElementName.TargetBranch, _constants.ElementName.SourceBranch);
24
30
  };
@@ -39,11 +45,19 @@ var Block = function Block(_ref) {
39
45
  size = _ref$size === void 0 ? _constants.SmartLinkSize.Medium : _ref$size,
40
46
  _ref$testId = _ref.testId,
41
47
  testId = _ref$testId === void 0 ? 'smart-block' : _ref$testId,
42
- overrideCss = _ref.overrideCss;
48
+ overrideCss = _ref.overrideCss,
49
+ blockRef = _ref.blockRef,
50
+ onRender = _ref.onRender,
51
+ onTransitionEnd = _ref.onTransitionEnd;
52
+ (0, _react.useEffect)(function () {
53
+ onRender && onRender();
54
+ }, [onRender]);
43
55
  return (0, _core.jsx)("div", {
44
56
  css: [getBlockStyles(direction, size), overrideCss],
45
57
  "data-smart-block": true,
46
- "data-testid": testId
58
+ "data-testid": testId,
59
+ onTransitionEnd: onTransitionEnd,
60
+ ref: blockRef
47
61
  }, (0, _utils.renderChildren)(children, size));
48
62
  };
49
63
 
@@ -19,7 +19,7 @@ var _block = _interopRequireDefault(require("../block"));
19
19
 
20
20
  var _elements = require("../../elements");
21
21
 
22
- var _excluded = ["status", "testId"];
22
+ var _excluded = ["status", "testId", "onError"];
23
23
 
24
24
  /**
25
25
  * Represents a PreviewBlock, which typically contains media or other large format content.
@@ -32,6 +32,7 @@ var PreviewBlock = function PreviewBlock(_ref) {
32
32
  status = _ref$status === void 0 ? _constants.SmartLinkStatus.Fallback : _ref$status,
33
33
  _ref$testId = _ref.testId,
34
34
  testId = _ref$testId === void 0 ? 'smart-block-preview' : _ref$testId,
35
+ onError = _ref.onError,
35
36
  blockProps = (0, _objectWithoutProperties2.default)(_ref, _excluded);
36
37
 
37
38
  if (status !== _constants.SmartLinkStatus.Resolved) {
@@ -40,7 +41,9 @@ var PreviewBlock = function PreviewBlock(_ref) {
40
41
 
41
42
  return /*#__PURE__*/_react.default.createElement(_block.default, (0, _extends2.default)({}, blockProps, {
42
43
  testId: "".concat(testId, "-resolved-view")
43
- }), /*#__PURE__*/_react.default.createElement(_elements.Preview, null));
44
+ }), /*#__PURE__*/_react.default.createElement(_elements.Preview, {
45
+ onError: onError
46
+ }));
44
47
  };
45
48
 
46
49
  var _default = PreviewBlock;
@@ -17,6 +17,10 @@ var _reactLoadable = _interopRequireDefault(require("react-loadable"));
17
17
 
18
18
  var _colors = require("@atlaskit/theme/colors");
19
19
 
20
+ var _ = _interopRequireDefault(require("@atlaskit/icon-file-type/glyph/document/16"));
21
+
22
+ var _2 = _interopRequireDefault(require("@atlaskit/icon-object/glyph/blog/16"));
23
+
20
24
  var _constants = require("../../../../../constants");
21
25
 
22
26
  var _tokens = require("@atlaskit/tokens");
@@ -36,18 +40,10 @@ var importIconMapper = (_importIconMapper = {}, (0, _defineProperty2.default)(_i
36
40
  return Promise.resolve().then(function () {
37
41
  return _interopRequireWildcard(require('@atlaskit/icon-file-type/glyph/audio/16'));
38
42
  });
39
- }), (0, _defineProperty2.default)(_importIconMapper, _constants.IconType.Blog, function () {
40
- return Promise.resolve().then(function () {
41
- return _interopRequireWildcard(require('@atlaskit/icon-object/glyph/blog/16'));
42
- });
43
43
  }), (0, _defineProperty2.default)(_importIconMapper, _constants.IconType.Code, function () {
44
44
  return Promise.resolve().then(function () {
45
45
  return _interopRequireWildcard(require('@atlaskit/icon-file-type/glyph/source-code/16'));
46
46
  });
47
- }), (0, _defineProperty2.default)(_importIconMapper, _constants.IconType.Document, function () {
48
- return Promise.resolve().then(function () {
49
- return _interopRequireWildcard(require('@atlaskit/icon-file-type/glyph/document/16'));
50
- });
51
47
  }), (0, _defineProperty2.default)(_importIconMapper, _constants.IconType.Executable, function () {
52
48
  return Promise.resolve().then(function () {
53
49
  return _interopRequireWildcard(require('@atlaskit/icon-file-type/glyph/executable/16'));
@@ -301,6 +297,22 @@ var AtlaskitIcon = function AtlaskitIcon(_ref3) {
301
297
  var icon = _ref3.icon,
302
298
  label = _ref3.label,
303
299
  testId = _ref3.testId;
300
+
301
+ // Check for synchonously loaded icons first for SSR purposes
302
+ switch (icon) {
303
+ case _constants.IconType.Document:
304
+ return /*#__PURE__*/_react.default.createElement(_.default, {
305
+ label: label || 'document',
306
+ testId: testId
307
+ });
308
+
309
+ case _constants.IconType.Blog:
310
+ return /*#__PURE__*/_react.default.createElement(_2.default, {
311
+ label: label || 'blog',
312
+ testId: testId
313
+ });
314
+ }
315
+
304
316
  var importFn = getIconImportFn(icon);
305
317
 
306
318
  if (!importFn) {
@@ -19,7 +19,8 @@ var _loadingSkeleton = _interopRequireDefault(require("../loading-skeleton"));
19
19
  var ImageIcon = function ImageIcon(_ref) {
20
20
  var defaultIcon = _ref.defaultIcon,
21
21
  testId = _ref.testId,
22
- url = _ref.url;
22
+ url = _ref.url,
23
+ onError = _ref.onError;
23
24
  return (0, _core.jsx)(_reactRenderImage.default, {
24
25
  src: url,
25
26
  loading: (0, _core.jsx)(_loadingSkeleton.default, {
@@ -29,7 +30,8 @@ var ImageIcon = function ImageIcon(_ref) {
29
30
  src: url,
30
31
  "data-testid": "".concat(testId, "-image")
31
32
  }),
32
- errored: defaultIcon
33
+ errored: defaultIcon,
34
+ onError: onError
33
35
  });
34
36
  };
35
37
 
@@ -21,8 +21,7 @@ var LoadingSkeleton = function LoadingSkeleton(_ref) {
21
21
  var testId = _ref.testId,
22
22
  width = _ref.width,
23
23
  height = _ref.height;
24
- var animationWidth = width ? "".concat(width, "rem") : '20px';
25
- var animationNameStyles = (0, _core.keyframes)(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2.default)(["\n 0% { background-position: -", " 0; }\n 100% { background-position: ", " 0; }\n "])), animationWidth, animationWidth);
24
+ var animationNameStyles = (0, _core.keyframes)(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2.default)(["\n 0% { background-position: 50% 0; }\n 100% { background-position: -50% 0; }\n "])));
26
25
  var styles = (0, _core.css)(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2.default)(["\n width: ", "rem;\n height: ", "rem;\n border-radius: 2px;\n user-select: none;\n background: ", ";\n // TODO: https://product-fabric.atlassian.net/browse/DSP-4236\n background-image: linear-gradient(\n to right,\n ", " 0%,\n ", " 20%,\n ", " 40%,\n ", "100%\n );\n background-repeat: no-repeat;\n background-size: 280% 100%;\n display: inline-block;\n\n animation-duration: 1s;\n animation-fill-mode: forwards;\n animation-iteration-count: infinite;\n animation-name: ", ";\n animation-timing-function: linear;\n "])), width, height, (0, _tokens.token)('color.skeleton.subtle', '#f6f7f8'), (0, _tokens.token)('color.skeleton.subtle', '#f6f7f8'), (0, _tokens.token)('color.skeleton', '#edeef1'), (0, _tokens.token)('color.skeleton.subtle', '#f6f7f8'), (0, _tokens.token)('color.skeleton.subtle', '#f6f7f8'), animationNameStyles);
27
26
  return (0, _core.jsx)("span", {
28
27
  css: styles,
@@ -41,7 +41,8 @@ var Media = function Media(_ref) {
41
41
  _ref$testId = _ref.testId,
42
42
  testId = _ref$testId === void 0 ? 'smart-element-media' : _ref$testId,
43
43
  type = _ref.type,
44
- url = _ref.url;
44
+ url = _ref.url,
45
+ onError = _ref.onError;
45
46
 
46
47
  if (!type || !url) {
47
48
  return null;
@@ -54,7 +55,9 @@ var Media = function Media(_ref) {
54
55
  "data-testid": testId
55
56
  }, (0, _core.jsx)(_imageIcon.default, {
56
57
  testId: "".concat(testId, "-image"),
57
- url: url
58
+ url: url,
59
+ onError: onError,
60
+ defaultIcon: null
58
61
  }));
59
62
  };
60
63
 
@@ -17,8 +17,6 @@ var _react = _interopRequireWildcard(require("react"));
17
17
 
18
18
  var _constants = require("../../../constants");
19
19
 
20
- var _extractPreview = _interopRequireDefault(require("../../../extractors/flexible/extract-preview"));
21
-
22
20
  var _extractMetadata2 = require("../../../extractors/hover/extractMetadata");
23
21
 
24
22
  var _actions = require("../../../state/actions");
@@ -37,6 +35,8 @@ var _utils2 = require("../utils");
37
35
 
38
36
  var _HoverCardLoadingView = _interopRequireDefault(require("./HoverCardLoadingView"));
39
37
 
38
+ var _SnippetOrPreview = _interopRequireDefault(require("./SnippetOrPreview"));
39
+
40
40
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
41
41
 
42
42
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
@@ -126,7 +126,19 @@ var HoverCardContent = function HoverCardContent(_ref) {
126
126
  subtitle = _extractMetadata.subtitle;
127
127
 
128
128
  var titleMaxLines = subtitle && subtitle.length > 0 ? 1 : 2;
129
- var body = data && (0, _extractPreview.default)(data) ? /*#__PURE__*/_react.default.createElement(_blocks.PreviewBlock, null) : /*#__PURE__*/_react.default.createElement(_blocks.SnippetBlock, null);
129
+
130
+ var snippetHeight = _react.default.useRef(0);
131
+
132
+ var snippetBlockRef = (0, _react.useRef)(null);
133
+ var onSnippetRender = (0, _react.useCallback)(function () {
134
+ var _snippetBlockRef$curr, _snippetBlockRef$curr2;
135
+
136
+ snippetHeight.current = (_snippetBlockRef$curr = (_snippetBlockRef$curr2 = snippetBlockRef.current) === null || _snippetBlockRef$curr2 === void 0 ? void 0 : _snippetBlockRef$curr2.getBoundingClientRect().height) !== null && _snippetBlockRef$curr !== void 0 ? _snippetBlockRef$curr : 0;
137
+ }, []);
138
+ var body = (0, _SnippetOrPreview.default)({
139
+ data: data,
140
+ snippetHeight: snippetHeight.current
141
+ });
130
142
  var titleBlockProps = {
131
143
  actions: titleActions,
132
144
  maxLines: titleMaxLines,
@@ -159,7 +171,12 @@ var HoverCardContent = function HoverCardContent(_ref) {
159
171
  size: _constants.SmartLinkSize.Large,
160
172
  overrideCss: _styled.metadataBlockCss,
161
173
  maxLines: 1
162
- }), body, /*#__PURE__*/_react.default.createElement(_blocks.FooterBlock, {
174
+ }), body, /*#__PURE__*/_react.default.createElement(_blocks.SnippetBlock, {
175
+ testId: 'hidden-snippet',
176
+ onRender: onSnippetRender,
177
+ blockRef: snippetBlockRef,
178
+ overrideCss: _styled.hiddenSnippetStyles
179
+ }), /*#__PURE__*/_react.default.createElement(_blocks.FooterBlock, {
163
180
  actions: footerActions,
164
181
  size: _constants.SmartLinkSize.Large,
165
182
  overrideCss: _styled.footerBlockCss
@@ -0,0 +1,74 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+
5
+ var _typeof = require("@babel/runtime/helpers/typeof");
6
+
7
+ Object.defineProperty(exports, "__esModule", {
8
+ value: true
9
+ });
10
+ exports.default = void 0;
11
+
12
+ var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
13
+
14
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
15
+
16
+ var _react = _interopRequireWildcard(require("react"));
17
+
18
+ var _core = require("@emotion/core");
19
+
20
+ var _extractPreview = _interopRequireDefault(require("../../../extractors/flexible/extract-preview"));
21
+
22
+ var _blocks = require("../../FlexibleCard/components/blocks");
23
+
24
+ var _styled = require("../styled");
25
+
26
+ var _templateObject;
27
+
28
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
29
+
30
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
31
+
32
+ var SnippetOrPreview = function SnippetOrPreview(_ref) {
33
+ var data = _ref.data,
34
+ snippetHeight = _ref.snippetHeight;
35
+ var transitionStarted = (0, _react.useRef)(false);
36
+ var previewBlockRef = (0, _react.useRef)(null);
37
+
38
+ var _useState = (0, _react.useState)(false),
39
+ _useState2 = (0, _slicedToArray2.default)(_useState, 2),
40
+ showSnippet = _useState2[0],
41
+ setShowSnippet = _useState2[1];
42
+
43
+ var _useState3 = (0, _react.useState)(),
44
+ _useState4 = (0, _slicedToArray2.default)(_useState3, 2),
45
+ previewCss = _useState4[0],
46
+ setPreviewCss = _useState4[1]; // Set Preview to a fixed height to enable transitions
47
+
48
+
49
+ var onPreviewRender = (0, _react.useCallback)(function () {
50
+ var _previewBlockRef$curr;
51
+
52
+ previewBlockRef.current && setPreviewCss((0, _core.css)(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2.default)(["\n height: ", "px;\n "])), (_previewBlockRef$curr = previewBlockRef.current) === null || _previewBlockRef$curr === void 0 ? void 0 : _previewBlockRef$curr.getBoundingClientRect().height));
53
+ }, []); // On error set Preview to Snippet height with transition
54
+
55
+ var onPreviewError = (0, _react.useCallback)(function () {
56
+ if (transitionStarted.current === false) {
57
+ setPreviewCss((0, _styled.getTransitionStyles)(snippetHeight));
58
+ transitionStarted.current = true;
59
+ }
60
+ }, [snippetHeight]);
61
+ var onPreviewTransitionEnd = (0, _react.useCallback)(function () {
62
+ setShowSnippet(true);
63
+ }, []);
64
+ return !showSnippet && data && (0, _extractPreview.default)(data) ? /*#__PURE__*/_react.default.createElement(_blocks.PreviewBlock, {
65
+ onError: onPreviewError,
66
+ overrideCss: previewCss,
67
+ onTransitionEnd: onPreviewTransitionEnd,
68
+ blockRef: previewBlockRef,
69
+ onRender: onPreviewRender
70
+ }) : /*#__PURE__*/_react.default.createElement(_blocks.SnippetBlock, null);
71
+ };
72
+
73
+ var _default = SnippetOrPreview;
74
+ exports.default = _default;
@@ -5,7 +5,7 @@ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefau
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- exports.titleBlockCss = exports.skeletonContainer = exports.metadataBlockCss = exports.loadingViewContainer = exports.footerBlockCss = exports.flexibleUiOptions = exports.HoverCardContainer = exports.CARD_WIDTH_REM = exports.CARD_GAP_PX = void 0;
8
+ exports.titleBlockCss = exports.skeletonContainer = exports.metadataBlockCss = exports.loadingViewContainer = exports.hiddenSnippetStyles = exports.getTransitionStyles = exports.footerBlockCss = exports.flexibleUiOptions = exports.HoverCardContainer = exports.CARD_WIDTH_REM = exports.CARD_GAP_PX = void 0;
9
9
 
10
10
  var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
11
11
 
@@ -15,7 +15,7 @@ var _index = require("../../index");
15
15
 
16
16
  var _constants = require("../../constants");
17
17
 
18
- var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6, _templateObject7;
18
+ var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6, _templateObject7, _templateObject8, _templateObject9;
19
19
 
20
20
  var flexibleUiOptions = {
21
21
  hideElevation: true,
@@ -44,4 +44,12 @@ exports.footerBlockCss = footerBlockCss;
44
44
  var loadingViewContainer = (0, _core.css)(_templateObject6 || (_templateObject6 = (0, _taggedTemplateLiteral2.default)(["\n display: flex;\n flex-direction: column;\n"])));
45
45
  exports.loadingViewContainer = loadingViewContainer;
46
46
  var skeletonContainer = (0, _core.css)(_templateObject7 || (_templateObject7 = (0, _taggedTemplateLiteral2.default)(["\n display: flex;\n flex-direction: column;\n gap: 0.625rem;\n align-items: center;\n"])));
47
- exports.skeletonContainer = skeletonContainer;
47
+ exports.skeletonContainer = skeletonContainer;
48
+ var hiddenSnippetStyles = (0, _core.css)(_templateObject8 || (_templateObject8 = (0, _taggedTemplateLiteral2.default)(["\n visibility: hidden;\n position: absolute;\n"])));
49
+ exports.hiddenSnippetStyles = hiddenSnippetStyles;
50
+
51
+ var getTransitionStyles = function getTransitionStyles(snippetHeight) {
52
+ return (0, _core.css)(_templateObject9 || (_templateObject9 = (0, _taggedTemplateLiteral2.default)(["\n transition: height 300ms ease-in-out;\n height: ", "px;\n"])), snippetHeight);
53
+ };
54
+
55
+ exports.getTransitionStyles = getTransitionStyles;
@@ -28,6 +28,7 @@ const extractBlockDetails = jsonLd => [extractCommentCount(jsonLd), extractProgr
28
28
  export const extractBlockActions = (props, jsonLd, opts, platform) => {
29
29
  if (opts) {
30
30
  const {
31
+ featureFlags,
31
32
  handleInvoke,
32
33
  handleAnalytics,
33
34
  extensionKey,
@@ -35,7 +36,7 @@ export const extractBlockActions = (props, jsonLd, opts, platform) => {
35
36
  testId
36
37
  } = opts;
37
38
  const actions = extractActions(jsonLd, handleInvoke);
38
- const previewAction = extractPreviewAction(extensionKey, props, jsonLd, handleInvoke, handleAnalytics, testId, platform, source); // The previewAction should always be the last action
39
+ const previewAction = extractPreviewAction(extensionKey, props, jsonLd, handleInvoke, handleAnalytics, testId, platform, source, featureFlags); // The previewAction should always be the last action
39
40
 
40
41
  if (previewAction) {
41
42
  actions.push(previewAction);
@@ -39,7 +39,7 @@ const getInvokeOpts = (key, action, source) => ({
39
39
  }
40
40
  });
41
41
 
42
- export const extractPreviewAction = (extensionKey = 'empty-object-provider', viewProps, jsonLd, handleInvoke, handleAnalytics, testId, platform, source) => {
42
+ export const extractPreviewAction = (extensionKey = 'empty-object-provider', viewProps, jsonLd, handleInvoke, handleAnalytics, testId, platform, source, featureFlags) => {
43
43
  // Extract metadata from view props & raw JSON-LD.
44
44
  const metadataFromJsonLd = getMetadataFromJsonLd(jsonLd, platform);
45
45
  const metadataFromViewProps = getMetadataFromResolvedProps(viewProps);
@@ -51,6 +51,7 @@ export const extractPreviewAction = (extensionKey = 'empty-object-provider', vie
51
51
  // Build action using instrumentation hooks.
52
52
  const key = extensionKey;
53
53
  const previewAction = PreviewAction({ ...metadata,
54
+ featureFlags,
54
55
  testId,
55
56
  onOpen: () => {
56
57
  handleAnalytics(uiRenderSuccessEvent('preview', 'resolved', key));