@atlaskit/smart-card 21.1.4 → 22.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (105) hide show
  1. package/CHANGELOG.md +61 -0
  2. package/dist/cjs/extractors/block/index.js +3 -2
  3. package/dist/cjs/extractors/common/actions/extractPreviewAction.js +12 -2
  4. package/dist/cjs/state/actions/index.js +54 -10
  5. package/dist/cjs/state/analytics/types.js +5 -0
  6. package/dist/cjs/state/analytics/useSmartLinkAnalytics.js +386 -109
  7. package/dist/cjs/state/hooks-external/useSmartLinkActions.js +12 -2
  8. package/dist/cjs/utils/analytics/analytics.js +239 -72
  9. package/dist/cjs/utils/analytics/index.js +32 -5
  10. package/dist/cjs/version.json +1 -1
  11. package/dist/cjs/view/BlockCard/actions/PreviewAction.js +1 -1
  12. package/dist/cjs/view/BlockCard/index.js +10 -0
  13. package/dist/cjs/view/CardWithUrl/component.js +26 -4
  14. package/dist/cjs/view/CardWithUrl/loader.js +6 -1
  15. package/dist/cjs/view/EmbedModal/components/size-experiment/index.js +41 -0
  16. package/dist/cjs/view/EmbedModal/components/size-experiment/types.js +5 -0
  17. package/dist/cjs/view/EmbedModal/index.js +7 -3
  18. package/dist/cjs/view/FlexibleCard/components/blocks/block/index.js +17 -3
  19. package/dist/cjs/view/FlexibleCard/components/blocks/preview-block/index.js +5 -2
  20. package/dist/cjs/view/FlexibleCard/components/common/atlaskit-icon/index.js +20 -8
  21. package/dist/cjs/view/FlexibleCard/components/common/image-icon/index.js +4 -2
  22. package/dist/cjs/view/FlexibleCard/components/common/loading-skeleton/index.js +1 -2
  23. package/dist/cjs/view/FlexibleCard/components/elements/media/index.js +5 -2
  24. package/dist/cjs/view/HoverCard/components/HoverCardComponent.js +9 -2
  25. package/dist/cjs/view/HoverCard/components/HoverCardContent.js +36 -8
  26. package/dist/cjs/view/HoverCard/components/SnippetOrPreview.js +74 -0
  27. package/dist/cjs/view/HoverCard/index.js +6 -1
  28. package/dist/cjs/view/HoverCard/styled.js +11 -3
  29. package/dist/es2019/extractors/block/index.js +2 -1
  30. package/dist/es2019/extractors/common/actions/extractPreviewAction.js +12 -3
  31. package/dist/es2019/state/actions/index.js +54 -10
  32. package/dist/es2019/state/analytics/types.js +1 -0
  33. package/dist/es2019/state/analytics/useSmartLinkAnalytics.js +379 -39
  34. package/dist/es2019/state/hooks-external/useSmartLinkActions.js +11 -2
  35. package/dist/es2019/utils/analytics/analytics.js +253 -78
  36. package/dist/es2019/utils/analytics/index.js +32 -4
  37. package/dist/es2019/version.json +1 -1
  38. package/dist/es2019/view/BlockCard/actions/PreviewAction.js +1 -1
  39. package/dist/es2019/view/BlockCard/index.js +9 -0
  40. package/dist/es2019/view/CardWithUrl/component.js +26 -4
  41. package/dist/es2019/view/CardWithUrl/loader.js +6 -1
  42. package/dist/es2019/view/EmbedModal/components/size-experiment/index.js +28 -0
  43. package/dist/es2019/view/EmbedModal/components/size-experiment/types.js +1 -0
  44. package/dist/es2019/view/EmbedModal/index.js +5 -3
  45. package/dist/es2019/view/FlexibleCard/components/blocks/block/index.js +17 -7
  46. package/dist/es2019/view/FlexibleCard/components/blocks/preview-block/index.js +4 -1
  47. package/dist/es2019/view/FlexibleCard/components/common/atlaskit-icon/index.js +17 -6
  48. package/dist/es2019/view/FlexibleCard/components/common/image-icon/index.js +4 -2
  49. package/dist/es2019/view/FlexibleCard/components/common/loading-skeleton/index.js +2 -3
  50. package/dist/es2019/view/FlexibleCard/components/elements/media/index.js +5 -2
  51. package/dist/es2019/view/HoverCard/components/HoverCardComponent.js +9 -2
  52. package/dist/es2019/view/HoverCard/components/HoverCardContent.js +36 -10
  53. package/dist/es2019/view/HoverCard/components/SnippetOrPreview.js +42 -0
  54. package/dist/es2019/view/HoverCard/index.js +6 -1
  55. package/dist/es2019/view/HoverCard/styled.js +8 -0
  56. package/dist/esm/extractors/block/index.js +3 -2
  57. package/dist/esm/extractors/common/actions/extractPreviewAction.js +12 -2
  58. package/dist/esm/state/actions/index.js +54 -10
  59. package/dist/esm/state/analytics/types.js +1 -0
  60. package/dist/esm/state/analytics/useSmartLinkAnalytics.js +383 -109
  61. package/dist/esm/state/hooks-external/useSmartLinkActions.js +11 -2
  62. package/dist/esm/utils/analytics/analytics.js +239 -72
  63. package/dist/esm/utils/analytics/index.js +31 -4
  64. package/dist/esm/version.json +1 -1
  65. package/dist/esm/view/BlockCard/actions/PreviewAction.js +1 -1
  66. package/dist/esm/view/BlockCard/index.js +9 -0
  67. package/dist/esm/view/CardWithUrl/component.js +26 -4
  68. package/dist/esm/view/CardWithUrl/loader.js +6 -1
  69. package/dist/esm/view/EmbedModal/components/size-experiment/index.js +28 -0
  70. package/dist/esm/view/EmbedModal/components/size-experiment/types.js +1 -0
  71. package/dist/esm/view/EmbedModal/index.js +6 -3
  72. package/dist/esm/view/FlexibleCard/components/blocks/block/index.js +11 -3
  73. package/dist/esm/view/FlexibleCard/components/blocks/preview-block/index.js +5 -2
  74. package/dist/esm/view/FlexibleCard/components/common/atlaskit-icon/index.js +18 -8
  75. package/dist/esm/view/FlexibleCard/components/common/image-icon/index.js +4 -2
  76. package/dist/esm/view/FlexibleCard/components/common/loading-skeleton/index.js +1 -2
  77. package/dist/esm/view/FlexibleCard/components/elements/media/index.js +5 -2
  78. package/dist/esm/view/HoverCard/components/HoverCardComponent.js +9 -2
  79. package/dist/esm/view/HoverCard/components/HoverCardContent.js +36 -10
  80. package/dist/esm/view/HoverCard/components/SnippetOrPreview.js +53 -0
  81. package/dist/esm/view/HoverCard/index.js +6 -1
  82. package/dist/esm/view/HoverCard/styled.js +6 -2
  83. package/dist/types/extractors/block/types.d.ts +2 -0
  84. package/dist/types/extractors/common/actions/extractPreviewAction.d.ts +2 -1
  85. package/dist/types/state/analytics/types.d.ts +9 -0
  86. package/dist/types/state/analytics/useSmartLinkAnalytics.d.ts +18 -23
  87. package/dist/types/state/hooks/useSmartLink.d.ts +17 -18
  88. package/dist/types/utils/analytics/analytics.d.ts +19 -21
  89. package/dist/types/utils/analytics/index.d.ts +2 -2
  90. package/dist/types/utils/analytics/types.d.ts +91 -0
  91. package/dist/types/view/BlockCard/actions/PreviewAction.d.ts +4 -2
  92. package/dist/types/view/Card/index.d.ts +1 -1
  93. package/dist/types/view/EmbedModal/components/size-experiment/index.d.ts +6 -0
  94. package/dist/types/view/EmbedModal/components/size-experiment/types.d.ts +4 -0
  95. package/dist/types/view/EmbedModal/index.d.ts +1 -1
  96. package/dist/types/view/EmbedModal/types.d.ts +4 -0
  97. package/dist/types/view/FlexibleCard/components/blocks/preview-block/types.d.ts +7 -1
  98. package/dist/types/view/FlexibleCard/components/blocks/types.d.ts +15 -0
  99. package/dist/types/view/FlexibleCard/components/common/image-icon/types.d.ts +1 -0
  100. package/dist/types/view/FlexibleCard/components/elements/media/types.d.ts +5 -0
  101. package/dist/types/view/HoverCard/components/SnippetOrPreview.d.ts +4 -0
  102. package/dist/types/view/HoverCard/styled.d.ts +2 -0
  103. package/dist/types/view/HoverCard/types.d.ts +5 -0
  104. package/package.json +2 -2
  105. package/report.api.md +294 -110
@@ -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
 
@@ -90,7 +90,16 @@ function CardWithUrlContent(_ref) {
90
90
  }, [state.details, url]);
91
91
  var handleClickWrapper = (0, _react.useCallback)(function (event) {
92
92
  var isModifierKeyPressed = (0, _utils.isSpecialEvent)(event);
93
- analytics.ui.cardClickedEvent(id, isFlexibleUi ? 'flexible' : appearance, state.status, definitionId, extensionKey, isModifierKeyPressed, undefined, product, subproduct);
93
+ analytics.ui.cardClickedEvent({
94
+ id: id,
95
+ display: isFlexibleUi ? 'flexible' : appearance,
96
+ status: state.status,
97
+ definitionId: definitionId,
98
+ extensionKey: extensionKey,
99
+ isModifierKeyPressed: isModifierKeyPressed,
100
+ destinationProduct: product,
101
+ destinationSubproduct: subproduct
102
+ });
94
103
 
95
104
  if (onClick) {
96
105
  onClick(event);
@@ -114,7 +123,14 @@ function CardWithUrlContent(_ref) {
114
123
 
115
124
  if (state.status !== 'pending') {
116
125
  measure.create(id, state.status);
117
- analytics.operational.instrument(id, state.status, definitionId, extensionKey, resourceType, state.error);
126
+ analytics.operational.instrument({
127
+ id: id,
128
+ status: state.status,
129
+ definitionId: definitionId,
130
+ extensionKey: extensionKey,
131
+ resourceType: resourceType,
132
+ error: state.error
133
+ });
118
134
  }
119
135
  }, [id, appearance, state.status, state.error, definitionId, extensionKey, resourceType, analytics.operational]); // NB: once the smart-card has rendered into an end state, we capture
120
136
  // this as a successful render. These can be one of:
@@ -123,7 +139,13 @@ function CardWithUrlContent(_ref) {
123
139
 
124
140
  (0, _react.useEffect)(function () {
125
141
  if ((0, _helpers.isFinalState)(state.status)) {
126
- analytics.ui.renderSuccessEvent(appearance, state.status, id, definitionId, extensionKey);
142
+ analytics.ui.renderSuccessEvent({
143
+ display: appearance,
144
+ status: state.status,
145
+ id: id,
146
+ definitionId: definitionId,
147
+ extensionKey: extensionKey
148
+ });
127
149
  }
128
150
  }, [appearance, state.status, url, definitionId, extensionKey, analytics.ui, id]);
129
151
 
@@ -96,7 +96,12 @@ function CardWithURLRenderer(props) {
96
96
  var errorInfo = {
97
97
  componentStack: componentStack
98
98
  };
99
- analytics.ui.renderFailedEvent(appearance, id, error, errorInfo);
99
+ analytics.ui.renderFailedEvent({
100
+ display: appearance,
101
+ id: id,
102
+ error: error,
103
+ errorInfo: errorInfo
104
+ });
100
105
  }
101
106
  }, [analytics.ui, appearance, id]);
102
107
 
@@ -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
 
@@ -75,7 +75,11 @@ var HoverCardComponent = function HoverCardComponent(_ref) {
75
75
  //Check its previously open to avoid firing events when moving between the child and hover card components
76
76
  if (isOpen === true && cardOpenTime.current) {
77
77
  var hoverTime = Date.now() - cardOpenTime.current;
78
- analytics.ui.hoverCardDismissedEvent('card', hoverTime, 'mouse_hover');
78
+ analytics.ui.hoverCardDismissedEvent({
79
+ previewDisplay: 'card',
80
+ hoverTime: hoverTime,
81
+ previewInvokeMethod: 'mouse_hover'
82
+ });
79
83
  }
80
84
 
81
85
  setIsOpen(false);
@@ -100,7 +104,10 @@ var HoverCardComponent = function HoverCardComponent(_ref) {
100
104
  //Check if its previously closed to avoid firing events when moving between the child and hover card components
101
105
  if (isOpen === false) {
102
106
  cardOpenTime.current = Date.now();
103
- analytics.ui.hoverCardViewedEvent(hoverDisplay, invokeMethod);
107
+ analytics.ui.hoverCardViewedEvent({
108
+ previewDisplay: hoverDisplay,
109
+ previewInvokeMethod: invokeMethod
110
+ });
104
111
  } //If these are undefined then popupOffset is undefined and we fallback to default bottom-start placement
105
112
 
106
113
 
@@ -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; }
@@ -55,7 +55,9 @@ var getOpenAction = function getOpenAction(url, analytics, onActionClick) {
55
55
  }
56
56
 
57
57
  window.open(url, '_blank');
58
- analytics.ui.hoverCardOpenLinkClickedEvent('card');
58
+ analytics.ui.hoverCardOpenLinkClickedEvent({
59
+ previewDisplay: 'card'
60
+ });
59
61
  },
60
62
  testId: 'hover-card-open-button'
61
63
  };
@@ -102,15 +104,24 @@ var HoverCardContent = function HoverCardContent(_ref) {
102
104
  (0, _react.useEffect)(function () {
103
105
  // Since hover preview only render on resolved status,
104
106
  // there is no need to check for statuses.
105
- analytics.ui.renderSuccessEvent(_utils2.SMART_CARD_ANALYTICS_DISPLAY, cardState.status);
107
+ analytics.ui.renderSuccessEvent({
108
+ display: _utils2.SMART_CARD_ANALYTICS_DISPLAY,
109
+ status: cardState.status
110
+ });
106
111
  }, [analytics.ui, cardState.status]);
107
112
  var extensionKey = (0, _react.useMemo)(function () {
108
113
  return (0, _helpers.getExtensionKey)(cardState.details);
109
114
  }, [cardState.details]);
110
115
  var onClick = (0, _react.useCallback)(function (event) {
111
116
  var isModifierKeyPressed = (0, _utils.isSpecialEvent)(event);
112
- analytics.ui.cardClickedEvent(undefined, _utils2.SMART_CARD_ANALYTICS_DISPLAY, cardState.status, undefined, undefined, isModifierKeyPressed, undefined, undefined, undefined, 'titleGoToLink');
113
- }, [cardState.status, analytics.ui]);
117
+ analytics.ui.cardClickedEvent({
118
+ id: id,
119
+ display: _utils2.SMART_CARD_ANALYTICS_DISPLAY,
120
+ status: cardState.status,
121
+ isModifierKeyPressed: isModifierKeyPressed,
122
+ actionSubjectId: 'titleGoToLink'
123
+ });
124
+ }, [cardState.status, analytics.ui, id]);
114
125
  var titleActions = (0, _react.useMemo)(function () {
115
126
  return [getOpenAction(url, analytics, onActionClick)];
116
127
  }, [url, analytics, onActionClick]);
@@ -126,7 +137,19 @@ var HoverCardContent = function HoverCardContent(_ref) {
126
137
  subtitle = _extractMetadata.subtitle;
127
138
 
128
139
  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);
140
+
141
+ var snippetHeight = _react.default.useRef(0);
142
+
143
+ var snippetBlockRef = (0, _react.useRef)(null);
144
+ var onSnippetRender = (0, _react.useCallback)(function () {
145
+ var _snippetBlockRef$curr, _snippetBlockRef$curr2;
146
+
147
+ 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;
148
+ }, []);
149
+ var body = (0, _SnippetOrPreview.default)({
150
+ data: data,
151
+ snippetHeight: snippetHeight.current
152
+ });
130
153
  var titleBlockProps = {
131
154
  actions: titleActions,
132
155
  maxLines: titleMaxLines,
@@ -159,7 +182,12 @@ var HoverCardContent = function HoverCardContent(_ref) {
159
182
  size: _constants.SmartLinkSize.Large,
160
183
  overrideCss: _styled.metadataBlockCss,
161
184
  maxLines: 1
162
- }), body, /*#__PURE__*/_react.default.createElement(_blocks.FooterBlock, {
185
+ }), body, /*#__PURE__*/_react.default.createElement(_blocks.SnippetBlock, {
186
+ testId: 'hidden-snippet',
187
+ onRender: onSnippetRender,
188
+ blockRef: snippetBlockRef,
189
+ overrideCss: _styled.hiddenSnippetStyles
190
+ }), /*#__PURE__*/_react.default.createElement(_blocks.FooterBlock, {
163
191
  actions: footerActions,
164
192
  size: _constants.SmartLinkSize.Large,
165
193
  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;
@@ -36,7 +36,12 @@ var HoverCardWithErrorBoundary = function HoverCardWithErrorBoundary(props) {
36
36
  }, [createAnalyticsEvent]);
37
37
  var analytics = (0, _analytics.useSmartLinkAnalytics)(url, analyticsHandler, id);
38
38
  var onError = (0, _react.useCallback)(function (error, info) {
39
- analytics.ui.renderFailedEvent(_utils.SMART_CARD_ANALYTICS_DISPLAY, id, error, info);
39
+ analytics.ui.renderFailedEvent({
40
+ display: _utils.SMART_CARD_ANALYTICS_DISPLAY,
41
+ id: id,
42
+ error: error,
43
+ errorInfo: info
44
+ });
40
45
  }, [analytics.ui, id]);
41
46
  return (0, _core.jsx)(_reactErrorBoundary.ErrorBoundary, {
42
47
  fallback: children,
@@ -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,12 +51,21 @@ 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
- handleAnalytics(uiRenderSuccessEvent('preview', 'resolved', key));
57
+ handleAnalytics(uiRenderSuccessEvent({
58
+ display: 'preview',
59
+ status: 'resolved',
60
+ extensionKey: key
61
+ }));
57
62
  },
58
63
  onOpenFailed: (error, errorInfo) => {
59
- handleAnalytics(uiRenderFailedEvent('preview', error, errorInfo));
64
+ handleAnalytics(uiRenderFailedEvent({
65
+ display: 'preview',
66
+ error,
67
+ errorInfo
68
+ }));
60
69
  },
61
70
  onDownloadActionClick: () => {
62
71
  handleInvoke(getInvokeOpts(key, 'DownloadAction'));