@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.
- package/CHANGELOG.md +78 -0
- package/dist/cjs/client/index.js +30 -30
- package/dist/cjs/client/utils/environments.js +1 -1
- package/dist/cjs/extractors/block/index.js +4 -4
- package/dist/cjs/extractors/common/actions/extractPreviewAction.js +4 -3
- package/dist/cjs/in-product.js +43 -0
- package/dist/cjs/index.js +66 -4
- package/dist/cjs/providers/editor/index.js +113 -78
- package/dist/cjs/providers/editor/transformer.js +1 -1
- package/dist/cjs/state/actions/constants.js +1 -5
- package/dist/cjs/state/actions/helpers.js +1 -3
- package/dist/cjs/state/actions/index.js +16 -13
- package/dist/cjs/state/analytics/index.js +32 -84
- package/dist/cjs/state/analytics/ufoExperiences.js +60 -0
- package/dist/cjs/state/analytics/useSmartLinkAnalytics.js +106 -0
- package/dist/cjs/state/context/provider.js +3 -16
- package/dist/cjs/state/helpers.js +1 -2
- package/dist/cjs/state/hooks/useSmartLink.js +6 -6
- package/dist/cjs/state/reducers/index.js +3 -8
- package/dist/cjs/utils/analytics/analytics.js +31 -1
- package/dist/cjs/version.json +1 -1
- package/dist/cjs/view/BlockCard/index.js +3 -2
- package/dist/cjs/view/CardWithUrl/component-lazy/LazyFallback.js +6 -2
- package/dist/cjs/view/CardWithUrl/component-lazy/index.js +1 -1
- package/dist/cjs/view/CardWithUrl/component.js +10 -4
- package/dist/cjs/view/CardWithUrl/loader.js +110 -133
- package/dist/cjs/view/EmbedCard/{IframelyResizeMessageListener.js → EmbedResizeMessageListener.js} +11 -19
- package/dist/cjs/view/SmartLinkEvents/useSmartLinkEvents.js +21 -0
- package/dist/es2019/client/index.js +47 -43
- package/dist/es2019/client/utils/environments.js +1 -1
- package/dist/es2019/extractors/block/index.js +4 -4
- package/dist/es2019/extractors/common/actions/extractPreviewAction.js +4 -4
- package/dist/es2019/in-product.js +1 -0
- package/dist/es2019/index.js +7 -2
- package/dist/es2019/providers/editor/index.js +18 -6
- package/dist/es2019/providers/editor/transformer.js +1 -1
- package/dist/es2019/state/actions/constants.js +0 -2
- package/dist/es2019/state/actions/helpers.js +1 -3
- package/dist/es2019/state/actions/index.js +12 -11
- package/dist/es2019/state/analytics/index.js +2 -40
- package/dist/es2019/state/analytics/ufoExperiences.js +40 -0
- package/dist/es2019/state/analytics/useSmartLinkAnalytics.js +62 -0
- package/dist/es2019/state/context/provider.js +2 -8
- package/dist/es2019/state/helpers.js +1 -2
- package/dist/es2019/state/hooks/useSmartLink.js +4 -5
- package/dist/es2019/state/reducers/index.js +3 -8
- package/dist/es2019/utils/analytics/analytics.js +16 -0
- package/dist/es2019/version.json +1 -1
- package/dist/es2019/view/BlockCard/index.js +3 -2
- package/dist/es2019/view/CardWithUrl/component-lazy/LazyFallback.js +3 -1
- package/dist/es2019/view/CardWithUrl/component-lazy/index.js +1 -1
- package/dist/es2019/view/CardWithUrl/component.js +10 -4
- package/dist/es2019/view/CardWithUrl/loader.js +87 -89
- package/dist/es2019/view/EmbedCard/{IframelyResizeMessageListener.js → EmbedResizeMessageListener.js} +3 -10
- package/dist/es2019/view/SmartLinkEvents/useSmartLinkEvents.js +10 -0
- package/dist/esm/client/index.js +30 -31
- package/dist/esm/client/utils/environments.js +1 -1
- package/dist/esm/extractors/block/index.js +4 -4
- package/dist/esm/extractors/common/actions/extractPreviewAction.js +4 -3
- package/dist/esm/in-product.js +1 -0
- package/dist/esm/index.js +7 -2
- package/dist/esm/providers/editor/index.js +110 -78
- package/dist/esm/providers/editor/transformer.js +1 -1
- package/dist/esm/state/actions/constants.js +0 -2
- package/dist/esm/state/actions/helpers.js +1 -3
- package/dist/esm/state/actions/index.js +15 -13
- package/dist/esm/state/analytics/index.js +2 -80
- package/dist/esm/state/analytics/ufoExperiences.js +40 -0
- package/dist/esm/state/analytics/useSmartLinkAnalytics.js +94 -0
- package/dist/esm/state/context/provider.js +3 -15
- package/dist/esm/state/helpers.js +1 -2
- package/dist/esm/state/hooks/useSmartLink.js +6 -6
- package/dist/esm/state/reducers/index.js +3 -8
- package/dist/esm/utils/analytics/analytics.js +26 -0
- package/dist/esm/version.json +1 -1
- package/dist/esm/view/BlockCard/index.js +3 -2
- package/dist/esm/view/CardWithUrl/component-lazy/LazyFallback.js +3 -1
- package/dist/esm/view/CardWithUrl/component-lazy/index.js +1 -1
- package/dist/esm/view/CardWithUrl/component.js +10 -4
- package/dist/esm/view/CardWithUrl/loader.js +103 -127
- package/dist/esm/view/EmbedCard/{IframelyResizeMessageListener.js → EmbedResizeMessageListener.js} +9 -16
- package/dist/esm/view/SmartLinkEvents/useSmartLinkEvents.js +12 -0
- package/dist/types/__tests_external__/index.d.ts +6 -0
- package/dist/types/__tests_external__/page-objects/BaseCard.d.ts +18 -0
- package/dist/types/__tests_external__/page-objects/BlockCard.d.ts +6 -0
- package/dist/types/__tests_external__/page-objects/EmbedCard.d.ts +6 -0
- package/dist/types/__tests_external__/page-objects/InlineCard.d.ts +6 -0
- package/dist/types/__tests_external__/test-cases/card.d.ts +3 -0
- package/dist/types/__tests_external__/test-cases/embed.d.ts +3 -0
- package/dist/types/__tests_external__/test-cases/inline.d.ts +3 -0
- package/dist/types/__tests_external__/test-cases/types.d.ts +5 -0
- package/dist/types/client/index.d.ts +1 -0
- package/dist/types/extractors/block/index.d.ts +2 -2
- package/dist/types/extractors/common/__mocks__/jsonld.d.ts +61 -0
- package/dist/types/extractors/common/actions/extractPreviewAction.d.ts +1 -1
- package/dist/types/in-product.d.ts +1 -0
- package/dist/types/index.d.ts +5 -1
- package/dist/types/providers/editor/index.d.ts +3 -0
- package/dist/types/state/actions/constants.d.ts +0 -2
- package/dist/types/state/actions/types.d.ts +0 -2
- package/dist/types/state/analytics/index.d.ts +3 -32
- package/dist/types/state/analytics/ufoExperiences.d.ts +7 -0
- package/dist/types/state/analytics/useSmartLinkAnalytics.d.ts +30 -0
- package/dist/types/state/context/provider.d.ts +1 -1
- package/dist/types/state/context/types.d.ts +4 -2
- package/dist/types/state/hooks/useSmartLink.d.ts +4 -5
- package/dist/types/state/store/types.d.ts +2 -1
- package/dist/types/utils/analytics/analytics.d.ts +3 -0
- package/dist/types/utils/types.d.ts +1 -1
- package/dist/types/view/BlockCard/types.d.ts +2 -1
- package/dist/types/view/CardWithUrl/component-lazy/LazyFallback.d.ts +1 -0
- package/dist/types/view/CardWithUrl/component-lazy/index.d.ts +1 -1
- package/dist/types/view/CardWithUrl/loader.d.ts +1 -15
- package/dist/types/view/EmbedCard/{IframelyResizeMessageListener.d.ts → EmbedResizeMessageListener.d.ts} +1 -1
- package/dist/types/view/SmartLinkEvents/useSmartLinkEvents.d.ts +2 -0
- package/in-product/package.json +7 -0
- 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,
|
|
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 ||
|
|
105
|
-
_context.next =
|
|
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
|
|
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,
|
|
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
|
-
|
|
2
|
-
|
|
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:
|
|
38
|
+
config: {
|
|
51
39
|
authFlow: authFlow
|
|
52
|
-
}
|
|
40
|
+
},
|
|
53
41
|
extractors: {
|
|
54
42
|
getPreview: getPreview
|
|
55
43
|
}
|
|
56
44
|
};
|
|
57
|
-
}, [customClient,
|
|
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
|
-
|
|
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
|
|
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;
|
|
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 (
|
|
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);
|
package/dist/esm/version.json
CHANGED
|
@@ -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':
|