@atlaskit/smart-card 16.0.0 → 16.2.1

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 (54) hide show
  1. package/CHANGELOG.md +36 -0
  2. package/dist/cjs/client/utils/environments.js +1 -1
  3. package/dist/cjs/extractors/block/index.js +4 -4
  4. package/dist/cjs/extractors/common/actions/extractPreviewAction.js +4 -3
  5. package/dist/cjs/providers/editor/transformer.js +1 -1
  6. package/dist/cjs/state/actions/index.js +13 -6
  7. package/dist/cjs/state/analytics/index.js +32 -84
  8. package/dist/cjs/state/analytics/ufoExperiences.js +60 -0
  9. package/dist/cjs/state/analytics/useSmartLinkAnalytics.js +106 -0
  10. package/dist/cjs/state/hooks/useSmartLink.js +6 -6
  11. package/dist/cjs/version.json +1 -1
  12. package/dist/cjs/view/BlockCard/index.js +3 -2
  13. package/dist/cjs/view/CardWithUrl/component-lazy/index.js +1 -1
  14. package/dist/cjs/view/CardWithUrl/component.js +10 -4
  15. package/dist/cjs/view/CardWithUrl/loader.js +106 -134
  16. package/dist/es2019/client/utils/environments.js +1 -1
  17. package/dist/es2019/extractors/block/index.js +4 -4
  18. package/dist/es2019/extractors/common/actions/extractPreviewAction.js +4 -4
  19. package/dist/es2019/providers/editor/transformer.js +1 -1
  20. package/dist/es2019/state/actions/index.js +9 -4
  21. package/dist/es2019/state/analytics/index.js +2 -40
  22. package/dist/es2019/state/analytics/ufoExperiences.js +40 -0
  23. package/dist/es2019/state/analytics/useSmartLinkAnalytics.js +62 -0
  24. package/dist/es2019/state/hooks/useSmartLink.js +4 -5
  25. package/dist/es2019/version.json +1 -1
  26. package/dist/es2019/view/BlockCard/index.js +3 -2
  27. package/dist/es2019/view/CardWithUrl/component-lazy/index.js +1 -1
  28. package/dist/es2019/view/CardWithUrl/component.js +10 -4
  29. package/dist/es2019/view/CardWithUrl/loader.js +83 -92
  30. package/dist/esm/client/utils/environments.js +1 -1
  31. package/dist/esm/extractors/block/index.js +4 -4
  32. package/dist/esm/extractors/common/actions/extractPreviewAction.js +4 -3
  33. package/dist/esm/providers/editor/transformer.js +1 -1
  34. package/dist/esm/state/actions/index.js +12 -6
  35. package/dist/esm/state/analytics/index.js +2 -80
  36. package/dist/esm/state/analytics/ufoExperiences.js +40 -0
  37. package/dist/esm/state/analytics/useSmartLinkAnalytics.js +94 -0
  38. package/dist/esm/state/hooks/useSmartLink.js +6 -6
  39. package/dist/esm/version.json +1 -1
  40. package/dist/esm/view/BlockCard/index.js +3 -2
  41. package/dist/esm/view/CardWithUrl/component-lazy/index.js +1 -1
  42. package/dist/esm/view/CardWithUrl/component.js +10 -4
  43. package/dist/esm/view/CardWithUrl/loader.js +101 -130
  44. package/dist/types/extractors/block/index.d.ts +2 -2
  45. package/dist/types/extractors/common/__mocks__/jsonld.d.ts +61 -0
  46. package/dist/types/extractors/common/actions/extractPreviewAction.d.ts +1 -1
  47. package/dist/types/state/analytics/index.d.ts +3 -32
  48. package/dist/types/state/analytics/ufoExperiences.d.ts +7 -0
  49. package/dist/types/state/analytics/useSmartLinkAnalytics.d.ts +30 -0
  50. package/dist/types/state/hooks/useSmartLink.d.ts +4 -5
  51. package/dist/types/view/BlockCard/types.d.ts +2 -1
  52. package/dist/types/view/CardWithUrl/component-lazy/index.d.ts +1 -1
  53. package/dist/types/view/CardWithUrl/loader.d.ts +1 -15
  54. package/package.json +13 -11
@@ -1,60 +1,59 @@
1
- import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
- import React from 'react';
1
+ import React, { lazy, useEffect, useState, Suspense, useCallback } from 'react';
3
2
  import uuid from 'uuid';
4
3
  import { CardLinkView } from '@atlaskit/media-ui';
5
4
  import { uiRenderFailedEvent, fireSmartLinkEvent } from '../../utils/analytics';
6
5
  import { clearMarks, clearMeasures } from '../../utils/performance';
7
- export class CardWithURLRenderer extends React.PureComponent {
8
- constructor(props) {
9
- super(props);
6
+ import { ErrorBoundary } from 'react-error-boundary';
7
+ import { failUfoExperience, startUfoExperience } from '../../state/analytics/ufoExperiences';
8
+ const LazyCardWithUrlContent = /*#__PURE__*/lazy(() => import(
9
+ /* webpackChunkName: "@atlaskit-internal_smartcard-urlcardcontent" */
10
+ './component-lazy/index'));
11
+ export function CardWithURLRenderer(props) {
12
+ const [id] = useState(() => uuid()); // Equivalent to ComponentWillMount
10
13
 
11
- _defineProperty(this, "dispatchAnalytics", analyticsPayload => {
12
- const {
13
- appearance,
14
- createAnalyticsEvent
15
- } = this.props;
16
-
17
- if (analyticsPayload && analyticsPayload.attributes) {
18
- // Update if we haven't already set the display - possible
19
- // in the case of `preview` which is rendered differently.
20
- if (!analyticsPayload.attributes.display) {
21
- analyticsPayload.attributes.display = appearance;
22
- }
23
- }
24
-
25
- fireSmartLinkEvent(analyticsPayload, createAnalyticsEvent);
26
- });
27
-
28
- this.state = {
29
- id: uuid()
14
+ useState(() => {
15
+ // We want to start timing of render event only once and right at the start
16
+ startUfoExperience('smart-link-rendered', id);
17
+ });
18
+ useEffect(() => {
19
+ // ComponentWillUnmount
20
+ return () => {
21
+ clearMarks(id);
22
+ clearMeasures(id);
30
23
  };
31
- }
24
+ }, [id]);
25
+ const {
26
+ url,
27
+ appearance,
28
+ isSelected,
29
+ isFrameVisible,
30
+ onClick,
31
+ container,
32
+ onResolve,
33
+ testId,
34
+ showActions,
35
+ inheritDimensions,
36
+ platform,
37
+ embedIframeRef,
38
+ inlinePreloaderStyle,
39
+ createAnalyticsEvent
40
+ } = props; // Wrapper around analytics.
32
41
 
33
- static moduleImporter(target) {
34
- import(
35
- /* webpackChunkName: "@atlaskit-internal_smartcard-urlcardcontent" */
36
- './component-lazy/index').then(module => {
37
- CardWithURLRenderer.CardContent = module.LazyCardWithUrlContent;
38
- target.forceUpdate();
39
- });
40
- }
41
-
42
- componentDidMount() {
43
- if (CardWithURLRenderer.CardContent === null) {
44
- (this.props.importer || CardWithURLRenderer.moduleImporter)(this);
42
+ const dispatchAnalytics = useCallback(analyticsPayload => {
43
+ if (analyticsPayload && analyticsPayload.attributes) {
44
+ // Update if we haven't already set the display - possible
45
+ // in the case of `preview` which is rendered differently.
46
+ if (!analyticsPayload.attributes.display) {
47
+ analyticsPayload.attributes.display = appearance;
48
+ }
45
49
  }
46
- }
47
-
48
- componentWillUnmount() {
49
- const id = this.state.id;
50
- clearMarks(id);
51
- clearMeasures(id);
52
- }
53
50
 
54
- componentDidCatch(error, errorInfo) {
51
+ fireSmartLinkEvent(analyticsPayload, createAnalyticsEvent);
52
+ }, [appearance, createAnalyticsEvent]);
53
+ const logError = useCallback((error, info) => {
55
54
  const {
56
- appearance
57
- } = this.props; // NB: APIErrors are thrown in response to Object Resolver Service.
55
+ componentStack
56
+ } = info; // NB: APIErrors are thrown in response to Object Resolver Service.
58
57
  // In these cases, control is handed back to the Editor. We do not
59
58
  // fire an event for these, as they do not cover failed UI render events.
60
59
 
@@ -64,54 +63,46 @@ export class CardWithURLRenderer extends React.PureComponent {
64
63
  // to the reliability of the smart-card front-end components. We instrument
65
64
  // these in order to measure our front-end reliability.
66
65
  else {
67
- this.dispatchAnalytics(uiRenderFailedEvent(appearance, error, errorInfo));
68
- }
69
- } // Wrapper around analytics.
70
-
71
-
72
- render() {
73
- const {
74
- url,
75
- appearance,
76
- isSelected,
77
- isFrameVisible,
78
- onClick,
79
- container,
80
- onResolve,
81
- testId,
82
- showActions,
83
- inheritDimensions,
84
- platform,
85
- embedIframeRef,
86
- inlinePreloaderStyle
87
- } = this.props;
88
-
89
- if (!url) {
90
- throw new Error('@atlaskit/smart-card: url property is missing.');
66
+ const errorInfo = {
67
+ componentStack
68
+ };
69
+ failUfoExperience('smart-link-rendered', id);
70
+ failUfoExperience('smart-link-authenticated', id);
71
+ dispatchAnalytics(uiRenderFailedEvent(appearance, error, errorInfo));
91
72
  }
73
+ }, [appearance, dispatchAnalytics, id]);
92
74
 
93
- return CardWithURLRenderer.CardContent !== null ? /*#__PURE__*/React.createElement(CardWithURLRenderer.CardContent, {
94
- id: this.state.id,
95
- url: url,
96
- appearance: appearance,
97
- onClick: onClick,
98
- isSelected: isSelected,
99
- isFrameVisible: isFrameVisible,
100
- dispatchAnalytics: this.dispatchAnalytics,
101
- container: container,
102
- onResolve: onResolve,
103
- testId: testId,
104
- showActions: showActions,
105
- inheritDimensions: inheritDimensions,
106
- platform: platform,
107
- embedIframeRef: embedIframeRef,
108
- inlinePreloaderStyle: inlinePreloaderStyle
109
- }) : /*#__PURE__*/React.createElement(CardLinkView, {
110
- key: 'chunk-placeholder',
111
- link: url
112
- });
75
+ if (!url) {
76
+ throw new Error('@atlaskit/smart-card: url property is missing.');
113
77
  }
114
78
 
79
+ return /*#__PURE__*/React.createElement(ErrorBoundary, {
80
+ FallbackComponent: ErrorFallback,
81
+ onError: logError
82
+ }, /*#__PURE__*/React.createElement(Suspense, {
83
+ fallback: /*#__PURE__*/React.createElement(CardLinkView, {
84
+ key: 'chunk-placeholder',
85
+ link: url
86
+ })
87
+ }, /*#__PURE__*/React.createElement(LazyCardWithUrlContent, {
88
+ id: id,
89
+ url: url,
90
+ appearance: appearance,
91
+ onClick: onClick,
92
+ isSelected: isSelected,
93
+ isFrameVisible: isFrameVisible,
94
+ dispatchAnalytics: dispatchAnalytics,
95
+ container: container,
96
+ onResolve: onResolve,
97
+ testId: testId,
98
+ showActions: showActions,
99
+ inheritDimensions: inheritDimensions,
100
+ platform: platform,
101
+ embedIframeRef: embedIframeRef,
102
+ inlinePreloaderStyle: inlinePreloaderStyle
103
+ })));
115
104
  }
116
105
 
117
- _defineProperty(CardWithURLRenderer, "CardContent", null);
106
+ const ErrorFallback = () => {
107
+ return /*#__PURE__*/React.createElement("span", null);
108
+ };
@@ -1,5 +1,5 @@
1
1
  var devBaseUrl = 'https://api-private.dev.atlassian.com';
2
- var stgBaseUrl = 'https://api-private.stg.atlassian.com';
2
+ var stgBaseUrl = 'https://commerce-components-preview.dev.atlassian.com/gateway/api';
3
3
  var prodBaseUrl = 'https://api-private.atlassian.com';
4
4
  export var BaseUrls = {
5
5
  dev: devBaseUrl,
@@ -40,14 +40,14 @@ var extractBlockDetails = function extractBlockDetails(jsonLd) {
40
40
  });
41
41
  };
42
42
 
43
- export var extractBlockActions = function extractBlockActions(props, jsonLd, opts) {
43
+ export var extractBlockActions = function extractBlockActions(props, jsonLd, opts, platform) {
44
44
  if (opts) {
45
45
  var handleInvoke = opts.handleInvoke,
46
46
  handleAnalytics = opts.handleAnalytics,
47
47
  definitionId = opts.definitionId,
48
48
  testId = opts.testId;
49
49
  var actions = extractActions(jsonLd, handleInvoke);
50
- var previewAction = extractPreviewAction(definitionId, props, jsonLd, handleInvoke, handleAnalytics, testId); // The previewAction should always be the last action
50
+ var previewAction = extractPreviewAction(definitionId, props, jsonLd, handleInvoke, handleAnalytics, testId, platform); // The previewAction should always be the last action
51
51
 
52
52
  if (previewAction) {
53
53
  actions.push(previewAction);
@@ -79,7 +79,7 @@ export var extractBlockUsers = function extractBlockUsers(jsonLd) {
79
79
  return updatedByMembers || createdByMembers;
80
80
  }
81
81
  };
82
- export var extractBlockProps = function extractBlockProps(jsonLd, meta, opts, renderers) {
82
+ export var extractBlockProps = function extractBlockProps(jsonLd, meta, opts, renderers, platform) {
83
83
  var props = {
84
84
  link: extractLink(jsonLd),
85
85
  title: extractTitle(jsonLd),
@@ -95,6 +95,6 @@ export var extractBlockProps = function extractBlockProps(jsonLd, meta, opts, re
95
95
  isTrusted: extractIsTrusted(meta)
96
96
  };
97
97
  return _objectSpread(_objectSpread({}, props), {}, {
98
- actions: extractBlockActions(props, jsonLd, opts)
98
+ actions: extractBlockActions(props, jsonLd, opts, platform)
99
99
  });
100
100
  };
@@ -10,10 +10,10 @@ import { extractDownloadUrl } from '../detail';
10
10
  import { extractProvider } from '../context';
11
11
  import { extractPreview } from '../preview';
12
12
 
13
- var getMetadataFromJsonLd = function getMetadataFromJsonLd(jsonLd) {
13
+ var getMetadataFromJsonLd = function getMetadataFromJsonLd(jsonLd, platform) {
14
14
  var download = extractDownloadUrl(jsonLd);
15
15
  var provider = extractProvider(jsonLd);
16
- var preview = extractPreview(jsonLd);
16
+ var preview = extractPreview(jsonLd, platform);
17
17
  return {
18
18
  download: download,
19
19
  providerName: provider && provider.text,
@@ -59,8 +59,9 @@ export var extractPreviewAction = function extractPreviewAction() {
59
59
  var handleInvoke = arguments.length > 3 ? arguments[3] : undefined;
60
60
  var handleAnalytics = arguments.length > 4 ? arguments[4] : undefined;
61
61
  var testId = arguments.length > 5 ? arguments[5] : undefined;
62
+ var platform = arguments.length > 6 ? arguments[6] : undefined;
62
63
  // Extract metadata from view props & raw JSON-LD.
63
- var metadataFromJsonLd = getMetadataFromJsonLd(jsonLd);
64
+ var metadataFromJsonLd = getMetadataFromJsonLd(jsonLd, platform);
64
65
  var metadataFromViewProps = getMetadataFromResolvedProps(viewProps);
65
66
 
66
67
  var metadata = _objectSpread(_objectSpread({}, metadataFromJsonLd), metadataFromViewProps); // Extract preview action only if we have an iframe src.
@@ -6,7 +6,7 @@ var isJiraRoadMap = function isJiraRoadMap(url) {
6
6
  };
7
7
 
8
8
  var isPolarisView = function isPolarisView(url) {
9
- return url.match(/^https:\/\/.*?\/jira\/polaris\/projects\/[^\/]+?\/ideas\/view\/\d+$/);
9
+ return url.match(/^https:\/\/.*?\/jira\/polaris\/projects\/[^\/]+?\/ideas\/view\/\d+$|^https:\/\/.*?\/secure\/JiraProductDiscoveryAnonymous\.jspa\?hash=\w+|^https:\/\/.*?\/jira\/polaris\/share\/\w+/);
10
10
  };
11
11
 
12
12
  var isSlackMessage = function isSlackMessage(url) {
@@ -9,6 +9,7 @@ import { useSmartLinkContext } from '../context';
9
9
  import * as measure from '../../utils/performance';
10
10
  import { APIError } from '../../client/errors';
11
11
  import { getUnauthorizedJsonLd } from '../../utils/jsonld';
12
+ import { addMetadataToExperience } from '../analytics';
12
13
  export var useSmartCardActions = function useSmartCardActions(id, url, analytics) {
13
14
  var _useSmartLinkContext = useSmartLinkContext(),
14
15
  store = _useSmartLinkContext.store,
@@ -98,7 +99,7 @@ export var useSmartCardActions = function useSmartCardActions(id, url, analytics
98
99
  isReloading = _args.length > 1 && _args[1] !== undefined ? _args[1] : false;
99
100
 
100
101
  if (!(isReloading || !hasData)) {
101
- _context.next = 4;
102
+ _context.next = 6;
102
103
  break;
103
104
  }
104
105
 
@@ -108,13 +109,18 @@ export var useSmartCardActions = function useSmartCardActions(id, url, analytics
108
109
  return handleResolvedLinkError(resourceUrl, error);
109
110
  }));
110
111
 
111
- case 4:
112
+ case 6:
113
+ addMetadataToExperience('smart-link-rendered', id, {
114
+ cached: true
115
+ });
116
+
117
+ case 7:
112
118
  case "end":
113
119
  return _context.stop();
114
120
  }
115
121
  }
116
122
  }, _callee);
117
- })), [url, hasData, connections.client, handleResolvedLinkResponse, handleResolvedLinkError]);
123
+ })), [url, hasData, connections.client, handleResolvedLinkResponse, handleResolvedLinkError, id]);
118
124
  var register = useCallback(function () {
119
125
  if (!details) {
120
126
  dispatch(cardAction(ACTION_PENDING, {
@@ -152,10 +158,10 @@ export var useSmartCardActions = function useSmartCardActions(id, url, analytics
152
158
  analytics.screen.authPopupEvent(definitionId, extensionKey);
153
159
  auth(services[0].url).then(function () {
154
160
  analytics.track.appAccountConnected(definitionId, extensionKey);
155
- analytics.operational.connectSucceededEvent(definitionId, extensionKey);
161
+ analytics.operational.connectSucceededEvent(id, definitionId, extensionKey);
156
162
  reload();
157
163
  }, function (err) {
158
- analytics.operational.connectFailedEvent(definitionId, extensionKey, err.type);
164
+ analytics.operational.connectFailedEvent(id, definitionId, extensionKey, err.type);
159
165
 
160
166
  if (err.type === 'auth_window_closed') {
161
167
  analytics.ui.closedAuthEvent(appearance, definitionId, extensionKey);
@@ -164,7 +170,7 @@ export var useSmartCardActions = function useSmartCardActions(id, url, analytics
164
170
  reload();
165
171
  });
166
172
  }
167
- }, [analytics.ui, analytics.screen, analytics.track, analytics.operational, reload, details, status]);
173
+ }, [analytics.ui, analytics.screen, analytics.track, analytics.operational, id, reload, details, status]);
168
174
  var invoke = useCallback( /*#__PURE__*/function () {
169
175
  var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(opts, appearance) {
170
176
  var key, action, source, markName, response;
@@ -1,80 +1,2 @@
1
- import { uiAuthEvent, uiAuthAlternateAccountEvent, uiCardClickedEvent, uiActionClickedEvent, uiClosedAuthEvent, uiRenderSuccessEvent, uiRenderFailedEvent, resolvedEvent as _resolvedEvent, unresolvedEvent as _unresolvedEvent, invokeSucceededEvent as _invokeSucceededEvent, invokeFailedEvent as _invokeFailedEvent, connectSucceededEvent as _connectSucceededEvent, connectFailedEvent as _connectFailedEvent, trackAppAccountConnected, screenAuthPopupEvent, instrumentEvent } from '../../utils/analytics';
2
- import { useMemo } from 'react';
3
- export var useSmartLinkAnalytics = function useSmartLinkAnalytics(dispatchAnalytics) {
4
- var ui = useMemo(function () {
5
- return {
6
- authEvent: function authEvent(display, definitionId, extensionKey) {
7
- return dispatchAnalytics(uiAuthEvent(display, definitionId, extensionKey));
8
- },
9
- authAlternateAccountEvent: function authAlternateAccountEvent(display, definitionId, extensionKey) {
10
- return dispatchAnalytics(uiAuthAlternateAccountEvent(display, definitionId, extensionKey));
11
- },
12
- cardClickedEvent: function cardClickedEvent(display, definitionId, extensionKey) {
13
- return dispatchAnalytics(uiCardClickedEvent(display, definitionId, extensionKey));
14
- },
15
- actionClickedEvent: function actionClickedEvent(providerKey, actionType, display) {
16
- return dispatchAnalytics(uiActionClickedEvent(providerKey, actionType, display));
17
- },
18
- closedAuthEvent: function closedAuthEvent(display, definitionId, extensionKey) {
19
- return dispatchAnalytics(uiClosedAuthEvent(display, definitionId, extensionKey));
20
- },
21
- renderSuccessEvent: function renderSuccessEvent(display, definitionId, extensionKey) {
22
- return dispatchAnalytics(uiRenderSuccessEvent(display, definitionId, extensionKey));
23
- },
24
- renderFailedEvent: function renderFailedEvent(display, error, errorInfo) {
25
- return dispatchAnalytics(uiRenderFailedEvent(display, error, errorInfo));
26
- }
27
- };
28
- }, [dispatchAnalytics]);
29
- var operational = useMemo(function () {
30
- return {
31
- resolvedEvent: function resolvedEvent(id, definitionId, extensionKey, resourceType) {
32
- return dispatchAnalytics(_resolvedEvent(id, definitionId, extensionKey, resourceType));
33
- },
34
- unresolvedEvent: function unresolvedEvent(id, status, definitionId, extensionKey, resourceType) {
35
- return dispatchAnalytics(_unresolvedEvent(id, status, definitionId, extensionKey, resourceType));
36
- },
37
- invokeSucceededEvent: function invokeSucceededEvent(id, providerKey, actionType, display) {
38
- return dispatchAnalytics(_invokeSucceededEvent(id, providerKey, actionType, display));
39
- },
40
- invokeFailedEvent: function invokeFailedEvent(id, providerKey, actionType, display, reason) {
41
- return dispatchAnalytics(_invokeFailedEvent(id, providerKey, actionType, display, reason));
42
- },
43
- connectSucceededEvent: function connectSucceededEvent(definitionId, extensionKey) {
44
- return dispatchAnalytics(_connectSucceededEvent(definitionId, extensionKey));
45
- },
46
- connectFailedEvent: function connectFailedEvent(definitionId, extensionKey, reason) {
47
- return dispatchAnalytics(_connectFailedEvent(definitionId, extensionKey, reason));
48
- },
49
- instrument: function instrument(id, status, definitionId, extensionKey, resourceType, error) {
50
- var event = instrumentEvent(id, status, definitionId, extensionKey, resourceType, error);
51
-
52
- if (event) {
53
- dispatchAnalytics(event);
54
- }
55
- }
56
- };
57
- }, [dispatchAnalytics]);
58
- var track = useMemo(function () {
59
- return {
60
- appAccountConnected: function appAccountConnected(definitionId, extensionKey) {
61
- return dispatchAnalytics(trackAppAccountConnected(definitionId, extensionKey));
62
- }
63
- };
64
- }, [dispatchAnalytics]);
65
- var screen = useMemo(function () {
66
- return {
67
- authPopupEvent: function authPopupEvent(definitionId, extensionKey) {
68
- return dispatchAnalytics(screenAuthPopupEvent(definitionId, extensionKey));
69
- }
70
- };
71
- }, [dispatchAnalytics]);
72
- return useMemo(function () {
73
- return {
74
- ui: ui,
75
- operational: operational,
76
- track: track,
77
- screen: screen
78
- };
79
- }, [ui, operational, track, screen]);
80
- };
1
+ export { startUfoExperience, succeedUfoExperience, failUfoExperience, addMetadataToExperience } from './ufoExperiences';
2
+ export { useSmartLinkAnalytics } from './useSmartLinkAnalytics';
@@ -0,0 +1,40 @@
1
+ import { ConcurrentExperience, ExperiencePerformanceTypes, ExperienceTypes } from '@atlaskit/ufo';
2
+ var ufoExperiences = {
3
+ 'smart-link-rendered': new ConcurrentExperience('smart-link-rendered', {
4
+ type: ExperienceTypes.Load,
5
+ performanceType: ExperiencePerformanceTypes.PageSegmentLoad,
6
+ platform: {
7
+ component: 'smart-links'
8
+ }
9
+ }),
10
+ 'smart-link-authenticated': new ConcurrentExperience('smart-link-authenticated', {
11
+ type: ExperienceTypes.Load,
12
+ performanceType: ExperiencePerformanceTypes.PageSegmentLoad,
13
+ platform: {
14
+ component: 'smart-links'
15
+ }
16
+ })
17
+ };
18
+ export var startUfoExperience = function startUfoExperience(experienceName, id, properties) {
19
+ var experience = ufoExperiences[experienceName].getInstance(id);
20
+ experience.start();
21
+
22
+ if (properties) {
23
+ experience.addMetadata(properties);
24
+ }
25
+ };
26
+ export var succeedUfoExperience = function succeedUfoExperience(experienceName, id, properties) {
27
+ var experience = ufoExperiences[experienceName].getInstance(id);
28
+ experience.success({
29
+ metadata: properties
30
+ });
31
+ };
32
+ export var failUfoExperience = function failUfoExperience(experienceName, id, properties) {
33
+ var experience = ufoExperiences[experienceName].getInstance(id);
34
+ experience.failure({
35
+ metadata: properties
36
+ });
37
+ };
38
+ export var addMetadataToExperience = function addMetadataToExperience(experienceName, id, properties) {
39
+ ufoExperiences[experienceName].getInstance(id).addMetadata(properties);
40
+ };
@@ -0,0 +1,94 @@
1
+ import { uiAuthEvent, uiAuthAlternateAccountEvent, uiCardClickedEvent, uiActionClickedEvent, uiClosedAuthEvent, uiRenderSuccessEvent, resolvedEvent as _resolvedEvent, unresolvedEvent as _unresolvedEvent, invokeSucceededEvent as _invokeSucceededEvent, invokeFailedEvent as _invokeFailedEvent, connectSucceededEvent as _connectSucceededEvent, connectFailedEvent as _connectFailedEvent, trackAppAccountConnected, screenAuthPopupEvent, instrumentEvent } from '../../utils/analytics';
2
+ import { useMemo } from 'react';
3
+ import { startUfoExperience, succeedUfoExperience } from './ufoExperiences';
4
+ export var useSmartLinkAnalytics = function useSmartLinkAnalytics(dispatchAnalytics) {
5
+ var ui = useMemo(function () {
6
+ return {
7
+ authEvent: function authEvent(display, definitionId, extensionKey) {
8
+ return dispatchAnalytics(uiAuthEvent(display, definitionId, extensionKey));
9
+ },
10
+ authAlternateAccountEvent: function authAlternateAccountEvent(display, definitionId, extensionKey) {
11
+ return dispatchAnalytics(uiAuthAlternateAccountEvent(display, definitionId, extensionKey));
12
+ },
13
+ cardClickedEvent: function cardClickedEvent(display, definitionId, extensionKey) {
14
+ return dispatchAnalytics(uiCardClickedEvent(display, definitionId, extensionKey));
15
+ },
16
+ actionClickedEvent: function actionClickedEvent(providerKey, actionType, display) {
17
+ return dispatchAnalytics(uiActionClickedEvent(providerKey, actionType, display));
18
+ },
19
+ closedAuthEvent: function closedAuthEvent(display, definitionId, extensionKey) {
20
+ return dispatchAnalytics(uiClosedAuthEvent(display, definitionId, extensionKey));
21
+ },
22
+ renderSuccessEvent: function renderSuccessEvent(display, id, definitionId, extensionKey) {
23
+ succeedUfoExperience('smart-link-rendered', id, {
24
+ extensionKey: extensionKey,
25
+ display: display
26
+ }); // UFO will disregard this if authentication experience has not yet been started
27
+
28
+ succeedUfoExperience('smart-link-authenticated', id, {
29
+ display: display
30
+ });
31
+ dispatchAnalytics(uiRenderSuccessEvent(display, definitionId, extensionKey));
32
+ }
33
+ };
34
+ }, [dispatchAnalytics]);
35
+ var operational = useMemo(function () {
36
+ return {
37
+ resolvedEvent: function resolvedEvent(id, definitionId, extensionKey, resourceType) {
38
+ return dispatchAnalytics(_resolvedEvent(id, definitionId, extensionKey, resourceType));
39
+ },
40
+ unresolvedEvent: function unresolvedEvent(id, status, definitionId, extensionKey, resourceType) {
41
+ return dispatchAnalytics(_unresolvedEvent(id, status, definitionId, extensionKey, resourceType));
42
+ },
43
+ invokeSucceededEvent: function invokeSucceededEvent(id, providerKey, actionType, display) {
44
+ return dispatchAnalytics(_invokeSucceededEvent(id, providerKey, actionType, display));
45
+ },
46
+ invokeFailedEvent: function invokeFailedEvent(id, providerKey, actionType, display, reason) {
47
+ return dispatchAnalytics(_invokeFailedEvent(id, providerKey, actionType, display, reason));
48
+ },
49
+ connectSucceededEvent: function connectSucceededEvent(id, definitionId, extensionKey) {
50
+ startUfoExperience('smart-link-authenticated', id, {
51
+ extensionKey: extensionKey,
52
+ status: 'success'
53
+ });
54
+ dispatchAnalytics(_connectSucceededEvent(definitionId, extensionKey));
55
+ },
56
+ connectFailedEvent: function connectFailedEvent(id, definitionId, extensionKey, status) {
57
+ startUfoExperience('smart-link-authenticated', id, {
58
+ extensionKey: extensionKey,
59
+ status: status
60
+ });
61
+ dispatchAnalytics(_connectFailedEvent(definitionId, extensionKey, status));
62
+ },
63
+ instrument: function instrument(id, status, definitionId, extensionKey, resourceType, error) {
64
+ var event = instrumentEvent(id, status, definitionId, extensionKey, resourceType, error);
65
+
66
+ if (event) {
67
+ dispatchAnalytics(event);
68
+ }
69
+ }
70
+ };
71
+ }, [dispatchAnalytics]);
72
+ var track = useMemo(function () {
73
+ return {
74
+ appAccountConnected: function appAccountConnected(definitionId, extensionKey) {
75
+ return dispatchAnalytics(trackAppAccountConnected(definitionId, extensionKey));
76
+ }
77
+ };
78
+ }, [dispatchAnalytics]);
79
+ var screen = useMemo(function () {
80
+ return {
81
+ authPopupEvent: function authPopupEvent(definitionId, extensionKey) {
82
+ return dispatchAnalytics(screenAuthPopupEvent(definitionId, extensionKey));
83
+ }
84
+ };
85
+ }, [dispatchAnalytics]);
86
+ return useMemo(function () {
87
+ return {
88
+ ui: ui,
89
+ operational: operational,
90
+ track: track,
91
+ screen: screen
92
+ };
93
+ }, [ui, operational, track, screen]);
94
+ };
@@ -12,16 +12,15 @@ export function useSmartLink(id, url, dispatchAnalytics) {
12
12
  var config = useSmartLinkConfig();
13
13
  var renderers = useSmartLinkRenderers(); // NB: used to propagate errors from hooks to error boundaries.
14
14
 
15
- var _useState = useState(),
15
+ var _useState = useState(null),
16
16
  _useState2 = _slicedToArray(_useState, 2),
17
- setState = _useState2[1]; // Register the current card.
17
+ error = _useState2[0],
18
+ setError = _useState2[1]; // Register the current card.
18
19
 
19
20
 
20
21
  var register = function register() {
21
22
  actions.register().catch(function (err) {
22
- return setState(function () {
23
- throw err;
24
- });
23
+ return setError(err);
25
24
  });
26
25
  }; // AFP-2511 TODO: Fix automatic suppressions below
27
26
  // eslint-disable-next-line react-hooks/exhaustive-deps
@@ -34,6 +33,7 @@ export function useSmartLink(id, url, dispatchAnalytics) {
34
33
  actions: actions,
35
34
  config: config,
36
35
  analytics: analytics,
37
- renderers: renderers
36
+ renderers: renderers,
37
+ error: error
38
38
  };
39
39
  }
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/smart-card",
3
- "version": "16.0.0",
3
+ "version": "16.2.1",
4
4
  "sideEffects": false
5
5
  }
@@ -22,7 +22,8 @@ export var BlockCard = function BlockCard(_ref) {
22
22
  isSelected = _ref.isSelected,
23
23
  onResolve = _ref.onResolve,
24
24
  testId = _ref.testId,
25
- showActions = _ref.showActions;
25
+ showActions = _ref.showActions,
26
+ platform = _ref.platform;
26
27
  var data = details && details.data || getEmptyJsonLd();
27
28
  var meta = details && details.meta;
28
29
  var extractorOpts = {
@@ -40,7 +41,7 @@ export var BlockCard = function BlockCard(_ref) {
40
41
  });
41
42
 
42
43
  case 'resolved':
43
- var resolvedViewProps = extractBlockProps(data, meta, extractorOpts, renderers);
44
+ var resolvedViewProps = extractBlockProps(data, meta, extractorOpts, renderers, platform);
44
45
 
45
46
  if (onResolve) {
46
47
  onResolve({
@@ -2,7 +2,7 @@ import React from 'react';
2
2
  import { isIntersectionObserverSupported } from '@atlaskit/media-ui';
3
3
  import { LazyLazilyRenderCard } from './LazyLazilyRenderCard';
4
4
  import { LazyIntersectionObserverCard } from './LazyIntersectionObserverCard';
5
- export function LazyCardWithUrlContent(props) {
5
+ export default function LazyCardWithUrlContent(props) {
6
6
  if (isIntersectionObserverSupported()) {
7
7
  return /*#__PURE__*/React.createElement(LazyIntersectionObserverCard, props);
8
8
  } else {
@@ -28,7 +28,8 @@ export function CardWithUrlContent(_ref) {
28
28
  actions = _useSmartLink.actions,
29
29
  config = _useSmartLink.config,
30
30
  analytics = _useSmartLink.analytics,
31
- renderers = _useSmartLink.renderers;
31
+ renderers = _useSmartLink.renderers,
32
+ error = _useSmartLink.error;
32
33
 
33
34
  var definitionId = getDefinitionId(state.details);
34
35
  var extensionKey = getExtensionKey(state.details);
@@ -71,9 +72,13 @@ export function CardWithUrlContent(_ref) {
71
72
 
72
73
  useEffect(function () {
73
74
  if (isFinalState(state.status)) {
74
- analytics.ui.renderSuccessEvent(appearance, definitionId, extensionKey);
75
+ analytics.ui.renderSuccessEvent(appearance, id, definitionId, extensionKey);
75
76
  }
76
- }, [appearance, state.details, state.status, url, definitionId, extensionKey, analytics.ui]);
77
+ }, [appearance, state.details, state.status, url, definitionId, extensionKey, analytics.ui, id]); // We have to keep this last to prevent hook order from being violated
78
+
79
+ if (error) {
80
+ throw error;
81
+ }
77
82
 
78
83
  switch (appearance) {
79
84
  case 'inline':
@@ -103,7 +108,8 @@ export function CardWithUrlContent(_ref) {
103
108
  isSelected: isSelected,
104
109
  onResolve: onResolve,
105
110
  testId: testId,
106
- showActions: showActions
111
+ showActions: showActions,
112
+ platform: platform
107
113
  });
108
114
 
109
115
  case 'embed':