@atlaskit/smart-card 15.5.0 → 16.2.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 (117) hide show
  1. package/CHANGELOG.md +78 -0
  2. package/dist/cjs/client/index.js +30 -30
  3. package/dist/cjs/client/utils/environments.js +1 -1
  4. package/dist/cjs/extractors/block/index.js +4 -4
  5. package/dist/cjs/extractors/common/actions/extractPreviewAction.js +4 -3
  6. package/dist/cjs/in-product.js +43 -0
  7. package/dist/cjs/index.js +66 -4
  8. package/dist/cjs/providers/editor/index.js +113 -78
  9. package/dist/cjs/providers/editor/transformer.js +1 -1
  10. package/dist/cjs/state/actions/constants.js +1 -5
  11. package/dist/cjs/state/actions/helpers.js +1 -3
  12. package/dist/cjs/state/actions/index.js +16 -13
  13. package/dist/cjs/state/analytics/index.js +32 -84
  14. package/dist/cjs/state/analytics/ufoExperiences.js +60 -0
  15. package/dist/cjs/state/analytics/useSmartLinkAnalytics.js +106 -0
  16. package/dist/cjs/state/context/provider.js +3 -16
  17. package/dist/cjs/state/helpers.js +1 -2
  18. package/dist/cjs/state/hooks/useSmartLink.js +6 -6
  19. package/dist/cjs/state/reducers/index.js +3 -8
  20. package/dist/cjs/utils/analytics/analytics.js +31 -1
  21. package/dist/cjs/version.json +1 -1
  22. package/dist/cjs/view/BlockCard/index.js +3 -2
  23. package/dist/cjs/view/CardWithUrl/component-lazy/LazyFallback.js +6 -2
  24. package/dist/cjs/view/CardWithUrl/component-lazy/index.js +1 -1
  25. package/dist/cjs/view/CardWithUrl/component.js +10 -4
  26. package/dist/cjs/view/CardWithUrl/loader.js +110 -133
  27. package/dist/cjs/view/EmbedCard/{IframelyResizeMessageListener.js → EmbedResizeMessageListener.js} +11 -19
  28. package/dist/cjs/view/SmartLinkEvents/useSmartLinkEvents.js +21 -0
  29. package/dist/es2019/client/index.js +47 -43
  30. package/dist/es2019/client/utils/environments.js +1 -1
  31. package/dist/es2019/extractors/block/index.js +4 -4
  32. package/dist/es2019/extractors/common/actions/extractPreviewAction.js +4 -4
  33. package/dist/es2019/in-product.js +1 -0
  34. package/dist/es2019/index.js +7 -2
  35. package/dist/es2019/providers/editor/index.js +18 -6
  36. package/dist/es2019/providers/editor/transformer.js +1 -1
  37. package/dist/es2019/state/actions/constants.js +0 -2
  38. package/dist/es2019/state/actions/helpers.js +1 -3
  39. package/dist/es2019/state/actions/index.js +12 -11
  40. package/dist/es2019/state/analytics/index.js +2 -40
  41. package/dist/es2019/state/analytics/ufoExperiences.js +40 -0
  42. package/dist/es2019/state/analytics/useSmartLinkAnalytics.js +62 -0
  43. package/dist/es2019/state/context/provider.js +2 -8
  44. package/dist/es2019/state/helpers.js +1 -2
  45. package/dist/es2019/state/hooks/useSmartLink.js +4 -5
  46. package/dist/es2019/state/reducers/index.js +3 -8
  47. package/dist/es2019/utils/analytics/analytics.js +16 -0
  48. package/dist/es2019/version.json +1 -1
  49. package/dist/es2019/view/BlockCard/index.js +3 -2
  50. package/dist/es2019/view/CardWithUrl/component-lazy/LazyFallback.js +3 -1
  51. package/dist/es2019/view/CardWithUrl/component-lazy/index.js +1 -1
  52. package/dist/es2019/view/CardWithUrl/component.js +10 -4
  53. package/dist/es2019/view/CardWithUrl/loader.js +87 -89
  54. package/dist/es2019/view/EmbedCard/{IframelyResizeMessageListener.js → EmbedResizeMessageListener.js} +3 -10
  55. package/dist/es2019/view/SmartLinkEvents/useSmartLinkEvents.js +10 -0
  56. package/dist/esm/client/index.js +30 -31
  57. package/dist/esm/client/utils/environments.js +1 -1
  58. package/dist/esm/extractors/block/index.js +4 -4
  59. package/dist/esm/extractors/common/actions/extractPreviewAction.js +4 -3
  60. package/dist/esm/in-product.js +1 -0
  61. package/dist/esm/index.js +7 -2
  62. package/dist/esm/providers/editor/index.js +110 -78
  63. package/dist/esm/providers/editor/transformer.js +1 -1
  64. package/dist/esm/state/actions/constants.js +0 -2
  65. package/dist/esm/state/actions/helpers.js +1 -3
  66. package/dist/esm/state/actions/index.js +15 -13
  67. package/dist/esm/state/analytics/index.js +2 -80
  68. package/dist/esm/state/analytics/ufoExperiences.js +40 -0
  69. package/dist/esm/state/analytics/useSmartLinkAnalytics.js +94 -0
  70. package/dist/esm/state/context/provider.js +3 -15
  71. package/dist/esm/state/helpers.js +1 -2
  72. package/dist/esm/state/hooks/useSmartLink.js +6 -6
  73. package/dist/esm/state/reducers/index.js +3 -8
  74. package/dist/esm/utils/analytics/analytics.js +26 -0
  75. package/dist/esm/version.json +1 -1
  76. package/dist/esm/view/BlockCard/index.js +3 -2
  77. package/dist/esm/view/CardWithUrl/component-lazy/LazyFallback.js +3 -1
  78. package/dist/esm/view/CardWithUrl/component-lazy/index.js +1 -1
  79. package/dist/esm/view/CardWithUrl/component.js +10 -4
  80. package/dist/esm/view/CardWithUrl/loader.js +103 -127
  81. package/dist/esm/view/EmbedCard/{IframelyResizeMessageListener.js → EmbedResizeMessageListener.js} +9 -16
  82. package/dist/esm/view/SmartLinkEvents/useSmartLinkEvents.js +12 -0
  83. package/dist/types/__tests_external__/index.d.ts +6 -0
  84. package/dist/types/__tests_external__/page-objects/BaseCard.d.ts +18 -0
  85. package/dist/types/__tests_external__/page-objects/BlockCard.d.ts +6 -0
  86. package/dist/types/__tests_external__/page-objects/EmbedCard.d.ts +6 -0
  87. package/dist/types/__tests_external__/page-objects/InlineCard.d.ts +6 -0
  88. package/dist/types/__tests_external__/test-cases/card.d.ts +3 -0
  89. package/dist/types/__tests_external__/test-cases/embed.d.ts +3 -0
  90. package/dist/types/__tests_external__/test-cases/inline.d.ts +3 -0
  91. package/dist/types/__tests_external__/test-cases/types.d.ts +5 -0
  92. package/dist/types/client/index.d.ts +1 -0
  93. package/dist/types/extractors/block/index.d.ts +2 -2
  94. package/dist/types/extractors/common/__mocks__/jsonld.d.ts +61 -0
  95. package/dist/types/extractors/common/actions/extractPreviewAction.d.ts +1 -1
  96. package/dist/types/in-product.d.ts +1 -0
  97. package/dist/types/index.d.ts +5 -1
  98. package/dist/types/providers/editor/index.d.ts +3 -0
  99. package/dist/types/state/actions/constants.d.ts +0 -2
  100. package/dist/types/state/actions/types.d.ts +0 -2
  101. package/dist/types/state/analytics/index.d.ts +3 -32
  102. package/dist/types/state/analytics/ufoExperiences.d.ts +7 -0
  103. package/dist/types/state/analytics/useSmartLinkAnalytics.d.ts +30 -0
  104. package/dist/types/state/context/provider.d.ts +1 -1
  105. package/dist/types/state/context/types.d.ts +4 -2
  106. package/dist/types/state/hooks/useSmartLink.d.ts +4 -5
  107. package/dist/types/state/store/types.d.ts +2 -1
  108. package/dist/types/utils/analytics/analytics.d.ts +3 -0
  109. package/dist/types/utils/types.d.ts +1 -1
  110. package/dist/types/view/BlockCard/types.d.ts +2 -1
  111. package/dist/types/view/CardWithUrl/component-lazy/LazyFallback.d.ts +1 -0
  112. package/dist/types/view/CardWithUrl/component-lazy/index.d.ts +1 -1
  113. package/dist/types/view/CardWithUrl/loader.d.ts +1 -15
  114. package/dist/types/view/EmbedCard/{IframelyResizeMessageListener.d.ts → EmbedResizeMessageListener.d.ts} +1 -1
  115. package/dist/types/view/SmartLinkEvents/useSmartLinkEvents.d.ts +2 -0
  116. package/in-product/package.json +7 -0
  117. package/package.json +25 -20
@@ -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,
@@ -20,16 +21,13 @@ export var useSmartCardActions = function useSmartCardActions(id, url, analytics
20
21
 
21
22
  var _ref = getState()[url] || {
22
23
  status: 'pending',
23
- lastUpdatedAt: Date.now(),
24
24
  details: undefined
25
25
  },
26
26
  details = _ref.details,
27
- lastUpdatedAt = _ref.lastUpdatedAt,
28
27
  status = _ref.status;
29
28
 
30
29
  var hasAuthFlowSupported = config.authFlow !== 'disabled';
31
30
  var hasData = !!(details && details.data);
32
- var hasExpired = Date.now() - lastUpdatedAt >= config.maxAge;
33
31
  var handleResolvedLinkError = useCallback(function (url, error) {
34
32
  if (error.kind === 'fatal') {
35
33
  // If there's no previous data in the store for this URL, then bail
@@ -86,10 +84,9 @@ export var useSmartCardActions = function useSmartCardActions(id, url, analytics
86
84
 
87
85
 
88
86
  dispatch(cardAction(ACTION_RESOLVED, {
89
- url: resourceUrl,
90
- hasExpired: hasExpired && !hasData
87
+ url: resourceUrl
91
88
  }, response));
92
- }, [dispatch, handleResolvedLinkError, hasData, hasExpired, hasAuthFlowSupported]);
89
+ }, [dispatch, handleResolvedLinkError, hasAuthFlowSupported]);
93
90
  var resolve = useCallback( /*#__PURE__*/_asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
94
91
  var resourceUrl,
95
92
  isReloading,
@@ -101,8 +98,8 @@ export var useSmartCardActions = function useSmartCardActions(id, url, analytics
101
98
  resourceUrl = _args.length > 0 && _args[0] !== undefined ? _args[0] : url;
102
99
  isReloading = _args.length > 1 && _args[1] !== undefined ? _args[1] : false;
103
100
 
104
- if (!(isReloading || hasExpired || !hasData)) {
105
- _context.next = 4;
101
+ if (!(isReloading || !hasData)) {
102
+ _context.next = 6;
106
103
  break;
107
104
  }
108
105
 
@@ -112,13 +109,18 @@ export var useSmartCardActions = function useSmartCardActions(id, url, analytics
112
109
  return handleResolvedLinkError(resourceUrl, error);
113
110
  }));
114
111
 
115
- case 4:
112
+ case 6:
113
+ addMetadataToExperience('smart-link-rendered', id, {
114
+ cached: true
115
+ });
116
+
117
+ case 7:
116
118
  case "end":
117
119
  return _context.stop();
118
120
  }
119
121
  }
120
122
  }, _callee);
121
- })), [url, hasData, hasExpired, connections.client, handleResolvedLinkResponse, handleResolvedLinkError]);
123
+ })), [url, hasData, connections.client, handleResolvedLinkResponse, handleResolvedLinkError, id]);
122
124
  var register = useCallback(function () {
123
125
  if (!details) {
124
126
  dispatch(cardAction(ACTION_PENDING, {
@@ -156,10 +158,10 @@ export var useSmartCardActions = function useSmartCardActions(id, url, analytics
156
158
  analytics.screen.authPopupEvent(definitionId, extensionKey);
157
159
  auth(services[0].url).then(function () {
158
160
  analytics.track.appAccountConnected(definitionId, extensionKey);
159
- analytics.operational.connectSucceededEvent(definitionId, extensionKey);
161
+ analytics.operational.connectSucceededEvent(id, definitionId, extensionKey);
160
162
  reload();
161
163
  }, function (err) {
162
- analytics.operational.connectFailedEvent(definitionId, extensionKey, err.type);
164
+ analytics.operational.connectFailedEvent(id, definitionId, extensionKey, err.type);
163
165
 
164
166
  if (err.type === 'auth_window_closed') {
165
167
  analytics.ui.closedAuthEvent(appearance, definitionId, extensionKey);
@@ -168,7 +170,7 @@ export var useSmartCardActions = function useSmartCardActions(id, url, analytics
168
170
  reload();
169
171
  });
170
172
  }
171
- }, [analytics.ui, analytics.screen, analytics.track, analytics.operational, reload, details, status]);
173
+ }, [analytics.ui, analytics.screen, analytics.track, analytics.operational, id, reload, details, status]);
172
174
  var invoke = useCallback( /*#__PURE__*/function () {
173
175
  var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(opts, appearance) {
174
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
+ };
@@ -1,22 +1,14 @@
1
- import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
-
3
- function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
4
-
5
- function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i] != null ? arguments[i] : {}; if (i % 2) { ownKeys(Object(source), true).forEach(function (key) { _defineProperty(target, key, source[key]); }); } else if (Object.getOwnPropertyDescriptors) { Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)); } else { ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } } return target; }
6
-
7
1
  import React from 'react';
8
2
  import { useContext, useMemo } from 'react';
9
3
  import { createStore } from 'redux';
10
4
  import { cardReducer } from '../reducers';
11
5
  import { SmartCardContext } from '.';
12
- import { MAX_RELOAD_DELAY, MAX_LOADING_DELAY } from '../actions/constants';
13
6
  import CardClient from '../../client';
14
7
  import { extractPreview } from '../../extractors/common/preview';
15
8
  import { getUrl } from '../helpers';
16
9
  export function SmartCardProvider(_ref) {
17
10
  var storeOptions = _ref.storeOptions,
18
11
  customClient = _ref.client,
19
- customCacheOptions = _ref.cacheOptions,
20
12
  customAuthFlow = _ref.authFlow,
21
13
  children = _ref.children,
22
14
  renderers = _ref.renderers;
@@ -30,10 +22,6 @@ export function SmartCardProvider(_ref) {
30
22
  var client = customClient || new CardClient();
31
23
  var store = createStore(cardReducer, initialState);
32
24
  var authFlow = customAuthFlow || 'oauth2';
33
- var cacheOptions = customCacheOptions || {
34
- maxAge: MAX_RELOAD_DELAY,
35
- maxLoadingDelay: MAX_LOADING_DELAY
36
- };
37
25
 
38
26
  var getPreview = function getPreview(url, platform) {
39
27
  var cardState = getUrl(store, url);
@@ -47,14 +35,14 @@ export function SmartCardProvider(_ref) {
47
35
  connections: {
48
36
  client: client
49
37
  },
50
- config: _objectSpread(_objectSpread({}, cacheOptions), {}, {
38
+ config: {
51
39
  authFlow: authFlow
52
- }),
40
+ },
53
41
  extractors: {
54
42
  getPreview: getPreview
55
43
  }
56
44
  };
57
- }, [customClient, customCacheOptions, customAuthFlow, storeOptions, renderers]);
45
+ }, [customClient, customAuthFlow, storeOptions, renderers]);
58
46
  return /*#__PURE__*/React.createElement(SmartCardContext.Provider, {
59
47
  value: parentContext || providerValue
60
48
  }, children);
@@ -8,8 +8,7 @@ export var getByDefinitionId = function getByDefinitionId(definitionId, store) {
8
8
  };
9
9
  export var getUrl = function getUrl(store, url) {
10
10
  return store.getState()[url] || {
11
- status: 'pending',
12
- lastUpdatedAt: Date.now()
11
+ status: 'pending'
13
12
  };
14
13
  };
15
14
  export var getClickUrl = function getClickUrl(url, jsonLd) {
@@ -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
  }
@@ -11,8 +11,7 @@ import { getStatus } from '../helpers';
11
11
  var cardReducerMap = (_cardReducerMap = {}, _defineProperty(_cardReducerMap, actions.ACTION_PENDING, function (_state, _ref) {
12
12
  var type = _ref.type;
13
13
  return {
14
- status: type,
15
- lastUpdatedAt: Date.now()
14
+ status: type
16
15
  };
17
16
  }), _defineProperty(_cardReducerMap, actions.ACTION_RESOLVING, function (state, _ref2) {
18
17
  var type = _ref2.type;
@@ -35,7 +34,6 @@ var cardReducerMap = (_cardReducerMap = {}, _defineProperty(_cardReducerMap, act
35
34
  nextState.status = type;
36
35
  }
37
36
 
38
- nextState.lastUpdatedAt = Date.now();
39
37
  return nextState;
40
38
  }), _defineProperty(_cardReducerMap, actions.ACTION_ERROR, function (state, _ref4) {
41
39
  var type = _ref4.type,
@@ -57,12 +55,9 @@ export var cardReducer = function cardReducer(state, action) {
57
55
  var cardState = state[action.url]; // Card may have reached the same state on account of multiple of the same
58
56
  // URL being present in an editor session. E.g. page with N links to one resource.
59
57
 
60
- var hasSameStatus = cardState && cardState.status === action.type; // Card needs to be refreshed. In this case, we ignore the same status pragma which
61
- // is described above - this forces a rerender for all links of the same status.
62
-
63
- var hasExpired = action.hasExpired;
58
+ var hasSameStatus = cardState && cardState.status === action.type;
64
59
 
65
- if (!hasExpired && hasSameStatus) {
60
+ if (hasSameStatus) {
66
61
  return state;
67
62
  } else {
68
63
  var nextState = cardReducerMap[action.type](cardState, action);
@@ -1,4 +1,6 @@
1
1
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
+ import _classCallCheck from "@babel/runtime/helpers/classCallCheck";
3
+ import _createClass from "@babel/runtime/helpers/createClass";
2
4
 
3
5
  function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); if (enumerableOnly) { symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; }); } keys.push.apply(keys, symbols); } return keys; }
4
6
 
@@ -12,6 +14,30 @@ export var context = {
12
14
  packageName: packageName,
13
15
  packageVersion: packageVersion
14
16
  };
17
+ export var SmartLinkEvents = /*#__PURE__*/function () {
18
+ function SmartLinkEvents() {
19
+ _classCallCheck(this, SmartLinkEvents);
20
+ }
21
+
22
+ _createClass(SmartLinkEvents, [{
23
+ key: "insertSmartLink",
24
+ value: function insertSmartLink(url, type, createAnalyticsEvent) {
25
+ fireSmartLinkEvent({
26
+ action: 'inserted',
27
+ actionSubject: 'smartLink',
28
+ eventType: 'track',
29
+ attributes: {
30
+ type: type
31
+ },
32
+ nonPrivacySafeAttributes: {
33
+ domainName: url
34
+ }
35
+ }, createAnalyticsEvent);
36
+ }
37
+ }]);
38
+
39
+ return SmartLinkEvents;
40
+ }();
15
41
  export var fireSmartLinkEvent = function fireSmartLinkEvent(payload, createAnalyticsEvent) {
16
42
  if (createAnalyticsEvent) {
17
43
  createAnalyticsEvent(payload).fire(ANALYTICS_CHANNEL);
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/smart-card",
3
- "version": "15.5.0",
3
+ "version": "16.2.0",
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({
@@ -1,5 +1,6 @@
1
1
  import React from 'react';
2
2
  import { CardLinkView } from '@atlaskit/media-ui';
3
+ export var loadingPlaceholderClassName = 'smart-link-loading-placeholder';
3
4
  export var LoadingCardLink = function LoadingCardLink(_ref) {
4
5
  var isSelected = _ref.isSelected,
5
6
  url = _ref.url;
@@ -8,6 +9,7 @@ export var LoadingCardLink = function LoadingCardLink(_ref) {
8
9
  testId: 'lazy-render-placeholder',
9
10
  "data-trello-do-not-use-override": "lazy-render-placeholder-trello",
10
11
  isSelected: isSelected,
11
- link: url
12
+ link: url,
13
+ className: loadingPlaceholderClassName
12
14
  });
13
15
  };
@@ -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':