@atlaskit/smart-card 22.0.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 (78) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/cjs/extractors/block/index.js +6 -7
  3. package/dist/cjs/extractors/common/actions/extractPreviewAction.js +16 -27
  4. package/dist/cjs/state/analytics/useSmartLinkAnalytics.js +43 -0
  5. package/dist/cjs/state/hooks-external/useSmartLinkActions.js +5 -3
  6. package/dist/cjs/utils/analytics/analytics.js +2 -2
  7. package/dist/cjs/utils/mocks.js +28 -2
  8. package/dist/cjs/version.json +1 -1
  9. package/dist/cjs/view/BlockCard/actions/PreviewAction.js +2 -2
  10. package/dist/cjs/view/BlockCard/index.js +6 -5
  11. package/dist/cjs/view/CardWithUrl/component.js +2 -2
  12. package/dist/cjs/view/EmbedCard/index.js +3 -2
  13. package/dist/cjs/view/EmbedModal/components/analytics/index.js +100 -0
  14. package/dist/cjs/view/EmbedModal/components/analytics/types.js +5 -0
  15. package/dist/cjs/view/EmbedModal/components/size-experiment/index.js +5 -10
  16. package/dist/cjs/view/EmbedModal/index.js +54 -15
  17. package/dist/cjs/view/EmbedModal/types.js +9 -1
  18. package/dist/cjs/view/HoverCard/components/HoverCardComponent.js +2 -1
  19. package/dist/cjs/view/common/Modal.js +29 -4
  20. package/dist/cjs/view/common/ModalHeader.js +3 -2
  21. package/dist/es2019/extractors/block/index.js +6 -7
  22. package/dist/es2019/extractors/common/actions/extractPreviewAction.js +16 -18
  23. package/dist/es2019/state/analytics/useSmartLinkAnalytics.js +46 -3
  24. package/dist/es2019/state/hooks-external/useSmartLinkActions.js +5 -3
  25. package/dist/es2019/utils/analytics/analytics.js +1 -1
  26. package/dist/es2019/utils/mocks.js +26 -1
  27. package/dist/es2019/version.json +1 -1
  28. package/dist/es2019/view/BlockCard/actions/PreviewAction.js +3 -3
  29. package/dist/es2019/view/BlockCard/index.js +5 -4
  30. package/dist/es2019/view/CardWithUrl/component.js +2 -2
  31. package/dist/es2019/view/EmbedCard/index.js +3 -2
  32. package/dist/es2019/view/EmbedModal/components/analytics/index.js +80 -0
  33. package/dist/es2019/view/EmbedModal/components/analytics/types.js +1 -0
  34. package/dist/es2019/view/EmbedModal/components/size-experiment/index.js +5 -9
  35. package/dist/es2019/view/EmbedModal/index.js +46 -13
  36. package/dist/es2019/view/EmbedModal/types.js +6 -1
  37. package/dist/es2019/view/HoverCard/components/HoverCardComponent.js +2 -1
  38. package/dist/es2019/view/common/Modal.js +27 -6
  39. package/dist/es2019/view/common/ModalHeader.js +3 -2
  40. package/dist/esm/extractors/block/index.js +6 -7
  41. package/dist/esm/extractors/common/actions/extractPreviewAction.js +17 -27
  42. package/dist/esm/state/analytics/useSmartLinkAnalytics.js +45 -2
  43. package/dist/esm/state/hooks-external/useSmartLinkActions.js +5 -3
  44. package/dist/esm/utils/analytics/analytics.js +2 -2
  45. package/dist/esm/utils/mocks.js +25 -0
  46. package/dist/esm/version.json +1 -1
  47. package/dist/esm/view/BlockCard/actions/PreviewAction.js +3 -3
  48. package/dist/esm/view/BlockCard/index.js +5 -4
  49. package/dist/esm/view/CardWithUrl/component.js +2 -2
  50. package/dist/esm/view/EmbedCard/index.js +3 -2
  51. package/dist/esm/view/EmbedModal/components/analytics/index.js +82 -0
  52. package/dist/esm/view/EmbedModal/components/analytics/types.js +1 -0
  53. package/dist/esm/view/EmbedModal/components/size-experiment/index.js +5 -10
  54. package/dist/esm/view/EmbedModal/index.js +52 -15
  55. package/dist/esm/view/EmbedModal/types.js +6 -1
  56. package/dist/esm/view/HoverCard/components/HoverCardComponent.js +2 -1
  57. package/dist/esm/view/common/Modal.js +28 -6
  58. package/dist/esm/view/common/ModalHeader.js +3 -2
  59. package/dist/types/extractors/block/types.d.ts +4 -2
  60. package/dist/types/extractors/common/actions/extractPreviewAction.d.ts +7 -5
  61. package/dist/types/state/analytics/useSmartLinkAnalytics.d.ts +23 -1
  62. package/dist/types/state/hooks/useSmartLink.d.ts +9 -0
  63. package/dist/types/state/hooks-external/useSmartLinkActions.d.ts +6 -2
  64. package/dist/types/utils/mocks.d.ts +48 -0
  65. package/dist/types/utils/types.d.ts +3 -1
  66. package/dist/types/view/BlockCard/actions/PreviewAction.d.ts +4 -0
  67. package/dist/types/view/BlockCard/index.d.ts +2 -2
  68. package/dist/types/view/BlockCard/types.d.ts +4 -4
  69. package/dist/types/view/Card/index.d.ts +1 -1
  70. package/dist/types/view/EmbedCard/types.d.ts +2 -2
  71. package/dist/types/view/EmbedModal/components/analytics/index.d.ts +5 -0
  72. package/dist/types/view/EmbedModal/components/analytics/types.d.ts +6 -0
  73. package/dist/types/view/EmbedModal/components/size-experiment/index.d.ts +4 -3
  74. package/dist/types/view/EmbedModal/index.d.ts +3 -1
  75. package/dist/types/view/EmbedModal/types.d.ts +14 -4
  76. package/dist/types/view/common/Modal.d.ts +6 -8
  77. package/package.json +1 -1
  78. package/report.api.md +34 -2
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @atlaskit/smart-card
2
2
 
3
+ ## 22.1.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`c908307ef8e`](https://bitbucket.org/atlassian/atlassian-frontend/commits/c908307ef8e) - Embed Preview: Update embed preview modal analytics
8
+
3
9
  ## 22.0.0
4
10
 
5
11
  ### Major Changes
@@ -55,14 +55,13 @@ var extractBlockDetails = function extractBlockDetails(jsonLd) {
55
55
 
56
56
  var extractBlockActions = function extractBlockActions(props, jsonLd, opts, platform) {
57
57
  if (opts) {
58
- var featureFlags = opts.featureFlags,
59
- handleInvoke = opts.handleInvoke,
60
- handleAnalytics = opts.handleAnalytics,
61
- extensionKey = opts.extensionKey,
62
- source = opts.source,
63
- testId = opts.testId;
58
+ var handleInvoke = opts.handleInvoke;
64
59
  var actions = (0, _extractActions.extractActions)(jsonLd, handleInvoke);
65
- var previewAction = (0, _extractPreviewAction.extractPreviewAction)(extensionKey, props, jsonLd, handleInvoke, handleAnalytics, testId, platform, source, featureFlags); // The previewAction should always be the last action
60
+ var previewAction = (0, _extractPreviewAction.extractPreviewAction)(_objectSpread(_objectSpread({}, opts), {}, {
61
+ viewProps: props,
62
+ jsonLd: jsonLd,
63
+ platform: platform
64
+ })); // The previewAction should always be the last action
66
65
 
67
66
  if (previewAction) {
68
67
  actions.push(previewAction);
@@ -9,8 +9,6 @@ exports.extractPreviewAction = void 0;
9
9
 
10
10
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
11
11
 
12
- var _analytics = require("../../../utils/analytics");
13
-
14
12
  var _detail = require("../detail");
15
13
 
16
14
  var _extractors = require("@atlaskit/linking-common/extractors");
@@ -63,16 +61,19 @@ var getInvokeOpts = function getInvokeOpts(key, action, source) {
63
61
  };
64
62
  };
65
63
 
66
- var extractPreviewAction = function extractPreviewAction() {
67
- var extensionKey = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'empty-object-provider';
68
- var viewProps = arguments.length > 1 ? arguments[1] : undefined;
69
- var jsonLd = arguments.length > 2 ? arguments[2] : undefined;
70
- var handleInvoke = arguments.length > 3 ? arguments[3] : undefined;
71
- var handleAnalytics = arguments.length > 4 ? arguments[4] : undefined;
72
- var testId = arguments.length > 5 ? arguments[5] : undefined;
73
- var platform = arguments.length > 6 ? arguments[6] : undefined;
74
- var source = arguments.length > 7 ? arguments[7] : undefined;
75
- var featureFlags = arguments.length > 8 ? arguments[8] : undefined;
64
+ var extractPreviewAction = function extractPreviewAction(_ref) {
65
+ var _ref$extensionKey = _ref.extensionKey,
66
+ extensionKey = _ref$extensionKey === void 0 ? 'empty-object-provider' : _ref$extensionKey,
67
+ viewProps = _ref.viewProps,
68
+ jsonLd = _ref.jsonLd,
69
+ handleInvoke = _ref.handleInvoke,
70
+ testId = _ref.testId,
71
+ platform = _ref.platform,
72
+ origin = _ref.origin,
73
+ _ref$source = _ref.source,
74
+ source = _ref$source === void 0 ? 'block' : _ref$source,
75
+ featureFlags = _ref.featureFlags,
76
+ analytics = _ref.analytics;
76
77
  // Extract metadata from view props & raw JSON-LD.
77
78
  var metadataFromJsonLd = getMetadataFromJsonLd(jsonLd, platform);
78
79
  var metadataFromViewProps = getMetadataFromResolvedProps(viewProps);
@@ -84,22 +85,10 @@ var extractPreviewAction = function extractPreviewAction() {
84
85
  // Build action using instrumentation hooks.
85
86
  var key = extensionKey;
86
87
  var previewAction = (0, _BlockCard.PreviewAction)(_objectSpread(_objectSpread({}, metadata), {}, {
88
+ analytics: analytics,
89
+ origin: origin,
87
90
  featureFlags: featureFlags,
88
91
  testId: testId,
89
- onOpen: function onOpen() {
90
- handleAnalytics((0, _analytics.uiRenderSuccessEvent)({
91
- display: 'preview',
92
- status: 'resolved',
93
- extensionKey: key
94
- }));
95
- },
96
- onOpenFailed: function onOpenFailed(error, errorInfo) {
97
- handleAnalytics((0, _analytics.uiRenderFailedEvent)({
98
- display: 'preview',
99
- error: error,
100
- errorInfo: errorInfo
101
- }));
102
- },
103
92
  onDownloadActionClick: function onDownloadActionClick() {
104
93
  handleInvoke(getInvokeOpts(key, 'DownloadAction'));
105
94
  },
@@ -109,7 +98,7 @@ var extractPreviewAction = function extractPreviewAction() {
109
98
  })); // Setup props to go through proper Redux 'invocation' flow
110
99
  // for analytics, further state management if required in future.
111
100
 
112
- var previewActionProps = getInvokeOpts(key, 'PreviewAction', source !== null && source !== void 0 ? source : 'block'); // - Promise invoked by the action invocation handler; open preview.
101
+ var previewActionProps = getInvokeOpts(key, 'PreviewAction', source); // - Promise invoked by the action invocation handler; open preview.
113
102
 
114
103
  previewActionProps.action.promise = previewAction.promise; // - Promise invoked on click of `Preview` on block card; trigger above promise.
115
104
 
@@ -135,6 +135,21 @@ var useSmartLinkAnalytics = function useSmartLinkAnalytics(url, dispatchAnalytic
135
135
  }), commonAttributes));
136
136
  },
137
137
 
138
+ /**
139
+ * This fires an event that represents when a user
140
+ * click a button.
141
+ * @param data A partial analytics event payload
142
+ */
143
+ buttonClickedEvent: function buttonClickedEvent(data) {
144
+ return dispatchAnalytics(applyCommonAttributes({
145
+ action: 'clicked',
146
+ actionSubject: 'button',
147
+ actionSubjectId: data.actionSubjectId,
148
+ attributes: _objectSpread(_objectSpread({}, _analytics.context), data.attributes),
149
+ eventType: 'ui'
150
+ }, commonAttributes));
151
+ },
152
+
138
153
  /**
139
154
  * This fires an event that represents when a user clicks on a Smart Link.
140
155
  * @param id The unique ID for this Smart Link.
@@ -266,6 +281,20 @@ var useSmartLinkAnalytics = function useSmartLinkAnalytics(url, dispatchAnalytic
266
281
  }), commonAttributes));
267
282
  },
268
283
 
284
+ /**
285
+ * This fires an event that represents when a user close a modal.
286
+ * @param data A partial analytics event payload
287
+ */
288
+ modalClosedEvent: function modalClosedEvent(data) {
289
+ return dispatchAnalytics(applyCommonAttributes({
290
+ action: 'closed',
291
+ actionSubject: 'modal',
292
+ actionSubjectId: data.actionSubjectId,
293
+ attributes: _objectSpread(_objectSpread({}, _analytics.context), data.attributes),
294
+ eventType: 'ui'
295
+ }, commonAttributes));
296
+ },
297
+
269
298
  /**
270
299
  * This fires an event that represents when a Smart Link was rendered successfully.
271
300
  * Note: this fires even if the Smart Link request errored out.
@@ -630,6 +659,20 @@ var useSmartLinkAnalytics = function useSmartLinkAnalytics(url, dispatchAnalytic
630
659
  destinationSubproduct: destinationSubproduct,
631
660
  location: location
632
661
  })), commonAttributes));
662
+ },
663
+
664
+ /**
665
+ * This fires an event that represents when a user view a modal.
666
+ * @param data A partial analytics event payload
667
+ */
668
+ modalViewedEvent: function modalViewedEvent(data) {
669
+ return dispatchAnalytics(applyCommonAttributes({
670
+ action: 'viewed',
671
+ actionSubject: data.name,
672
+ attributes: _objectSpread(_objectSpread({}, _analytics.context), data.attributes),
673
+ eventType: 'screen',
674
+ name: data.name
675
+ }, commonAttributes));
633
676
  }
634
677
  };
635
678
  }, [commonAttributes, dispatchAnalytics]);
@@ -30,7 +30,8 @@ function useSmartLinkActions(_ref) {
30
30
  appearance = _ref.appearance,
31
31
  analyticsHandler = _ref.analyticsHandler,
32
32
  _ref$platform = _ref.platform,
33
- platform = _ref$platform === void 0 ? 'web' : _ref$platform;
33
+ platform = _ref$platform === void 0 ? 'web' : _ref$platform,
34
+ origin = _ref.origin;
34
35
  var id = (0, _react.useMemo)(function () {
35
36
  return (0, _uuid.default)();
36
37
  }, []);
@@ -60,7 +61,8 @@ function useSmartLinkActions(_ref) {
60
61
  handleInvoke: function handleInvoke(opts) {
61
62
  return linkActions.invoke(opts, appearance);
62
63
  },
63
- handleAnalytics: analyticsHandler,
64
+ analytics: linkAnalytics,
65
+ origin: origin,
64
66
  extensionKey: (0, _helpers.getExtensionKey)(linkState.details),
65
67
  source: appearance
66
68
  }, undefined, platform);
@@ -77,6 +79,6 @@ function useSmartLinkActions(_ref) {
77
79
  };
78
80
  });
79
81
  setActions(cardActions);
80
- }, [linkState, linkActions, analyticsHandler, appearance, platform, embedModalSize]);
82
+ }, [linkState, linkActions, linkAnalytics, appearance, platform, embedModalSize, origin]);
81
83
  return actions;
82
84
  }
@@ -451,7 +451,7 @@ var uiRenderFailedEvent = function uiRenderFailedEvent(_ref14) {
451
451
  actionSubject: 'smartLink',
452
452
  action: 'renderFailed',
453
453
  eventType: 'ui',
454
- attributes: {
454
+ attributes: _objectSpread(_objectSpread({}, context), {}, {
455
455
  error: error,
456
456
  errorInfo: errorInfo,
457
457
  display: display,
@@ -460,7 +460,7 @@ var uiRenderFailedEvent = function uiRenderFailedEvent(_ref14) {
460
460
  destinationProduct: destinationProduct,
461
461
  destinationSubproduct: destinationSubproduct,
462
462
  location: location
463
- }
463
+ })
464
464
  };
465
465
  };
466
466
 
@@ -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.waitFor = exports.mocks = exports.mockContext = exports.fakeResponse = exports.fakeFactory = void 0;
8
+ exports.waitFor = exports.mocks = exports.mockContext = exports.mockAnalytics = exports.fakeResponse = exports.fakeFactory = void 0;
9
9
 
10
10
  var _regenerator = _interopRequireDefault(require("@babel/runtime/regenerator"));
11
11
 
@@ -138,6 +138,18 @@ var mocks = {
138
138
  data: {
139
139
  status: 'CompletedStatus'
140
140
  }
141
+ },
142
+ analytics: {
143
+ status: 'resolved',
144
+ details: {
145
+ meta: {
146
+ definitionId: 'spaghetti-id',
147
+ key: 'spaghetti-key',
148
+ resourceType: 'spaghetti-resource',
149
+ subproduct: 'spaghetti-subproduct',
150
+ product: 'spaghetti-product'
151
+ }
152
+ }
141
153
  }
142
154
  };
143
155
  exports.mocks = mocks;
@@ -257,4 +269,18 @@ var waitFor = function waitFor() {
257
269
  });
258
270
  };
259
271
 
260
- exports.waitFor = waitFor;
272
+ exports.waitFor = waitFor;
273
+ var mockAnalytics = {
274
+ ui: {
275
+ buttonClickedEvent: function buttonClickedEvent() {},
276
+ modalClosedEvent: function modalClosedEvent() {},
277
+ renderSuccessEvent: function renderSuccessEvent() {},
278
+ renderFailedEvent: function renderFailedEvent() {}
279
+ },
280
+ operational: {},
281
+ track: {},
282
+ screen: {
283
+ modalViewedEvent: function modalViewedEvent() {}
284
+ }
285
+ };
286
+ exports.mockAnalytics = mockAnalytics;
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/smart-card",
3
- "version": "22.0.0",
3
+ "version": "22.1.0",
4
4
  "sideEffects": false
5
5
  }
@@ -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
  };
@@ -209,7 +209,7 @@ function CardWithUrlContent(_ref) {
209
209
  handleErrorRetry: handleRetry,
210
210
  handleInvoke: handleInvoke,
211
211
  handleFrameClick: handleClickWrapper,
212
- handleAnalytics: dispatchAnalytics,
212
+ analytics: analytics,
213
213
  isSelected: isSelected,
214
214
  onResolve: onResolve,
215
215
  onError: onError,
@@ -227,7 +227,7 @@ function CardWithUrlContent(_ref) {
227
227
  handleErrorRetry: handleRetry,
228
228
  handleFrameClick: handleClickWrapper,
229
229
  handleInvoke: handleInvoke,
230
- handleAnalytics: dispatchAnalytics,
230
+ analytics: analytics,
231
231
  isSelected: isSelected,
232
232
  isFrameVisible: isFrameVisible,
233
233
  platform: platform,
@@ -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 = {}));
@@ -125,7 +125,8 @@ var HoverCardComponent = function HoverCardComponent(_ref) {
125
125
  var linkActions = (0, _useSmartLinkActions.useSmartLinkActions)({
126
126
  url: url,
127
127
  appearance: _utils.SMART_CARD_ANALYTICS_DISPLAY,
128
- analyticsHandler: analyticsHandler
128
+ analyticsHandler: analyticsHandler,
129
+ origin: 'smartLinkPreviewHoverCard'
129
130
  });
130
131
  var onActionClick = (0, _react.useCallback)(function (actionId) {
131
132
  if (actionId === 'preview-content') {