@atlaskit/smart-card 21.2.0 → 22.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 (128) hide show
  1. package/CHANGELOG.md +56 -0
  2. package/dist/cjs/extractors/block/index.js +6 -7
  3. package/dist/cjs/extractors/common/actions/extractPreviewAction.js +16 -19
  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 +429 -109
  7. package/dist/cjs/state/hooks-external/useSmartLinkActions.js +5 -3
  8. package/dist/cjs/utils/analytics/analytics.js +241 -74
  9. package/dist/cjs/utils/analytics/index.js +32 -5
  10. package/dist/cjs/utils/mocks.js +28 -2
  11. package/dist/cjs/version.json +1 -1
  12. package/dist/cjs/view/BlockCard/actions/PreviewAction.js +2 -2
  13. package/dist/cjs/view/BlockCard/index.js +6 -5
  14. package/dist/cjs/view/CardWithUrl/component.js +27 -5
  15. package/dist/cjs/view/CardWithUrl/loader.js +6 -1
  16. package/dist/cjs/view/EmbedCard/index.js +3 -2
  17. package/dist/cjs/view/EmbedModal/components/analytics/index.js +100 -0
  18. package/dist/cjs/view/EmbedModal/components/analytics/types.js +5 -0
  19. package/dist/cjs/view/EmbedModal/components/size-experiment/index.js +5 -10
  20. package/dist/cjs/view/EmbedModal/index.js +54 -15
  21. package/dist/cjs/view/EmbedModal/types.js +9 -1
  22. package/dist/cjs/view/FlexibleCard/components/blocks/block/index.js +17 -3
  23. package/dist/cjs/view/FlexibleCard/components/blocks/preview-block/index.js +5 -2
  24. package/dist/cjs/view/FlexibleCard/components/common/image-icon/index.js +4 -2
  25. package/dist/cjs/view/FlexibleCard/components/common/loading-skeleton/index.js +1 -2
  26. package/dist/cjs/view/FlexibleCard/components/elements/media/index.js +5 -2
  27. package/dist/cjs/view/HoverCard/components/HoverCardComponent.js +11 -3
  28. package/dist/cjs/view/HoverCard/components/HoverCardContent.js +36 -8
  29. package/dist/cjs/view/HoverCard/components/SnippetOrPreview.js +74 -0
  30. package/dist/cjs/view/HoverCard/index.js +6 -1
  31. package/dist/cjs/view/HoverCard/styled.js +11 -3
  32. package/dist/cjs/view/common/Modal.js +29 -4
  33. package/dist/cjs/view/common/ModalHeader.js +3 -2
  34. package/dist/es2019/extractors/block/index.js +6 -7
  35. package/dist/es2019/extractors/common/actions/extractPreviewAction.js +16 -10
  36. package/dist/es2019/state/actions/index.js +54 -10
  37. package/dist/es2019/state/analytics/types.js +1 -0
  38. package/dist/es2019/state/analytics/useSmartLinkAnalytics.js +424 -41
  39. package/dist/es2019/state/hooks-external/useSmartLinkActions.js +5 -3
  40. package/dist/es2019/utils/analytics/analytics.js +254 -79
  41. package/dist/es2019/utils/analytics/index.js +32 -4
  42. package/dist/es2019/utils/mocks.js +26 -1
  43. package/dist/es2019/version.json +1 -1
  44. package/dist/es2019/view/BlockCard/actions/PreviewAction.js +3 -3
  45. package/dist/es2019/view/BlockCard/index.js +5 -4
  46. package/dist/es2019/view/CardWithUrl/component.js +27 -5
  47. package/dist/es2019/view/CardWithUrl/loader.js +6 -1
  48. package/dist/es2019/view/EmbedCard/index.js +3 -2
  49. package/dist/es2019/view/EmbedModal/components/analytics/index.js +80 -0
  50. package/dist/es2019/view/EmbedModal/components/analytics/types.js +1 -0
  51. package/dist/es2019/view/EmbedModal/components/size-experiment/index.js +5 -9
  52. package/dist/es2019/view/EmbedModal/index.js +46 -13
  53. package/dist/es2019/view/EmbedModal/types.js +6 -1
  54. package/dist/es2019/view/FlexibleCard/components/blocks/block/index.js +17 -7
  55. package/dist/es2019/view/FlexibleCard/components/blocks/preview-block/index.js +4 -1
  56. package/dist/es2019/view/FlexibleCard/components/common/image-icon/index.js +4 -2
  57. package/dist/es2019/view/FlexibleCard/components/common/loading-skeleton/index.js +2 -3
  58. package/dist/es2019/view/FlexibleCard/components/elements/media/index.js +5 -2
  59. package/dist/es2019/view/HoverCard/components/HoverCardComponent.js +11 -3
  60. package/dist/es2019/view/HoverCard/components/HoverCardContent.js +36 -10
  61. package/dist/es2019/view/HoverCard/components/SnippetOrPreview.js +42 -0
  62. package/dist/es2019/view/HoverCard/index.js +6 -1
  63. package/dist/es2019/view/HoverCard/styled.js +8 -0
  64. package/dist/es2019/view/common/Modal.js +27 -6
  65. package/dist/es2019/view/common/ModalHeader.js +3 -2
  66. package/dist/esm/extractors/block/index.js +6 -7
  67. package/dist/esm/extractors/common/actions/extractPreviewAction.js +17 -19
  68. package/dist/esm/state/actions/index.js +54 -10
  69. package/dist/esm/state/analytics/types.js +1 -0
  70. package/dist/esm/state/analytics/useSmartLinkAnalytics.js +428 -111
  71. package/dist/esm/state/hooks-external/useSmartLinkActions.js +5 -3
  72. package/dist/esm/utils/analytics/analytics.js +241 -74
  73. package/dist/esm/utils/analytics/index.js +31 -4
  74. package/dist/esm/utils/mocks.js +25 -0
  75. package/dist/esm/version.json +1 -1
  76. package/dist/esm/view/BlockCard/actions/PreviewAction.js +3 -3
  77. package/dist/esm/view/BlockCard/index.js +5 -4
  78. package/dist/esm/view/CardWithUrl/component.js +27 -5
  79. package/dist/esm/view/CardWithUrl/loader.js +6 -1
  80. package/dist/esm/view/EmbedCard/index.js +3 -2
  81. package/dist/esm/view/EmbedModal/components/analytics/index.js +82 -0
  82. package/dist/esm/view/EmbedModal/components/analytics/types.js +1 -0
  83. package/dist/esm/view/EmbedModal/components/size-experiment/index.js +5 -10
  84. package/dist/esm/view/EmbedModal/index.js +52 -15
  85. package/dist/esm/view/EmbedModal/types.js +6 -1
  86. package/dist/esm/view/FlexibleCard/components/blocks/block/index.js +11 -3
  87. package/dist/esm/view/FlexibleCard/components/blocks/preview-block/index.js +5 -2
  88. package/dist/esm/view/FlexibleCard/components/common/image-icon/index.js +4 -2
  89. package/dist/esm/view/FlexibleCard/components/common/loading-skeleton/index.js +1 -2
  90. package/dist/esm/view/FlexibleCard/components/elements/media/index.js +5 -2
  91. package/dist/esm/view/HoverCard/components/HoverCardComponent.js +11 -3
  92. package/dist/esm/view/HoverCard/components/HoverCardContent.js +36 -10
  93. package/dist/esm/view/HoverCard/components/SnippetOrPreview.js +53 -0
  94. package/dist/esm/view/HoverCard/index.js +6 -1
  95. package/dist/esm/view/HoverCard/styled.js +6 -2
  96. package/dist/esm/view/common/Modal.js +28 -6
  97. package/dist/esm/view/common/ModalHeader.js +3 -2
  98. package/dist/types/extractors/block/types.d.ts +4 -2
  99. package/dist/types/extractors/common/actions/extractPreviewAction.d.ts +7 -5
  100. package/dist/types/state/analytics/types.d.ts +9 -0
  101. package/dist/types/state/analytics/useSmartLinkAnalytics.d.ts +41 -24
  102. package/dist/types/state/hooks/useSmartLink.d.ts +26 -18
  103. package/dist/types/state/hooks-external/useSmartLinkActions.d.ts +6 -2
  104. package/dist/types/utils/analytics/analytics.d.ts +19 -21
  105. package/dist/types/utils/analytics/index.d.ts +2 -2
  106. package/dist/types/utils/analytics/types.d.ts +91 -0
  107. package/dist/types/utils/mocks.d.ts +48 -0
  108. package/dist/types/utils/types.d.ts +3 -1
  109. package/dist/types/view/BlockCard/actions/PreviewAction.d.ts +4 -0
  110. package/dist/types/view/BlockCard/index.d.ts +2 -2
  111. package/dist/types/view/BlockCard/types.d.ts +4 -4
  112. package/dist/types/view/Card/index.d.ts +1 -1
  113. package/dist/types/view/EmbedCard/types.d.ts +2 -2
  114. package/dist/types/view/EmbedModal/components/analytics/index.d.ts +5 -0
  115. package/dist/types/view/EmbedModal/components/analytics/types.d.ts +6 -0
  116. package/dist/types/view/EmbedModal/components/size-experiment/index.d.ts +4 -3
  117. package/dist/types/view/EmbedModal/index.d.ts +3 -1
  118. package/dist/types/view/EmbedModal/types.d.ts +14 -4
  119. package/dist/types/view/FlexibleCard/components/blocks/preview-block/types.d.ts +7 -1
  120. package/dist/types/view/FlexibleCard/components/blocks/types.d.ts +15 -0
  121. package/dist/types/view/FlexibleCard/components/common/image-icon/types.d.ts +1 -0
  122. package/dist/types/view/FlexibleCard/components/elements/media/types.d.ts +5 -0
  123. package/dist/types/view/HoverCard/components/SnippetOrPreview.d.ts +4 -0
  124. package/dist/types/view/HoverCard/styled.d.ts +2 -0
  125. package/dist/types/view/HoverCard/types.d.ts +5 -0
  126. package/dist/types/view/common/Modal.d.ts +6 -8
  127. package/package.json +1 -1
  128. package/report.api.md +324 -108
@@ -90,9 +90,9 @@ function _previewFunction() {
90
90
  _reactDom.default.render( /*#__PURE__*/_react.default.createElement(_reactIntlNext.IntlProvider, {
91
91
  locale: "en"
92
92
  }, /*#__PURE__*/_react.default.createElement(Modal.default, (0, _extends2.default)({}, rest, {
93
- onClose: function onClose() {
93
+ onClose: function onClose(context) {
94
94
  if (popupMountPoint) {
95
- _onClose();
95
+ _onClose(context);
96
96
 
97
97
  _reactDom.default.unmountComponentAtNode(popupMountPoint);
98
98
  }
@@ -75,8 +75,6 @@ var _context = require("../../extractors/common/context");
75
75
 
76
76
  var _LinkView = require("../LinkView");
77
77
 
78
- var _PreviewAction = _interopRequireDefault(require("./actions/PreviewAction"));
79
-
80
78
  var _AuthorizeAction = require("./actions/AuthorizeAction");
81
79
 
82
80
  var _ForbiddenAction = require("./actions/ForbiddenAction");
@@ -95,6 +93,8 @@ var _ErroredView = require("./views/ErroredView");
95
93
 
96
94
  var _linkProvider = require("@atlaskit/link-provider");
97
95
 
96
+ var _PreviewAction = _interopRequireDefault(require("./actions/PreviewAction"));
97
+
98
98
  var BlockCard = function BlockCard(_ref) {
99
99
  var _details$meta, _forbiddenViewProps$c;
100
100
 
@@ -106,7 +106,6 @@ var BlockCard = function BlockCard(_ref) {
106
106
  handleAuthorize = _ref.handleAuthorize,
107
107
  handleErrorRetry = _ref.handleErrorRetry,
108
108
  handleFrameClick = _ref.handleFrameClick,
109
- handleAnalytics = _ref.handleAnalytics,
110
109
  handleInvoke = _ref.handleInvoke,
111
110
  renderers = _ref.renderers,
112
111
  isSelected = _ref.isSelected,
@@ -114,7 +113,8 @@ var BlockCard = function BlockCard(_ref) {
114
113
  onError = _ref.onError,
115
114
  testId = _ref.testId,
116
115
  showActions = _ref.showActions,
117
- platform = _ref.platform;
116
+ platform = _ref.platform,
117
+ analytics = _ref.analytics;
118
118
  // Actions do not have access to the react tree, so we need to obtain
119
119
  // feature flags here where we still can access SmartLinkContext context
120
120
  // and pass the flags down to the extractor. See PreviewAction.tsx for details.
@@ -125,8 +125,9 @@ var BlockCard = function BlockCard(_ref) {
125
125
  var data = details && details.data || (0, _jsonld.getEmptyJsonLd)();
126
126
  var meta = details && details.meta;
127
127
  var extractorOpts = {
128
+ analytics: analytics,
129
+ origin: 'smartLinkCard',
128
130
  featureFlags: featureFlags,
129
- handleAnalytics: handleAnalytics,
130
131
  handleInvoke: handleInvoke,
131
132
  extensionKey: (0, _helpers.getExtensionKey)(details)
132
133
  };
@@ -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
 
@@ -187,7 +209,7 @@ function CardWithUrlContent(_ref) {
187
209
  handleErrorRetry: handleRetry,
188
210
  handleInvoke: handleInvoke,
189
211
  handleFrameClick: handleClickWrapper,
190
- handleAnalytics: dispatchAnalytics,
212
+ analytics: analytics,
191
213
  isSelected: isSelected,
192
214
  onResolve: onResolve,
193
215
  onError: onError,
@@ -205,7 +227,7 @@ function CardWithUrlContent(_ref) {
205
227
  handleErrorRetry: handleRetry,
206
228
  handleFrameClick: handleClickWrapper,
207
229
  handleInvoke: handleInvoke,
208
- handleAnalytics: dispatchAnalytics,
230
+ analytics: analytics,
209
231
  isSelected: isSelected,
210
232
  isFrameVisible: isFrameVisible,
211
233
  platform: platform,
@@ -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
 
@@ -47,7 +47,7 @@ var EmbedCard = /*#__PURE__*/_react.default.forwardRef(function (_ref, iframeRef
47
47
  handleAuthorize = _ref.handleAuthorize,
48
48
  handleErrorRetry = _ref.handleErrorRetry,
49
49
  handleFrameClick = _ref.handleFrameClick,
50
- handleAnalytics = _ref.handleAnalytics,
50
+ analytics = _ref.analytics,
51
51
  handleInvoke = _ref.handleInvoke,
52
52
  showActions = _ref.showActions,
53
53
  isSelected = _ref.isSelected,
@@ -101,7 +101,8 @@ var EmbedCard = /*#__PURE__*/_react.default.forwardRef(function (_ref, iframeRef
101
101
  }
102
102
 
103
103
  var resolvedBlockViewProps = (0, _block.extractBlockProps)(data, meta, {
104
- handleAnalytics: handleAnalytics,
104
+ analytics: analytics,
105
+ origin: 'smartLinkEmbed',
105
106
  handleInvoke: handleInvoke,
106
107
  extensionKey: (0, _helpers.getExtensionKey)(details)
107
108
  });
@@ -0,0 +1,100 @@
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 _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
13
+
14
+ var _react = _interopRequireWildcard(require("react"));
15
+
16
+ var _types = require("../../types");
17
+
18
+ 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); }
19
+
20
+ 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; }
21
+
22
+ var getResizeFrom = function getResizeFrom(size) {
23
+ return size === _types.EmbedModalSize.Small ? _types.EmbedModalSize.Large : _types.EmbedModalSize.Small;
24
+ };
25
+
26
+ var withAnalytics = function withAnalytics(Component) {
27
+ return function (props) {
28
+ var analytics = props.analytics,
29
+ onClose = props.onClose,
30
+ onOpen = props.onOpen,
31
+ onOpenFailed = props.onOpenFailed,
32
+ onResize = props.onResize,
33
+ origin = props.origin;
34
+ var handleOnOpen = (0, _react.useCallback)(function (context) {
35
+ analytics.screen.modalViewedEvent({
36
+ name: 'embedPreviewModal',
37
+ attributes: {
38
+ origin: origin,
39
+ size: context.size
40
+ }
41
+ });
42
+ analytics.ui.renderSuccessEvent({
43
+ status: 'resolved',
44
+ display: 'preview'
45
+ });
46
+
47
+ if (onOpen) {
48
+ onOpen(context);
49
+ }
50
+ }, [analytics.screen, analytics.ui, onOpen, origin]);
51
+ var handleOnOpenFailed = (0, _react.useCallback)(function (error, errorInfo) {
52
+ analytics.ui.renderFailedEvent({
53
+ display: 'preview',
54
+ error: error,
55
+ errorInfo: errorInfo
56
+ });
57
+
58
+ if (onOpenFailed) {
59
+ onOpenFailed(error, errorInfo);
60
+ }
61
+ }, [analytics.ui, onOpenFailed]);
62
+ var handleOnClose = (0, _react.useCallback)(function (context) {
63
+ analytics.ui.modalClosedEvent({
64
+ actionSubjectId: 'embedPreview',
65
+ attributes: {
66
+ origin: origin,
67
+ previewTime: context.duration,
68
+ size: context.size
69
+ }
70
+ });
71
+
72
+ if (onClose) {
73
+ onClose(context);
74
+ }
75
+ }, [analytics.ui, onClose, origin]);
76
+ var handleOnResize = (0, _react.useCallback)(function (context) {
77
+ analytics.ui.buttonClickedEvent({
78
+ actionSubjectId: 'embedPreviewResize',
79
+ attributes: {
80
+ newSize: context.size,
81
+ origin: origin,
82
+ previousSize: getResizeFrom(context.size)
83
+ }
84
+ });
85
+
86
+ if (onResize) {
87
+ onResize(context);
88
+ }
89
+ }, [analytics.ui, onResize, origin]);
90
+ return /*#__PURE__*/_react.default.createElement(Component, (0, _extends2.default)({}, props, {
91
+ onClose: handleOnClose,
92
+ onOpen: handleOnOpen,
93
+ onOpenFailed: handleOnOpenFailed,
94
+ onResize: handleOnResize
95
+ }));
96
+ };
97
+ };
98
+
99
+ var _default = withAnalytics;
100
+ exports.default = _default;
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
@@ -13,27 +13,22 @@ var _react = _interopRequireDefault(require("react"));
13
13
 
14
14
  var _Modal = _interopRequireDefault(require("../../../common/Modal"));
15
15
 
16
- var _constants = require("../../constants");
16
+ var _types = require("../../types");
17
17
 
18
18
  var withSizeExperiment = function withSizeExperiment(Component) {
19
19
  return function (props) {
20
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
21
+ featureFlags = _props$featureFlags === void 0 ? {} : _props$featureFlags;
22
+ var size = featureFlags.embedModalSize; // Experiment
25
23
 
26
- if (embedModalSize === 'large' || embedModalSize === 'small') {
27
- var size = embedModalSize === 'large' ? _constants.MAX_MODAL_SIZE : _constants.MIN_MODAL_SIZE;
24
+ if (size === _types.EmbedModalSize.Large || size === _types.EmbedModalSize.Small) {
28
25
  return /*#__PURE__*/_react.default.createElement(Component, (0, _extends2.default)({}, props, {
29
26
  size: size
30
27
  }));
31
28
  } // Control
32
29
 
33
30
 
34
- return /*#__PURE__*/_react.default.createElement(_Modal.default, (0, _extends2.default)({}, props, {
35
- closeLabel: closeLabel
36
- }));
31
+ return /*#__PURE__*/_react.default.createElement(_Modal.default, props);
37
32
  };
38
33
  };
39
34
 
@@ -21,14 +21,26 @@ var _constants = require("./constants");
21
21
 
22
22
  var _embedContent = _interopRequireDefault(require("./components/embed-content"));
23
23
 
24
+ var _types = require("./types");
25
+
24
26
  var _errorBoundary = _interopRequireDefault(require("./components/error-boundary"));
25
27
 
26
28
  var _sizeExperiment = _interopRequireDefault(require("./components/size-experiment"));
27
29
 
30
+ var _analytics = _interopRequireDefault(require("./components/analytics"));
31
+
28
32
  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
33
 
30
34
  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
35
 
36
+ var toSize = function toSize(width) {
37
+ return width === _constants.MAX_MODAL_SIZE ? _types.EmbedModalSize.Large : _types.EmbedModalSize.Small;
38
+ };
39
+
40
+ var toWidth = function toWidth(size) {
41
+ return size === _types.EmbedModalSize.Large ? _constants.MAX_MODAL_SIZE : _constants.MIN_MODAL_SIZE;
42
+ };
43
+
32
44
  var EmbedModal = function EmbedModal(_ref) {
33
45
  var downloadUrl = _ref.download,
34
46
  icon = _ref.icon,
@@ -38,49 +50,76 @@ var EmbedModal = function EmbedModal(_ref) {
38
50
  onClose = _ref.onClose,
39
51
  onDownloadActionClick = _ref.onDownloadActionClick,
40
52
  onOpen = _ref.onOpen,
53
+ onResize = _ref.onResize,
41
54
  onViewActionClick = _ref.onViewActionClick,
42
55
  providerName = _ref.providerName,
43
56
  showModal = _ref.showModal,
44
57
  _ref$size = _ref.size,
45
- defaultSize = _ref$size === void 0 ? _constants.MIN_MODAL_SIZE : _ref$size,
58
+ size = _ref$size === void 0 ? _types.EmbedModalSize.Small : _ref$size,
46
59
  src = _ref.src,
47
60
  _ref$testId = _ref.testId,
48
61
  testId = _ref$testId === void 0 ? 'smart-embed-preview-modal' : _ref$testId,
49
62
  title = _ref.title,
50
63
  url = _ref.url;
64
+ var defaultWidth = toWidth(size);
51
65
 
52
66
  var _useState = (0, _react.useState)(showModal),
53
67
  _useState2 = (0, _slicedToArray2.default)(_useState, 2),
54
68
  isOpen = _useState2[0],
55
69
  setIsOpen = _useState2[1];
56
70
 
57
- var _useState3 = (0, _react.useState)(defaultSize),
71
+ var _useState3 = (0, _react.useState)(defaultWidth),
58
72
  _useState4 = (0, _slicedToArray2.default)(_useState3, 2),
59
- size = _useState4[0],
60
- setSize = _useState4[1];
61
-
73
+ width = _useState4[0],
74
+ setWidth = _useState4[1];
75
+
76
+ var openAt = (0, _react.useRef)();
77
+ var handleOnOpenComplete = (0, _react.useCallback)(function () {
78
+ openAt.current = Date.now();
79
+
80
+ if (onOpen) {
81
+ onOpen({
82
+ size: size
83
+ });
84
+ }
85
+ }, [onOpen, size]);
62
86
  var handleOnClose = (0, _react.useCallback)(function () {
63
87
  return setIsOpen(false);
64
88
  }, []);
65
- var handleOnSizeClick = (0, _react.useCallback)(function () {
66
- var newSize = size === _constants.MIN_MODAL_SIZE ? _constants.MAX_MODAL_SIZE : _constants.MIN_MODAL_SIZE;
67
- setSize(newSize);
68
- }, [size]);
89
+ var handleOnCloseComplete = (0, _react.useCallback)(function () {
90
+ if (onClose) {
91
+ var duration = openAt.current ? Date.now() - openAt.current : undefined;
92
+ onClose({
93
+ duration: duration,
94
+ size: toSize(width)
95
+ });
96
+ }
97
+ }, [onClose, width]);
98
+ var handleOnResizeClick = (0, _react.useCallback)(function () {
99
+ var newWidth = width === _constants.MIN_MODAL_SIZE ? _constants.MAX_MODAL_SIZE : _constants.MIN_MODAL_SIZE;
100
+ setWidth(newWidth);
101
+
102
+ if (onResize) {
103
+ onResize({
104
+ size: toSize(newWidth)
105
+ });
106
+ }
107
+ }, [onResize, width]);
69
108
  return /*#__PURE__*/_react.default.createElement(_modalDialog.ModalTransition, null, isOpen && /*#__PURE__*/_react.default.createElement(_modalDialog.default, {
70
109
  height: "100%",
71
110
  onClose: handleOnClose,
72
- onCloseComplete: onClose,
73
- onOpenComplete: onOpen,
111
+ onCloseComplete: handleOnCloseComplete,
112
+ onOpenComplete: handleOnOpenComplete,
74
113
  testId: testId,
75
- width: size
114
+ width: width
76
115
  }, /*#__PURE__*/_react.default.createElement(_linkInfo.default, {
77
116
  downloadUrl: downloadUrl,
78
117
  icon: icon,
79
118
  providerName: providerName,
80
119
  onViewButtonClick: onViewActionClick,
81
120
  onDownloadButtonClick: onDownloadActionClick,
82
- onResizeButtonClick: handleOnSizeClick,
83
- size: size,
121
+ onResizeButtonClick: handleOnResizeClick,
122
+ size: width,
84
123
  title: title,
85
124
  testId: testId,
86
125
  url: url
@@ -92,6 +131,6 @@ var EmbedModal = function EmbedModal(_ref) {
92
131
  }))));
93
132
  };
94
133
 
95
- var _default = (0, _sizeExperiment.default)((0, _errorBoundary.default)(EmbedModal));
134
+ var _default = (0, _sizeExperiment.default)((0, _analytics.default)((0, _errorBoundary.default)(EmbedModal)));
96
135
 
97
136
  exports.default = _default;
@@ -2,4 +2,12 @@
2
2
 
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
- });
5
+ });
6
+ exports.EmbedModalSize = void 0;
7
+ var EmbedModalSize;
8
+ exports.EmbedModalSize = EmbedModalSize;
9
+
10
+ (function (EmbedModalSize) {
11
+ EmbedModalSize["Large"] = "large";
12
+ EmbedModalSize["Small"] = "small";
13
+ })(EmbedModalSize || (exports.EmbedModalSize = EmbedModalSize = {}));
@@ -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;
@@ -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
 
@@ -118,7 +125,8 @@ var HoverCardComponent = function HoverCardComponent(_ref) {
118
125
  var linkActions = (0, _useSmartLinkActions.useSmartLinkActions)({
119
126
  url: url,
120
127
  appearance: _utils.SMART_CARD_ANALYTICS_DISPLAY,
121
- analyticsHandler: analyticsHandler
128
+ analyticsHandler: analyticsHandler,
129
+ origin: 'smartLinkPreviewHoverCard'
122
130
  });
123
131
  var onActionClick = (0, _react.useCallback)(function (actionId) {
124
132
  if (actionId === 'preview-content') {