@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
@@ -14,10 +14,12 @@ manually passed to your custom components.
14
14
 
15
15
  For a complete guide on customization using the new compositional API, refer to the docs at
16
16
  https://atlassian.design/components/modal-dialog/examples#customizing-modal-dialog. */
17
- import React, { useState } from 'react';
18
- import ModalDialog, { ModalTransition, ModalBody } from '@atlaskit/modal-dialog';
17
+ import React, { useCallback, useRef, useState } from 'react';
18
+ import ModalDialog, { ModalBody, ModalTransition } from '@atlaskit/modal-dialog';
19
19
  import { Header } from './ModalHeader';
20
20
  import { getIframeSandboxAttribute } from '../../utils';
21
+ import withAnalytics from '../EmbedModal/components/analytics';
22
+ import { EmbedModalSize } from '../EmbedModal/types';
21
23
  const iframeStyles = {
22
24
  width: `100%`,
23
25
  height: 'calc(100vh - 248px)'
@@ -45,7 +47,7 @@ const Modal = ({
45
47
  providerName,
46
48
  metadata,
47
49
  icon,
48
- closeLabel,
50
+ closeLabel = 'Close Preview',
49
51
  iframeName,
50
52
  title,
51
53
  url,
@@ -56,16 +58,35 @@ const Modal = ({
56
58
  onDownloadActionClick
57
59
  }) => {
58
60
  let [isOpen, setIsOpen] = useState(showModal);
61
+ const openAt = useRef();
62
+ const handleOnOpenComplete = useCallback(() => {
63
+ openAt.current = Date.now();
64
+
65
+ if (onOpen) {
66
+ onOpen({
67
+ size: EmbedModalSize.Small
68
+ });
69
+ }
70
+ }, [onOpen]);
71
+ const handleOnCloseComplete = useCallback(() => {
72
+ if (onClose) {
73
+ const duration = openAt.current ? Date.now() - openAt.current : undefined;
74
+ onClose({
75
+ duration,
76
+ size: EmbedModalSize.Small
77
+ });
78
+ }
79
+ }, [onClose]);
59
80
  const sandbox = getIframeSandboxAttribute(isTrusted);
60
81
  return /*#__PURE__*/React.createElement(ModalTransition, null, isOpen && /*#__PURE__*/React.createElement(ModalDialog, {
61
82
  height: "100%",
62
83
  width: "large",
63
84
  testId: testId,
64
- onOpenComplete: onOpen,
85
+ onOpenComplete: handleOnOpenComplete,
65
86
  onClose: () => {
66
87
  setIsOpen(false);
67
88
  },
68
- onCloseComplete: onClose
89
+ onCloseComplete: handleOnCloseComplete
69
90
  }, /*#__PURE__*/React.createElement(Header, {
70
91
  providerName: providerName,
71
92
  icon: icon,
@@ -91,4 +112,4 @@ const Modal = ({
91
112
  }))));
92
113
  };
93
114
 
94
- export default ModalWithErrorBoundary;
115
+ export default withAnalytics(ModalWithErrorBoundary);
@@ -74,7 +74,7 @@ export const Header = ({
74
74
  testId: "preview-view-action",
75
75
  iconAfter: jsx(ShortcutIcon, {
76
76
  size: "small",
77
- label: "go to source"
77
+ label: ""
78
78
  }),
79
79
  onClick: onViewActionClick
80
80
  }, providerName ? jsx(F, null, jsx(FormattedMessage, messages.viewIn), " ", providerName) : jsx(FormattedMessage, messages.viewOriginal)), jsx(Button, {
@@ -82,6 +82,7 @@ export const Header = ({
82
82
  iconBefore: jsx(EditorCloseIcon, {
83
83
  label: label
84
84
  }),
85
- onClick: onClose
85
+ onClick: onClose,
86
+ testId: "preview-close-button"
86
87
  }))));
87
88
  };
@@ -37,14 +37,13 @@ var extractBlockDetails = function extractBlockDetails(jsonLd) {
37
37
 
38
38
  export var extractBlockActions = function extractBlockActions(props, jsonLd, opts, platform) {
39
39
  if (opts) {
40
- var featureFlags = opts.featureFlags,
41
- handleInvoke = opts.handleInvoke,
42
- handleAnalytics = opts.handleAnalytics,
43
- extensionKey = opts.extensionKey,
44
- source = opts.source,
45
- testId = opts.testId;
40
+ var handleInvoke = opts.handleInvoke;
46
41
  var actions = extractActions(jsonLd, handleInvoke);
47
- var previewAction = extractPreviewAction(extensionKey, props, jsonLd, handleInvoke, handleAnalytics, testId, platform, source, featureFlags); // The previewAction should always be the last action
42
+ var previewAction = extractPreviewAction(_objectSpread(_objectSpread({}, opts), {}, {
43
+ viewProps: props,
44
+ jsonLd: jsonLd,
45
+ platform: platform
46
+ })); // The previewAction should always be the last action
48
47
 
49
48
  if (previewAction) {
50
49
  actions.push(previewAction);
@@ -4,9 +4,8 @@ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (O
4
4
 
5
5
  function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
6
6
 
7
- import { uiRenderSuccessEvent, uiRenderFailedEvent } from '../../../utils/analytics';
8
7
  import { extractDownloadUrl } from '../detail';
9
- import { extractProvider, extractPreview } from '@atlaskit/linking-common/extractors';
8
+ import { extractPreview, extractProvider } from '@atlaskit/linking-common/extractors';
10
9
  import { PreviewAction } from '../../../view/BlockCard';
11
10
 
12
11
  var getMetadataFromJsonLd = function getMetadataFromJsonLd(jsonLd, platform) {
@@ -51,16 +50,19 @@ var getInvokeOpts = function getInvokeOpts(key, action, source) {
51
50
  };
52
51
  };
53
52
 
54
- export var extractPreviewAction = function extractPreviewAction() {
55
- var extensionKey = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'empty-object-provider';
56
- var viewProps = arguments.length > 1 ? arguments[1] : undefined;
57
- var jsonLd = arguments.length > 2 ? arguments[2] : undefined;
58
- var handleInvoke = arguments.length > 3 ? arguments[3] : undefined;
59
- var handleAnalytics = arguments.length > 4 ? arguments[4] : undefined;
60
- var testId = arguments.length > 5 ? arguments[5] : undefined;
61
- var platform = arguments.length > 6 ? arguments[6] : undefined;
62
- var source = arguments.length > 7 ? arguments[7] : undefined;
63
- var featureFlags = arguments.length > 8 ? arguments[8] : undefined;
53
+ export var extractPreviewAction = function extractPreviewAction(_ref) {
54
+ var _ref$extensionKey = _ref.extensionKey,
55
+ extensionKey = _ref$extensionKey === void 0 ? 'empty-object-provider' : _ref$extensionKey,
56
+ viewProps = _ref.viewProps,
57
+ jsonLd = _ref.jsonLd,
58
+ handleInvoke = _ref.handleInvoke,
59
+ testId = _ref.testId,
60
+ platform = _ref.platform,
61
+ origin = _ref.origin,
62
+ _ref$source = _ref.source,
63
+ source = _ref$source === void 0 ? 'block' : _ref$source,
64
+ featureFlags = _ref.featureFlags,
65
+ analytics = _ref.analytics;
64
66
  // Extract metadata from view props & raw JSON-LD.
65
67
  var metadataFromJsonLd = getMetadataFromJsonLd(jsonLd, platform);
66
68
  var metadataFromViewProps = getMetadataFromResolvedProps(viewProps);
@@ -72,14 +74,10 @@ export var extractPreviewAction = function extractPreviewAction() {
72
74
  // Build action using instrumentation hooks.
73
75
  var key = extensionKey;
74
76
  var previewAction = PreviewAction(_objectSpread(_objectSpread({}, metadata), {}, {
77
+ analytics: analytics,
78
+ origin: origin,
75
79
  featureFlags: featureFlags,
76
80
  testId: testId,
77
- onOpen: function onOpen() {
78
- handleAnalytics(uiRenderSuccessEvent('preview', 'resolved', key));
79
- },
80
- onOpenFailed: function onOpenFailed(error, errorInfo) {
81
- handleAnalytics(uiRenderFailedEvent('preview', error, errorInfo));
82
- },
83
81
  onDownloadActionClick: function onDownloadActionClick() {
84
82
  handleInvoke(getInvokeOpts(key, 'DownloadAction'));
85
83
  },
@@ -89,7 +87,7 @@ export var extractPreviewAction = function extractPreviewAction() {
89
87
  })); // Setup props to go through proper Redux 'invocation' flow
90
88
  // for analytics, further state management if required in future.
91
89
 
92
- var previewActionProps = getInvokeOpts(key, 'PreviewAction', source !== null && source !== void 0 ? source : 'block'); // - Promise invoked by the action invocation handler; open preview.
90
+ var previewActionProps = getInvokeOpts(key, 'PreviewAction', source); // - Promise invoked by the action invocation handler; open preview.
93
91
 
94
92
  previewActionProps.action.promise = previewAction.promise; // - Promise invoked on click of `Preview` on block card; trigger above promise.
95
93
 
@@ -184,24 +184,51 @@ export var useSmartCardActions = function useSmartCardActions(id, url, analytics
184
184
  var services = getServices(details); // When authentication is triggered, let GAS know!
185
185
 
186
186
  if (status === 'unauthorized') {
187
- analytics.ui.authEvent(appearance, definitionId, extensionKey);
187
+ analytics.ui.authEvent({
188
+ display: appearance,
189
+ definitionId: definitionId,
190
+ extensionKey: extensionKey
191
+ });
188
192
  }
189
193
 
190
194
  if (status === 'forbidden') {
191
- analytics.ui.authAlternateAccountEvent(appearance, definitionId, extensionKey);
195
+ analytics.ui.authAlternateAccountEvent({
196
+ display: appearance,
197
+ definitionId: definitionId,
198
+ extensionKey: extensionKey
199
+ });
192
200
  }
193
201
 
194
202
  if (services.length > 0) {
195
- analytics.screen.authPopupEvent(definitionId, extensionKey);
203
+ analytics.screen.authPopupEvent({
204
+ definitionId: definitionId,
205
+ extensionKey: extensionKey
206
+ });
196
207
  auth(services[0].url).then(function () {
197
- analytics.track.appAccountConnected(definitionId, extensionKey);
198
- analytics.operational.connectSucceededEvent(id, definitionId, extensionKey);
208
+ analytics.track.appAccountConnected({
209
+ definitionId: definitionId,
210
+ extensionKey: extensionKey
211
+ });
212
+ analytics.operational.connectSucceededEvent({
213
+ id: id,
214
+ definitionId: definitionId,
215
+ extensionKey: extensionKey
216
+ });
199
217
  reload();
200
218
  }, function (err) {
201
- analytics.operational.connectFailedEvent(id, definitionId, extensionKey, err.type);
219
+ analytics.operational.connectFailedEvent({
220
+ id: id,
221
+ definitionId: definitionId,
222
+ extensionKey: extensionKey,
223
+ reason: err.type
224
+ });
202
225
 
203
226
  if (err.type === 'auth_window_closed') {
204
- analytics.ui.closedAuthEvent(appearance, definitionId, extensionKey);
227
+ analytics.ui.closedAuthEvent({
228
+ display: appearance,
229
+ definitionId: definitionId,
230
+ extensionKey: extensionKey
231
+ });
205
232
  }
206
233
 
207
234
  reload();
@@ -222,7 +249,13 @@ export var useSmartCardActions = function useSmartCardActions(id, url, analytics
222
249
  measure.mark(markName, 'pending');
223
250
  _context2.prev = 4;
224
251
  // Begin analytics instrumentation.
225
- analytics.ui.actionClickedEvent(id, key, action.type, source, opts.type); // Invoke action - either client-side or server-side.
252
+ analytics.ui.actionClickedEvent({
253
+ id: id,
254
+ extensionKey: key,
255
+ actionType: action.type,
256
+ display: source,
257
+ invokeType: opts.type
258
+ }); // Invoke action - either client-side or server-side.
226
259
 
227
260
  if (!(opts.type === 'client')) {
228
261
  _context2.next = 12;
@@ -246,14 +279,25 @@ export var useSmartCardActions = function useSmartCardActions(id, url, analytics
246
279
 
247
280
  case 15:
248
281
  measure.mark(markName, 'resolved');
249
- analytics.operational.invokeSucceededEvent(id, key, action.type, source);
282
+ analytics.operational.invokeSucceededEvent({
283
+ id: id,
284
+ extensionKey: key,
285
+ actionType: action.type,
286
+ display: source
287
+ });
250
288
  return _context2.abrupt("return", response);
251
289
 
252
290
  case 20:
253
291
  _context2.prev = 20;
254
292
  _context2.t0 = _context2["catch"](4);
255
293
  measure.mark(markName, 'errored');
256
- analytics.operational.invokeFailedEvent(id, key, action.type, source, _context2.t0.message);
294
+ analytics.operational.invokeFailedEvent({
295
+ id: id,
296
+ extensionKey: key,
297
+ actionType: action.type,
298
+ display: source,
299
+ reason: _context2.t0.message
300
+ });
257
301
  throw _context2.t0;
258
302
 
259
303
  case 25:
@@ -0,0 +1 @@
1
+ export {};