@atlaskit/smart-card 16.1.1 → 17.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (90) hide show
  1. package/CHANGELOG.md +98 -0
  2. package/dist/cjs/client/api.js +1 -1
  3. package/dist/cjs/client/types/responses.js +1 -1
  4. package/dist/cjs/client/utils/environments.js +2 -2
  5. package/dist/cjs/extractors/block/index.js +3 -3
  6. package/dist/cjs/extractors/common/actions/extractPreviewAction.js +2 -2
  7. package/dist/cjs/extractors/common/byline/extractByline.js +17 -5
  8. package/dist/cjs/extractors/common/lozenge/utils.js +1 -1
  9. package/dist/cjs/extractors/common/utils.js +1 -1
  10. package/dist/cjs/extractors/constants.js +1 -1
  11. package/dist/cjs/in-product.js +8 -8
  12. package/dist/cjs/index.js +74 -32
  13. package/dist/cjs/providers/editor/transformer.js +6 -2
  14. package/dist/cjs/state/actions/constants.js +1 -1
  15. package/dist/cjs/state/actions/index.js +14 -7
  16. package/dist/cjs/state/analytics/index.js +32 -84
  17. package/dist/cjs/state/analytics/ufoExperiences.js +63 -0
  18. package/dist/cjs/state/analytics/useSmartLinkAnalytics.js +114 -0
  19. package/dist/cjs/state/context/index.js +3 -2
  20. package/dist/cjs/state/helpers.js +1 -1
  21. package/dist/cjs/state/hooks/useSmartLink.js +6 -6
  22. package/dist/cjs/state/index.js +4 -4
  23. package/dist/cjs/utils/analytics/analytics.js +7 -7
  24. package/dist/cjs/utils/analytics/index.js +27 -27
  25. package/dist/cjs/utils/index.js +1 -1
  26. package/dist/cjs/utils/mocks.js +1 -1
  27. package/dist/cjs/utils/performance.js +1 -1
  28. package/dist/cjs/version.json +1 -1
  29. package/dist/cjs/view/BlockCard/index.js +1 -1
  30. package/dist/cjs/view/Card/index.js +9 -2
  31. package/dist/cjs/view/CardWithUrl/component-lazy/LazyFallback.js +1 -1
  32. package/dist/cjs/view/CardWithUrl/component-lazy/index.js +1 -1
  33. package/dist/cjs/view/CardWithUrl/component.js +8 -3
  34. package/dist/cjs/view/CardWithUrl/loader.js +106 -134
  35. package/dist/cjs/view/EmbedCard/index.js +1 -1
  36. package/dist/es2019/client/utils/environments.js +1 -1
  37. package/dist/es2019/extractors/block/index.js +2 -2
  38. package/dist/es2019/extractors/common/actions/extractPreviewAction.js +2 -2
  39. package/dist/es2019/extractors/common/byline/extractByline.js +16 -5
  40. package/dist/es2019/index.js +1 -1
  41. package/dist/es2019/providers/editor/transformer.js +4 -2
  42. package/dist/es2019/state/actions/index.js +10 -5
  43. package/dist/es2019/state/analytics/index.js +2 -40
  44. package/dist/es2019/state/analytics/ufoExperiences.js +43 -0
  45. package/dist/es2019/state/analytics/useSmartLinkAnalytics.js +76 -0
  46. package/dist/es2019/state/hooks/useSmartLink.js +4 -5
  47. package/dist/es2019/utils/analytics/analytics.js +6 -6
  48. package/dist/es2019/version.json +1 -1
  49. package/dist/es2019/view/BlockCard/index.js +2 -2
  50. package/dist/es2019/view/Card/index.js +8 -2
  51. package/dist/es2019/view/CardWithUrl/component-lazy/index.js +1 -1
  52. package/dist/es2019/view/CardWithUrl/component.js +8 -3
  53. package/dist/es2019/view/CardWithUrl/loader.js +82 -91
  54. package/dist/es2019/view/EmbedCard/index.js +2 -2
  55. package/dist/esm/client/utils/environments.js +1 -1
  56. package/dist/esm/extractors/block/index.js +2 -2
  57. package/dist/esm/extractors/common/actions/extractPreviewAction.js +2 -2
  58. package/dist/esm/extractors/common/byline/extractByline.js +16 -5
  59. package/dist/esm/index.js +1 -1
  60. package/dist/esm/providers/editor/transformer.js +6 -2
  61. package/dist/esm/state/actions/index.js +13 -7
  62. package/dist/esm/state/analytics/index.js +2 -80
  63. package/dist/esm/state/analytics/ufoExperiences.js +43 -0
  64. package/dist/esm/state/analytics/useSmartLinkAnalytics.js +102 -0
  65. package/dist/esm/state/hooks/useSmartLink.js +6 -6
  66. package/dist/esm/utils/analytics/analytics.js +6 -6
  67. package/dist/esm/version.json +1 -1
  68. package/dist/esm/view/BlockCard/index.js +2 -2
  69. package/dist/esm/view/Card/index.js +8 -2
  70. package/dist/esm/view/CardWithUrl/component-lazy/index.js +1 -1
  71. package/dist/esm/view/CardWithUrl/component.js +8 -3
  72. package/dist/esm/view/CardWithUrl/loader.js +101 -130
  73. package/dist/esm/view/EmbedCard/index.js +2 -2
  74. package/dist/types/extractors/block/types.d.ts +1 -1
  75. package/dist/types/extractors/common/actions/extractPreviewAction.d.ts +1 -1
  76. package/dist/types/index.d.ts +1 -1
  77. package/dist/types/state/analytics/index.d.ts +3 -32
  78. package/dist/types/state/analytics/ufoExperiences.d.ts +7 -0
  79. package/dist/types/state/analytics/useSmartLinkAnalytics.d.ts +31 -0
  80. package/dist/types/state/context/provider.d.ts +1 -0
  81. package/dist/types/state/hooks/useSmartLink.d.ts +5 -6
  82. package/dist/types/utils/analytics/analytics.d.ts +3 -3
  83. package/dist/types/utils/test-utils.d.ts +1 -0
  84. package/dist/types/view/Card/index.d.ts +2 -1
  85. package/dist/types/view/CardWithUrl/component-lazy/LazyIntersectionObserverCard.d.ts +1 -0
  86. package/dist/types/view/CardWithUrl/component-lazy/LazyLazilyRenderCard.d.ts +1 -0
  87. package/dist/types/view/CardWithUrl/component-lazy/index.d.ts +2 -1
  88. package/dist/types/view/CardWithUrl/component.d.ts +1 -0
  89. package/dist/types/view/CardWithUrl/loader.d.ts +2 -15
  90. package/package.json +19 -15
@@ -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,43 @@
1
+ import { ConcurrentExperience, ExperiencePerformanceTypes, ExperienceTypes } from '@atlaskit/ufo';
2
+ var inlineExperience = {
3
+ platform: {
4
+ component: 'smart-links'
5
+ },
6
+ type: ExperienceTypes.Experience,
7
+ performanceType: ExperiencePerformanceTypes.InlineResult
8
+ };
9
+ var renderExperience = {
10
+ platform: {
11
+ component: 'smart-links'
12
+ },
13
+ type: ExperienceTypes.Load,
14
+ performanceType: ExperiencePerformanceTypes.PageSegmentLoad
15
+ };
16
+ var ufoExperiences = {
17
+ 'smart-link-rendered': new ConcurrentExperience('smart-link-rendered', renderExperience),
18
+ 'smart-link-authenticated': new ConcurrentExperience('smart-link-authenticated', inlineExperience),
19
+ 'smart-link-action-invocation': new ConcurrentExperience('smart-link-action-invocation', inlineExperience)
20
+ };
21
+ export var startUfoExperience = function startUfoExperience(experienceName, id, properties) {
22
+ var experience = ufoExperiences[experienceName].getInstance(id);
23
+ experience.start();
24
+
25
+ if (properties) {
26
+ experience.addMetadata(properties);
27
+ }
28
+ };
29
+ export var succeedUfoExperience = function succeedUfoExperience(experienceName, id, properties) {
30
+ var experience = ufoExperiences[experienceName].getInstance(id);
31
+ experience.success({
32
+ metadata: properties
33
+ });
34
+ };
35
+ export var failUfoExperience = function failUfoExperience(experienceName, id, properties) {
36
+ var experience = ufoExperiences[experienceName].getInstance(id);
37
+ experience.failure({
38
+ metadata: properties
39
+ });
40
+ };
41
+ export var addMetadataToExperience = function addMetadataToExperience(experienceName, id, properties) {
42
+ ufoExperiences[experienceName].getInstance(id).addMetadata(properties);
43
+ };
@@ -0,0 +1,102 @@
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 { failUfoExperience, 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(id, extensionKey, actionType, display, invokeType) {
17
+ startUfoExperience('smart-link-action-invocation', id, {
18
+ actionType: actionType,
19
+ display: display,
20
+ extensionKey: extensionKey,
21
+ invokeType: invokeType
22
+ });
23
+ dispatchAnalytics(uiActionClickedEvent(extensionKey, actionType, display));
24
+ },
25
+ closedAuthEvent: function closedAuthEvent(display, definitionId, extensionKey) {
26
+ return dispatchAnalytics(uiClosedAuthEvent(display, definitionId, extensionKey));
27
+ },
28
+ renderSuccessEvent: function renderSuccessEvent(display, id, definitionId, extensionKey) {
29
+ succeedUfoExperience('smart-link-rendered', id, {
30
+ extensionKey: extensionKey,
31
+ display: display
32
+ }); // UFO will disregard this if authentication experience has not yet been started
33
+
34
+ succeedUfoExperience('smart-link-authenticated', id, {
35
+ display: display
36
+ });
37
+ dispatchAnalytics(uiRenderSuccessEvent(display, definitionId, extensionKey));
38
+ }
39
+ };
40
+ }, [dispatchAnalytics]);
41
+ var operational = useMemo(function () {
42
+ return {
43
+ resolvedEvent: function resolvedEvent(id, definitionId, extensionKey, resourceType) {
44
+ return dispatchAnalytics(_resolvedEvent(id, definitionId, extensionKey, resourceType));
45
+ },
46
+ unresolvedEvent: function unresolvedEvent(id, status, definitionId, extensionKey, resourceType) {
47
+ return dispatchAnalytics(_unresolvedEvent(id, status, definitionId, extensionKey, resourceType));
48
+ },
49
+ invokeSucceededEvent: function invokeSucceededEvent(id, providerKey, actionType, display) {
50
+ succeedUfoExperience('smart-link-action-invocation', id);
51
+ dispatchAnalytics(_invokeSucceededEvent(id, providerKey, actionType, display));
52
+ },
53
+ invokeFailedEvent: function invokeFailedEvent(id, providerKey, actionType, display, reason) {
54
+ failUfoExperience('smart-link-action-invocation', id);
55
+ dispatchAnalytics(_invokeFailedEvent(id, providerKey, actionType, display, reason));
56
+ },
57
+ connectSucceededEvent: function connectSucceededEvent(id, definitionId, extensionKey) {
58
+ startUfoExperience('smart-link-authenticated', id, {
59
+ extensionKey: extensionKey,
60
+ status: 'success'
61
+ });
62
+ dispatchAnalytics(_connectSucceededEvent(definitionId, extensionKey));
63
+ },
64
+ connectFailedEvent: function connectFailedEvent(id, definitionId, extensionKey, status) {
65
+ startUfoExperience('smart-link-authenticated', id, {
66
+ extensionKey: extensionKey,
67
+ status: status
68
+ });
69
+ dispatchAnalytics(_connectFailedEvent(definitionId, extensionKey, status));
70
+ },
71
+ instrument: function instrument(id, status, definitionId, extensionKey, resourceType, error) {
72
+ var event = instrumentEvent(id, status, definitionId, extensionKey, resourceType, error);
73
+
74
+ if (event) {
75
+ dispatchAnalytics(event);
76
+ }
77
+ }
78
+ };
79
+ }, [dispatchAnalytics]);
80
+ var track = useMemo(function () {
81
+ return {
82
+ appAccountConnected: function appAccountConnected(definitionId, extensionKey) {
83
+ return dispatchAnalytics(trackAppAccountConnected(definitionId, extensionKey));
84
+ }
85
+ };
86
+ }, [dispatchAnalytics]);
87
+ var screen = useMemo(function () {
88
+ return {
89
+ authPopupEvent: function authPopupEvent(definitionId, extensionKey) {
90
+ return dispatchAnalytics(screenAuthPopupEvent(definitionId, extensionKey));
91
+ }
92
+ };
93
+ }, [dispatchAnalytics]);
94
+ return useMemo(function () {
95
+ return {
96
+ ui: ui,
97
+ operational: operational,
98
+ track: track,
99
+ screen: screen
100
+ };
101
+ }, [ui, operational, track, screen]);
102
+ };
@@ -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
  }
@@ -82,7 +82,7 @@ export var unresolvedEvent = function unresolvedEvent(id, status, definitionId,
82
82
  })
83
83
  };
84
84
  };
85
- export var invokeSucceededEvent = function invokeSucceededEvent(id, providerKey, actionType, display) {
85
+ export var invokeSucceededEvent = function invokeSucceededEvent(id, extensionKey, actionType, display) {
86
86
  var measure = getMeasure(id, 'resolved') || {
87
87
  duration: undefined
88
88
  };
@@ -94,12 +94,12 @@ export var invokeSucceededEvent = function invokeSucceededEvent(id, providerKey,
94
94
  id: id,
95
95
  actionType: actionType,
96
96
  display: display,
97
- definitionId: providerKey,
97
+ extensionKey: extensionKey,
98
98
  duration: measure.duration
99
99
  })
100
100
  };
101
101
  };
102
- export var invokeFailedEvent = function invokeFailedEvent(id, providerKey, actionType, display, reason) {
102
+ export var invokeFailedEvent = function invokeFailedEvent(id, extensionKey, actionType, display, reason) {
103
103
  var measure = getMeasure(id, 'errored') || {
104
104
  duration: undefined
105
105
  };
@@ -111,7 +111,7 @@ export var invokeFailedEvent = function invokeFailedEvent(id, providerKey, actio
111
111
  id: id,
112
112
  actionType: actionType,
113
113
  display: display,
114
- definitionId: providerKey,
114
+ extensionKey: extensionKey,
115
115
  duration: measure.duration,
116
116
  reason: reason
117
117
  })
@@ -194,14 +194,14 @@ export var uiCardClickedEvent = function uiCardClickedEvent(display, definitionI
194
194
  })
195
195
  };
196
196
  };
197
- export var uiActionClickedEvent = function uiActionClickedEvent(providerKey, actionType, display) {
197
+ export var uiActionClickedEvent = function uiActionClickedEvent(extensionKey, actionType, display) {
198
198
  return {
199
199
  action: 'clicked',
200
200
  actionSubject: 'smartLinkAction',
201
201
  eventType: 'ui',
202
202
  attributes: _objectSpread(_objectSpread({}, context), {}, {
203
203
  display: display,
204
- definitionId: providerKey,
204
+ extensionKey: extensionKey,
205
205
  actionType: actionType
206
206
  })
207
207
  };
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/smart-card",
3
- "version": "16.1.1",
3
+ "version": "17.0.0",
4
4
  "sideEffects": false
5
5
  }
@@ -1,7 +1,7 @@
1
1
  import _extends from "@babel/runtime/helpers/extends";
2
2
  import React from 'react';
3
3
  import { CardLinkView, BlockCardResolvingView, BlockCardErroredView, BlockCardUnauthorisedView, BlockCardForbiddenView, BlockCardResolvedView, BlockCardNotFoundView, AuthorizeAction, ForbiddenAction } from '@atlaskit/media-ui';
4
- import { getDefinitionId } from '../../state/helpers';
4
+ import { getExtensionKey } from '../../state/helpers';
5
5
  import { extractBlockProps } from '../../extractors/block';
6
6
  import { getEmptyJsonLd, getUnauthorizedJsonLd } from '../../utils/jsonld';
7
7
  import { extractRequestAccessContext } from '../../extractors/common/context';
@@ -29,7 +29,7 @@ export var BlockCard = function BlockCard(_ref) {
29
29
  var extractorOpts = {
30
30
  handleAnalytics: handlePreviewAnalytics,
31
31
  handleInvoke: handleInvoke,
32
- definitionId: getDefinitionId(details)
32
+ extensionKey: getExtensionKey(details)
33
33
  };
34
34
 
35
35
  switch (status) {
@@ -14,6 +14,7 @@ import { CardWithDataRenderer } from '../CardWithData/loader';
14
14
  import { CardWithURLRenderer } from '../CardWithUrl/loader';
15
15
  import { isCardWithData } from '../../utils';
16
16
  import { context } from '../../utils/analytics';
17
+ import { injectIntl, IntlProvider } from 'react-intl-next';
17
18
 
18
19
  var PlainCard = /*#__PURE__*/function (_React$PureComponent) {
19
20
  _inherits(PlainCard, _React$PureComponent);
@@ -29,11 +30,16 @@ var PlainCard = /*#__PURE__*/function (_React$PureComponent) {
29
30
  _createClass(PlainCard, [{
30
31
  key: "render",
31
32
  value: function render() {
32
- return isCardWithData(this.props) ? /*#__PURE__*/React.createElement(CardWithDataRenderer, this.props) : /*#__PURE__*/React.createElement(CardWithURLRenderer, this.props);
33
+ var content = isCardWithData(this.props) ? /*#__PURE__*/React.createElement(CardWithDataRenderer, this.props) : /*#__PURE__*/React.createElement(CardWithURLRenderer, this.props);
34
+ return this.props.intl ? content : /*#__PURE__*/React.createElement(IntlProvider, {
35
+ locale: "en"
36
+ }, content);
33
37
  }
34
38
  }]);
35
39
 
36
40
  return PlainCard;
37
41
  }(React.PureComponent);
38
42
 
39
- export var Card = withAnalyticsContext(context)(withAnalyticsEvents()(PlainCard));
43
+ export var Card = withAnalyticsContext(context)(withAnalyticsEvents()(injectIntl(PlainCard, {
44
+ enforceContext: false
45
+ })));
@@ -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':
@@ -1,141 +1,112 @@
1
- import _classCallCheck from "@babel/runtime/helpers/classCallCheck";
2
- import _createClass from "@babel/runtime/helpers/createClass";
3
- import _assertThisInitialized from "@babel/runtime/helpers/assertThisInitialized";
4
- import _inherits from "@babel/runtime/helpers/inherits";
5
- import _possibleConstructorReturn from "@babel/runtime/helpers/possibleConstructorReturn";
6
- import _getPrototypeOf from "@babel/runtime/helpers/getPrototypeOf";
7
- import _defineProperty from "@babel/runtime/helpers/defineProperty";
8
-
9
- function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }
10
-
11
- function _isNativeReflectConstruct() { if (typeof Reflect === "undefined" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === "function") return true; try { Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); return true; } catch (e) { return false; } }
12
-
13
- import React from 'react';
1
+ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
2
+ import React, { lazy, useEffect, useState, Suspense, useCallback } from 'react';
14
3
  import uuid from 'uuid';
15
4
  import { CardLinkView } from '@atlaskit/media-ui';
16
5
  import { uiRenderFailedEvent, fireSmartLinkEvent } from '../../utils/analytics';
17
6
  import { clearMarks, clearMeasures } from '../../utils/performance';
18
- export var CardWithURLRenderer = /*#__PURE__*/function (_React$PureComponent) {
19
- _inherits(CardWithURLRenderer, _React$PureComponent);
20
-
21
- var _super = _createSuper(CardWithURLRenderer);
22
-
23
- function CardWithURLRenderer(props) {
24
- var _this;
25
-
26
- _classCallCheck(this, CardWithURLRenderer);
27
-
28
- _this = _super.call(this, props);
29
-
30
- _defineProperty(_assertThisInitialized(_this), "dispatchAnalytics", function (analyticsPayload) {
31
- var _this$props = _this.props,
32
- appearance = _this$props.appearance,
33
- createAnalyticsEvent = _this$props.createAnalyticsEvent;
34
-
35
- if (analyticsPayload && analyticsPayload.attributes) {
36
- // Update if we haven't already set the display - possible
37
- // in the case of `preview` which is rendered differently.
38
- if (!analyticsPayload.attributes.display) {
39
- analyticsPayload.attributes.display = appearance;
40
- }
41
- }
42
-
43
- fireSmartLinkEvent(analyticsPayload, createAnalyticsEvent);
44
- });
45
-
46
- _this.state = {
47
- id: uuid()
48
- };
49
- return _this;
50
- }
51
-
52
- _createClass(CardWithURLRenderer, [{
53
- key: "componentDidMount",
54
- value: function componentDidMount() {
55
- if (CardWithURLRenderer.CardContent === null) {
56
- (this.props.importer || CardWithURLRenderer.moduleImporter)(this);
57
- }
58
- }
59
- }, {
60
- key: "componentWillUnmount",
61
- value: function componentWillUnmount() {
62
- var id = this.state.id;
7
+ import { ErrorBoundary } from 'react-error-boundary';
8
+ import { failUfoExperience, startUfoExperience } from '../../state/analytics/ufoExperiences';
9
+ var LazyCardWithUrlContent = /*#__PURE__*/lazy(function () {
10
+ return import(
11
+ /* webpackChunkName: "@atlaskit-internal_smartcard-urlcardcontent" */
12
+ './component-lazy/index');
13
+ });
14
+ export function CardWithURLRenderer(props) {
15
+ var _useState = useState(function () {
16
+ return uuid();
17
+ }),
18
+ _useState2 = _slicedToArray(_useState, 1),
19
+ id = _useState2[0]; // Equivalent to ComponentWillMount
20
+
21
+
22
+ useState(function () {
23
+ // We want to start timing of render event only once and right at the start
24
+ startUfoExperience('smart-link-rendered', id);
25
+ });
26
+ useEffect(function () {
27
+ // ComponentWillUnmount
28
+ return function () {
63
29
  clearMarks(id);
64
30
  clearMeasures(id);
65
- }
66
- }, {
67
- key: "componentDidCatch",
68
- value: function componentDidCatch(error, errorInfo) {
69
- var appearance = this.props.appearance; // NB: APIErrors are thrown in response to Object Resolver Service.
70
- // In these cases, control is handed back to the Editor. We do not
71
- // fire an event for these, as they do not cover failed UI render events.
72
-
73
- if (error.name === 'APIError') {
74
- throw error;
75
- } // NB: the rest of the errors caught here are unexpected, and correlate
76
- // to the reliability of the smart-card front-end components. We instrument
77
- // these in order to measure our front-end reliability.
78
- else {
79
- this.dispatchAnalytics(uiRenderFailedEvent(appearance, error, errorInfo));
80
- }
81
- } // Wrapper around analytics.
82
-
83
- }, {
84
- key: "render",
85
- value: function render() {
86
- var _this$props2 = this.props,
87
- url = _this$props2.url,
88
- appearance = _this$props2.appearance,
89
- isSelected = _this$props2.isSelected,
90
- isFrameVisible = _this$props2.isFrameVisible,
91
- onClick = _this$props2.onClick,
92
- container = _this$props2.container,
93
- onResolve = _this$props2.onResolve,
94
- testId = _this$props2.testId,
95
- showActions = _this$props2.showActions,
96
- inheritDimensions = _this$props2.inheritDimensions,
97
- platform = _this$props2.platform,
98
- embedIframeRef = _this$props2.embedIframeRef,
99
- inlinePreloaderStyle = _this$props2.inlinePreloaderStyle;
100
-
101
- if (!url) {
102
- throw new Error('@atlaskit/smart-card: url property is missing.');
31
+ };
32
+ }, [id]);
33
+ var url = props.url,
34
+ appearance = props.appearance,
35
+ isSelected = props.isSelected,
36
+ isFrameVisible = props.isFrameVisible,
37
+ onClick = props.onClick,
38
+ container = props.container,
39
+ onResolve = props.onResolve,
40
+ testId = props.testId,
41
+ showActions = props.showActions,
42
+ inheritDimensions = props.inheritDimensions,
43
+ platform = props.platform,
44
+ embedIframeRef = props.embedIframeRef,
45
+ inlinePreloaderStyle = props.inlinePreloaderStyle,
46
+ createAnalyticsEvent = props.createAnalyticsEvent; // Wrapper around analytics.
47
+
48
+ var dispatchAnalytics = useCallback(function (analyticsPayload) {
49
+ if (analyticsPayload && analyticsPayload.attributes) {
50
+ // Update if we haven't already set the display - possible
51
+ // in the case of `preview` which is rendered differently.
52
+ if (!analyticsPayload.attributes.display) {
53
+ analyticsPayload.attributes.display = appearance;
103
54
  }
104
-
105
- return CardWithURLRenderer.CardContent !== null ? /*#__PURE__*/React.createElement(CardWithURLRenderer.CardContent, {
106
- id: this.state.id,
107
- url: url,
108
- appearance: appearance,
109
- onClick: onClick,
110
- isSelected: isSelected,
111
- isFrameVisible: isFrameVisible,
112
- dispatchAnalytics: this.dispatchAnalytics,
113
- container: container,
114
- onResolve: onResolve,
115
- testId: testId,
116
- showActions: showActions,
117
- inheritDimensions: inheritDimensions,
118
- platform: platform,
119
- embedIframeRef: embedIframeRef,
120
- inlinePreloaderStyle: inlinePreloaderStyle
121
- }) : /*#__PURE__*/React.createElement(CardLinkView, {
122
- key: 'chunk-placeholder',
123
- link: url
124
- });
125
55
  }
126
- }], [{
127
- key: "moduleImporter",
128
- value: function moduleImporter(target) {
129
- import(
130
- /* webpackChunkName: "@atlaskit-internal_smartcard-urlcardcontent" */
131
- './component-lazy/index').then(function (module) {
132
- CardWithURLRenderer.CardContent = module.LazyCardWithUrlContent;
133
- target.forceUpdate();
134
- });
56
+
57
+ fireSmartLinkEvent(analyticsPayload, createAnalyticsEvent);
58
+ }, [appearance, createAnalyticsEvent]);
59
+ var logError = useCallback(function (error, info) {
60
+ var componentStack = info.componentStack; // NB: APIErrors are thrown in response to Object Resolver Service.
61
+ // In these cases, control is handed back to the Editor. We do not
62
+ // fire an event for these, as they do not cover failed UI render events.
63
+
64
+ if (error.name === 'APIError') {
65
+ throw error;
66
+ } // NB: the rest of the errors caught here are unexpected, and correlate
67
+ // to the reliability of the smart-card front-end components. We instrument
68
+ // these in order to measure our front-end reliability.
69
+ else {
70
+ var errorInfo = {
71
+ componentStack: componentStack
72
+ };
73
+ failUfoExperience('smart-link-rendered', id);
74
+ failUfoExperience('smart-link-authenticated', id);
75
+ dispatchAnalytics(uiRenderFailedEvent(appearance, error, errorInfo));
135
76
  }
136
- }]);
77
+ }, [appearance, dispatchAnalytics, id]);
137
78
 
138
- return CardWithURLRenderer;
139
- }(React.PureComponent);
79
+ if (!url) {
80
+ throw new Error('@atlaskit/smart-card: url property is missing.');
81
+ }
140
82
 
141
- _defineProperty(CardWithURLRenderer, "CardContent", null);
83
+ return /*#__PURE__*/React.createElement(ErrorBoundary, {
84
+ FallbackComponent: ErrorFallback,
85
+ onError: logError
86
+ }, /*#__PURE__*/React.createElement(Suspense, {
87
+ fallback: /*#__PURE__*/React.createElement(CardLinkView, {
88
+ key: 'chunk-placeholder',
89
+ link: url
90
+ })
91
+ }, /*#__PURE__*/React.createElement(LazyCardWithUrlContent, {
92
+ id: id,
93
+ url: url,
94
+ appearance: appearance,
95
+ onClick: onClick,
96
+ isSelected: isSelected,
97
+ isFrameVisible: isFrameVisible,
98
+ dispatchAnalytics: dispatchAnalytics,
99
+ container: container,
100
+ onResolve: onResolve,
101
+ testId: testId,
102
+ showActions: showActions,
103
+ inheritDimensions: inheritDimensions,
104
+ platform: platform,
105
+ embedIframeRef: embedIframeRef,
106
+ inlinePreloaderStyle: inlinePreloaderStyle
107
+ })));
108
+ }
109
+
110
+ var ErrorFallback = function ErrorFallback() {
111
+ return /*#__PURE__*/React.createElement("span", null);
112
+ };