@atlaskit/smart-card 18.0.20 → 19.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.
- package/CHANGELOG.md +49 -0
- package/dist/cjs/client/index.js +6 -379
- package/dist/cjs/extractors/embed/index.js +2 -2
- package/dist/cjs/extractors/hover/extractMetadata.js +31 -0
- package/dist/cjs/index.js +7 -13
- package/dist/cjs/state/actions/constants.js +1 -13
- package/dist/cjs/state/actions/index.js +20 -22
- package/dist/cjs/state/analytics/useSmartLinkAnalytics.js +2 -2
- package/dist/cjs/state/config/index.js +2 -2
- package/dist/cjs/state/helpers.js +1 -9
- package/dist/cjs/state/hooks/usePrefetch.js +2 -2
- package/dist/cjs/state/index.js +4 -4
- package/dist/cjs/state/renderers/index.js +2 -2
- package/dist/cjs/state/store/index.js +5 -5
- package/dist/cjs/utils/flexible.js +1 -1
- package/dist/cjs/utils/mocks.js +2 -2
- package/dist/cjs/utils/test-utils.js +2 -2
- package/dist/cjs/version.json +1 -1
- package/dist/cjs/view/HoverCard/index.js +11 -2
- package/dist/cjs/view/HoverCard/utils.js +36 -0
- package/dist/es2019/client/index.js +1 -214
- package/dist/es2019/extractors/embed/index.js +1 -1
- package/dist/es2019/extractors/hover/extractMetadata.js +18 -0
- package/dist/es2019/index.js +4 -4
- package/dist/es2019/state/actions/constants.js +0 -6
- package/dist/es2019/state/actions/index.js +4 -4
- package/dist/es2019/state/analytics/useSmartLinkAnalytics.js +1 -1
- package/dist/es2019/state/config/index.js +1 -1
- package/dist/es2019/state/helpers.js +0 -5
- package/dist/es2019/state/hooks/usePrefetch.js +1 -1
- package/dist/es2019/state/index.js +1 -1
- package/dist/es2019/state/renderers/index.js +1 -1
- package/dist/es2019/state/store/index.js +2 -2
- package/dist/es2019/utils/flexible.js +1 -1
- package/dist/es2019/utils/mocks.js +1 -1
- package/dist/es2019/utils/test-utils.js +1 -1
- package/dist/es2019/version.json +1 -1
- package/dist/es2019/view/HoverCard/index.js +27 -18
- package/dist/es2019/view/HoverCard/utils.js +27 -0
- package/dist/esm/client/index.js +1 -360
- package/dist/esm/extractors/embed/index.js +1 -1
- package/dist/esm/extractors/hover/extractMetadata.js +22 -0
- package/dist/esm/index.js +4 -4
- package/dist/esm/state/actions/constants.js +0 -6
- package/dist/esm/state/actions/index.js +4 -4
- package/dist/esm/state/analytics/useSmartLinkAnalytics.js +1 -1
- package/dist/esm/state/config/index.js +1 -1
- package/dist/esm/state/helpers.js +0 -5
- package/dist/esm/state/hooks/usePrefetch.js +1 -1
- package/dist/esm/state/index.js +1 -1
- package/dist/esm/state/renderers/index.js +1 -1
- package/dist/esm/state/store/index.js +2 -2
- package/dist/esm/utils/flexible.js +1 -1
- package/dist/esm/utils/mocks.js +1 -1
- package/dist/esm/utils/test-utils.js +1 -1
- package/dist/esm/version.json +1 -1
- package/dist/esm/view/HoverCard/index.js +10 -3
- package/dist/esm/view/HoverCard/utils.js +27 -0
- package/dist/types/__tests_external__/page-objects/BaseCard.d.ts +1 -2
- package/dist/types/client/index.d.ts +1 -18
- package/dist/types/extractors/block/index.d.ts +1 -1
- package/dist/types/extractors/common/title-prefix/extractTitlePrefix.d.ts +1 -1
- package/dist/types/extractors/flexible/icon/extract-icon-renderer.d.ts +1 -1
- package/dist/types/extractors/flexible/icon/index.d.ts +1 -1
- package/dist/types/extractors/flexible/index.d.ts +1 -1
- package/dist/types/extractors/hover/extractMetadata.d.ts +3 -0
- package/dist/types/extractors/inline/index.d.ts +1 -1
- package/dist/types/index.d.ts +6 -6
- package/dist/types/model/invoke-opts.d.ts +1 -14
- package/dist/types/state/actions/constants.d.ts +0 -6
- package/dist/types/state/actions/types.d.ts +2 -13
- package/dist/types/state/analytics/useSmartLinkAnalytics.d.ts +1 -2
- package/dist/types/state/config/index.d.ts +1 -1
- package/dist/types/state/helpers.d.ts +1 -3
- package/dist/types/state/hooks/useSmartLink.d.ts +6 -6
- package/dist/types/state/index.d.ts +3 -3
- package/dist/types/state/reducers/types.d.ts +1 -1
- package/dist/types/state/renderers/index.d.ts +1 -1
- package/dist/types/state/store/index.d.ts +2 -2
- package/dist/types/state/types.d.ts +1 -1
- package/dist/types/types.d.ts +2 -2
- package/dist/types/utils/analytics/analytics.d.ts +1 -1
- package/dist/types/utils/analytics/index.d.ts +1 -2
- package/dist/types/utils/performance.d.ts +1 -1
- package/dist/types/view/BlockCard/types.d.ts +1 -1
- package/dist/types/view/Card/types.d.ts +2 -3
- package/dist/types/view/FlexibleCard/types.d.ts +2 -2
- package/dist/types/view/FlexibleCard/utils.d.ts +1 -1
- package/dist/types/view/HoverCard/types.d.ts +5 -0
- package/dist/types/view/HoverCard/utils.d.ts +2 -0
- package/dist/types/view/InlineCard/types.d.ts +1 -1
- package/package.json +3 -9
- package/dist/cjs/client/api.js +0 -119
- package/dist/cjs/client/errors.js +0 -55
- package/dist/cjs/client/types/index.js +0 -5
- package/dist/cjs/client/types/requests.js +0 -5
- package/dist/cjs/client/types/responses.js +0 -31
- package/dist/cjs/client/utils/environments.js +0 -47
- package/dist/cjs/providers/editor/index.js +0 -283
- package/dist/cjs/providers/editor/transformer.js +0 -90
- package/dist/cjs/providers/editor/types.js +0 -5
- package/dist/cjs/state/actions/helpers.js +0 -18
- package/dist/cjs/state/context/index.js +0 -34
- package/dist/cjs/state/context/provider.js +0 -74
- package/dist/cjs/state/context/types.js +0 -5
- package/dist/cjs/state/reducers/index.js +0 -89
- package/dist/cjs/state/store/types.js +0 -5
- package/dist/es2019/client/api.js +0 -38
- package/dist/es2019/client/errors.js +0 -19
- package/dist/es2019/client/types/index.js +0 -1
- package/dist/es2019/client/types/requests.js +0 -1
- package/dist/es2019/client/types/responses.js +0 -19
- package/dist/es2019/client/utils/environments.js +0 -33
- package/dist/es2019/providers/editor/index.js +0 -82
- package/dist/es2019/providers/editor/transformer.js +0 -57
- package/dist/es2019/providers/editor/types.js +0 -1
- package/dist/es2019/state/actions/helpers.js +0 -8
- package/dist/es2019/state/context/index.js +0 -14
- package/dist/es2019/state/context/provider.js +0 -51
- package/dist/es2019/state/context/types.js +0 -1
- package/dist/es2019/state/reducers/index.js +0 -74
- package/dist/es2019/state/store/types.js +0 -1
- package/dist/esm/client/api.js +0 -98
- package/dist/esm/client/errors.js +0 -40
- package/dist/esm/client/types/index.js +0 -1
- package/dist/esm/client/types/requests.js +0 -1
- package/dist/esm/client/types/responses.js +0 -19
- package/dist/esm/client/utils/environments.js +0 -33
- package/dist/esm/providers/editor/index.js +0 -257
- package/dist/esm/providers/editor/transformer.js +0 -79
- package/dist/esm/providers/editor/types.js +0 -1
- package/dist/esm/state/actions/helpers.js +0 -9
- package/dist/esm/state/context/index.js +0 -14
- package/dist/esm/state/context/provider.js +0 -50
- package/dist/esm/state/context/types.js +0 -1
- package/dist/esm/state/reducers/index.js +0 -69
- package/dist/esm/state/store/types.js +0 -1
- package/dist/types/client/api.d.ts +0 -5
- package/dist/types/client/errors.d.ts +0 -9
- package/dist/types/client/types/index.d.ts +0 -13
- package/dist/types/client/types/requests.d.ts +0 -9
- package/dist/types/client/types/responses.d.ts +0 -19
- package/dist/types/client/utils/environments.d.ts +0 -12
- package/dist/types/providers/editor/index.d.ts +0 -22
- package/dist/types/providers/editor/transformer.d.ts +0 -8
- package/dist/types/providers/editor/types.d.ts +0 -19
- package/dist/types/state/actions/helpers.d.ts +0 -2
- package/dist/types/state/context/index.d.ts +0 -8
- package/dist/types/state/context/provider.d.ts +0 -5
- package/dist/types/state/context/types.d.ts +0 -39
- package/dist/types/state/reducers/index.d.ts +0 -4
- package/dist/types/state/store/types.d.ts +0 -18
|
@@ -17,18 +17,16 @@ var _react = require("react");
|
|
|
17
17
|
|
|
18
18
|
var _outboundAuthFlowClient = require("@atlaskit/outbound-auth-flow-client");
|
|
19
19
|
|
|
20
|
-
var
|
|
20
|
+
var _linkingCommon = require("@atlaskit/linking-common");
|
|
21
21
|
|
|
22
|
-
var
|
|
22
|
+
var _linkProvider = require("@atlaskit/link-provider");
|
|
23
23
|
|
|
24
|
-
var
|
|
24
|
+
var _helpers = require("../helpers");
|
|
25
25
|
|
|
26
|
-
var
|
|
26
|
+
var _constants = require("./constants");
|
|
27
27
|
|
|
28
28
|
var measure = _interopRequireWildcard(require("../../utils/performance"));
|
|
29
29
|
|
|
30
|
-
var _errors = require("../../client/errors");
|
|
31
|
-
|
|
32
30
|
var _jsonld = require("../../utils/jsonld");
|
|
33
31
|
|
|
34
32
|
var _analytics = require("../analytics");
|
|
@@ -38,7 +36,7 @@ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "functio
|
|
|
38
36
|
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
39
37
|
|
|
40
38
|
var useSmartCardActions = function useSmartCardActions(id, url, analytics) {
|
|
41
|
-
var _useSmartLinkContext = (0,
|
|
39
|
+
var _useSmartLinkContext = (0, _linkProvider.useSmartLinkContext)(),
|
|
42
40
|
store = _useSmartLinkContext.store,
|
|
43
41
|
connections = _useSmartLinkContext.connections,
|
|
44
42
|
config = _useSmartLinkContext.config;
|
|
@@ -60,7 +58,7 @@ var useSmartCardActions = function useSmartCardActions(id, url, analytics) {
|
|
|
60
58
|
// If there's no previous data in the store for this URL, then bail
|
|
61
59
|
// out and let the editor handle fallbacks (returns to a blue link).
|
|
62
60
|
if (!hasData && status !== 'resolved') {
|
|
63
|
-
dispatch((0,
|
|
61
|
+
dispatch((0, _linkingCommon.cardAction)(_linkingCommon.ACTION_ERROR, {
|
|
64
62
|
url: url
|
|
65
63
|
}, details, error));
|
|
66
64
|
throw error;
|
|
@@ -69,25 +67,25 @@ var useSmartCardActions = function useSmartCardActions(id, url, analytics) {
|
|
|
69
67
|
|
|
70
68
|
|
|
71
69
|
if (hasData) {
|
|
72
|
-
dispatch((0,
|
|
70
|
+
dispatch((0, _linkingCommon.cardAction)(_linkingCommon.ACTION_RESOLVED, {
|
|
73
71
|
url: url
|
|
74
72
|
}, details));
|
|
75
73
|
} // Handle AuthErrors (user did not have access to resource) -
|
|
76
74
|
// Missing AAID in ASAP claims, or missing UserContext, or 403 from downstream
|
|
77
75
|
|
|
78
76
|
} else if (error.kind === 'auth') {
|
|
79
|
-
dispatch((0,
|
|
77
|
+
dispatch((0, _linkingCommon.cardAction)(_linkingCommon.ACTION_RESOLVED, {
|
|
80
78
|
url: url
|
|
81
79
|
}, (0, _jsonld.getUnauthorizedJsonLd)()));
|
|
82
80
|
} else {
|
|
83
81
|
if (error.kind === 'fallback') {
|
|
84
82
|
// Fallback to blue link with smart link formatting. Not part of reliability.
|
|
85
|
-
dispatch((0,
|
|
83
|
+
dispatch((0, _linkingCommon.cardAction)(_linkingCommon.ACTION_ERROR_FALLBACK, {
|
|
86
84
|
url: url
|
|
87
85
|
}, undefined, error));
|
|
88
86
|
} else {
|
|
89
87
|
// Fallback to blue link with smart link formatting. Part of reliability.
|
|
90
|
-
dispatch((0,
|
|
88
|
+
dispatch((0, _linkingCommon.cardAction)(_linkingCommon.ACTION_ERROR, {
|
|
91
89
|
url: url
|
|
92
90
|
}, undefined, error));
|
|
93
91
|
}
|
|
@@ -95,22 +93,22 @@ var useSmartCardActions = function useSmartCardActions(id, url, analytics) {
|
|
|
95
93
|
}, [hasData, status, dispatch, details]);
|
|
96
94
|
var handleResolvedLinkResponse = (0, _react.useCallback)(function (resourceUrl, response) {
|
|
97
95
|
var hostname = new URL(resourceUrl).hostname;
|
|
98
|
-
var nextStatus = response ? (0,
|
|
96
|
+
var nextStatus = response ? (0, _helpers.getStatus)(response) : 'fatal'; // If we require authorization & do not have an authFlow available,
|
|
99
97
|
// throw an error and render as a normal blue link.
|
|
100
98
|
|
|
101
99
|
if ((nextStatus === 'unauthorized' || nextStatus === 'forbidden') && !hasAuthFlowSupported) {
|
|
102
|
-
handleResolvedLinkError(resourceUrl, new
|
|
100
|
+
handleResolvedLinkError(resourceUrl, new _linkingCommon.APIError('fallback', hostname, _constants.ERROR_MESSAGE_OAUTH));
|
|
103
101
|
return;
|
|
104
102
|
} // Handle any other errors
|
|
105
103
|
|
|
106
104
|
|
|
107
105
|
if (nextStatus === 'fatal') {
|
|
108
|
-
handleResolvedLinkError(resourceUrl, new
|
|
106
|
+
handleResolvedLinkError(resourceUrl, new _linkingCommon.APIError('fatal', hostname, _constants.ERROR_MESSAGE_FATAL));
|
|
109
107
|
return;
|
|
110
108
|
} // Dispatch Analytics and resolved card action - including unauthorized states.
|
|
111
109
|
|
|
112
110
|
|
|
113
|
-
dispatch((0,
|
|
111
|
+
dispatch((0, _linkingCommon.cardAction)(_linkingCommon.ACTION_RESOLVED, {
|
|
114
112
|
url: resourceUrl
|
|
115
113
|
}, response));
|
|
116
114
|
}, [dispatch, handleResolvedLinkError, hasAuthFlowSupported]);
|
|
@@ -150,7 +148,7 @@ var useSmartCardActions = function useSmartCardActions(id, url, analytics) {
|
|
|
150
148
|
})), [url, hasData, connections.client, handleResolvedLinkResponse, handleResolvedLinkError, id]);
|
|
151
149
|
var register = (0, _react.useCallback)(function () {
|
|
152
150
|
if (!details) {
|
|
153
|
-
dispatch((0,
|
|
151
|
+
dispatch((0, _linkingCommon.cardAction)(_linkingCommon.ACTION_PENDING, {
|
|
154
152
|
url: url
|
|
155
153
|
}));
|
|
156
154
|
}
|
|
@@ -158,10 +156,10 @@ var useSmartCardActions = function useSmartCardActions(id, url, analytics) {
|
|
|
158
156
|
return resolve();
|
|
159
157
|
}, [url, resolve, details, dispatch]);
|
|
160
158
|
var reload = (0, _react.useCallback)(function () {
|
|
161
|
-
var definitionId = (0,
|
|
159
|
+
var definitionId = (0, _helpers.getDefinitionId)(details);
|
|
162
160
|
|
|
163
161
|
if (definitionId) {
|
|
164
|
-
(0,
|
|
162
|
+
(0, _helpers.getByDefinitionId)(definitionId, getState()).map(function (url) {
|
|
165
163
|
return resolve(url, true);
|
|
166
164
|
});
|
|
167
165
|
} else {
|
|
@@ -169,9 +167,9 @@ var useSmartCardActions = function useSmartCardActions(id, url, analytics) {
|
|
|
169
167
|
}
|
|
170
168
|
}, [url, details, getState, resolve]);
|
|
171
169
|
var authorize = (0, _react.useCallback)(function (appearance) {
|
|
172
|
-
var definitionId = (0,
|
|
173
|
-
var extensionKey = (0,
|
|
174
|
-
var services = (0,
|
|
170
|
+
var definitionId = (0, _helpers.getDefinitionId)(details);
|
|
171
|
+
var extensionKey = (0, _helpers.getExtensionKey)(details);
|
|
172
|
+
var services = (0, _helpers.getServices)(details); // When authentication is triggered, let GAS know!
|
|
175
173
|
|
|
176
174
|
if (status === 'unauthorized') {
|
|
177
175
|
analytics.ui.authEvent(appearance, definitionId, extensionKey);
|
|
@@ -5,10 +5,10 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.useSmartLinkAnalytics = void 0;
|
|
7
7
|
|
|
8
|
-
var _analytics = require("../../utils/analytics");
|
|
9
|
-
|
|
10
8
|
var _react = require("react");
|
|
11
9
|
|
|
10
|
+
var _analytics = require("../../utils/analytics");
|
|
11
|
+
|
|
12
12
|
var _ufoExperiences = require("./ufoExperiences");
|
|
13
13
|
|
|
14
14
|
var useSmartLinkAnalytics = function useSmartLinkAnalytics(dispatchAnalytics) {
|
|
@@ -5,10 +5,10 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
5
5
|
});
|
|
6
6
|
exports.useSmartLinkConfig = void 0;
|
|
7
7
|
|
|
8
|
-
var
|
|
8
|
+
var _linkProvider = require("@atlaskit/link-provider");
|
|
9
9
|
|
|
10
10
|
var useSmartLinkConfig = function useSmartLinkConfig() {
|
|
11
|
-
var context = (0,
|
|
11
|
+
var context = (0, _linkProvider.useSmartLinkContext)();
|
|
12
12
|
|
|
13
13
|
if (context) {
|
|
14
14
|
return context.config;
|
|
@@ -3,7 +3,7 @@
|
|
|
3
3
|
Object.defineProperty(exports, "__esModule", {
|
|
4
4
|
value: true
|
|
5
5
|
});
|
|
6
|
-
exports.isVisible = exports.isFinalState = exports.isAccessible = exports.hasResolved = exports.
|
|
6
|
+
exports.isVisible = exports.isFinalState = exports.isAccessible = exports.hasResolved = exports.getStatus = exports.getServices = exports.getResourceType = exports.getExtensionKey = exports.getDefinitionId = exports.getClickUrl = exports.getByDefinitionId = void 0;
|
|
7
7
|
|
|
8
8
|
var _extractVisitUrl = require("../extractors/common/primitives/extractVisitUrl");
|
|
9
9
|
|
|
@@ -17,14 +17,6 @@ var getByDefinitionId = function getByDefinitionId(definitionId, store) {
|
|
|
17
17
|
|
|
18
18
|
exports.getByDefinitionId = getByDefinitionId;
|
|
19
19
|
|
|
20
|
-
var getUrl = function getUrl(store, url) {
|
|
21
|
-
return store.getState()[url] || {
|
|
22
|
-
status: 'pending'
|
|
23
|
-
};
|
|
24
|
-
};
|
|
25
|
-
|
|
26
|
-
exports.getUrl = getUrl;
|
|
27
|
-
|
|
28
20
|
var getClickUrl = function getClickUrl(url, jsonLd) {
|
|
29
21
|
if (jsonLd && jsonLd.data) {
|
|
30
22
|
var visitUrl = (0, _extractVisitUrl.extractVisitUrl)(jsonLd.data);
|
|
@@ -13,10 +13,10 @@ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/
|
|
|
13
13
|
|
|
14
14
|
var _react = require("react");
|
|
15
15
|
|
|
16
|
-
var
|
|
16
|
+
var _linkProvider = require("@atlaskit/link-provider");
|
|
17
17
|
|
|
18
18
|
function usePrefetch(url) {
|
|
19
|
-
var _useSmartLinkContext = (0,
|
|
19
|
+
var _useSmartLinkContext = (0, _linkProvider.useSmartLinkContext)(),
|
|
20
20
|
store = _useSmartLinkContext.store,
|
|
21
21
|
prefetchStore = _useSmartLinkContext.prefetchStore,
|
|
22
22
|
connections = _useSmartLinkContext.connections;
|
package/dist/cjs/state/index.js
CHANGED
|
@@ -6,13 +6,13 @@ Object.defineProperty(exports, "__esModule", {
|
|
|
6
6
|
Object.defineProperty(exports, "SmartCardContext", {
|
|
7
7
|
enumerable: true,
|
|
8
8
|
get: function get() {
|
|
9
|
-
return
|
|
9
|
+
return _linkProvider.SmartCardContext;
|
|
10
10
|
}
|
|
11
11
|
});
|
|
12
12
|
Object.defineProperty(exports, "SmartCardProvider", {
|
|
13
13
|
enumerable: true,
|
|
14
14
|
get: function get() {
|
|
15
|
-
return
|
|
15
|
+
return _linkProvider.SmartCardProvider;
|
|
16
16
|
}
|
|
17
17
|
});
|
|
18
18
|
Object.defineProperty(exports, "usePrefetch", {
|
|
@@ -30,10 +30,10 @@ Object.defineProperty(exports, "useSmartLink", {
|
|
|
30
30
|
Object.defineProperty(exports, "useSmartLinkContext", {
|
|
31
31
|
enumerable: true,
|
|
32
32
|
get: function get() {
|
|
33
|
-
return
|
|
33
|
+
return _linkProvider.useSmartLinkContext;
|
|
34
34
|
}
|
|
35
35
|
});
|
|
36
36
|
|
|
37
|
-
var
|
|
37
|
+
var _linkProvider = require("@atlaskit/link-provider");
|
|
38
38
|
|
|
39
39
|
var _hooks = require("./hooks");
|
|
@@ -7,10 +7,10 @@ exports.useSmartLinkRenderers = void 0;
|
|
|
7
7
|
|
|
8
8
|
var _react = require("react");
|
|
9
9
|
|
|
10
|
-
var
|
|
10
|
+
var _linkProvider = require("@atlaskit/link-provider");
|
|
11
11
|
|
|
12
12
|
var useSmartLinkRenderers = function useSmartLinkRenderers() {
|
|
13
|
-
var context = (0,
|
|
13
|
+
var context = (0, _linkProvider.useSmartLinkContext)();
|
|
14
14
|
var renderers = context === null || context === void 0 ? void 0 : context.renderers;
|
|
15
15
|
renderers = (0, _react.useMemo)(function () {
|
|
16
16
|
return renderers;
|
|
@@ -11,16 +11,16 @@ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/sli
|
|
|
11
11
|
|
|
12
12
|
var _react = require("react");
|
|
13
13
|
|
|
14
|
-
var
|
|
14
|
+
var _linkProvider = require("@atlaskit/link-provider");
|
|
15
15
|
|
|
16
|
-
var
|
|
16
|
+
var _linkingCommon = require("@atlaskit/linking-common");
|
|
17
17
|
|
|
18
18
|
function useSmartCardState(url) {
|
|
19
|
-
var _useSmartLinkContext = (0,
|
|
19
|
+
var _useSmartLinkContext = (0, _linkProvider.useSmartLinkContext)(),
|
|
20
20
|
store = _useSmartLinkContext.store; // Initially, card state should be pending and 'empty'.
|
|
21
21
|
|
|
22
22
|
|
|
23
|
-
var _useState = (0, _react.useState)((0,
|
|
23
|
+
var _useState = (0, _react.useState)((0, _linkingCommon.getUrl)(store, url)),
|
|
24
24
|
_useState2 = (0, _slicedToArray2.default)(_useState, 2),
|
|
25
25
|
state = _useState2[0],
|
|
26
26
|
setState = _useState2[1]; // Selector for initial and subsequent states.
|
|
@@ -28,7 +28,7 @@ function useSmartCardState(url) {
|
|
|
28
28
|
|
|
29
29
|
(0, _react.useEffect)(function () {
|
|
30
30
|
var unsubscribe = store.subscribe(function () {
|
|
31
|
-
setState((0,
|
|
31
|
+
setState((0, _linkingCommon.getUrl)(store, url));
|
|
32
32
|
});
|
|
33
33
|
return function () {
|
|
34
34
|
return unsubscribe();
|
|
@@ -21,7 +21,7 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
|
|
|
21
21
|
|
|
22
22
|
var isFlexibleUiCard = function isFlexibleUiCard(children) {
|
|
23
23
|
if (children && _react.default.Children.toArray(children).some(function (child) {
|
|
24
|
-
return
|
|
24
|
+
return isFlexibleUiTitleBlock(child);
|
|
25
25
|
})) {
|
|
26
26
|
return true;
|
|
27
27
|
}
|
package/dist/cjs/utils/mocks.js
CHANGED
|
@@ -21,7 +21,7 @@ var _possibleConstructorReturn2 = _interopRequireDefault(require("@babel/runtime
|
|
|
21
21
|
|
|
22
22
|
var _getPrototypeOf2 = _interopRequireDefault(require("@babel/runtime/helpers/getPrototypeOf"));
|
|
23
23
|
|
|
24
|
-
var
|
|
24
|
+
var _linkProvider = require("@atlaskit/link-provider");
|
|
25
25
|
|
|
26
26
|
function _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = (0, _getPrototypeOf2.default)(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = (0, _getPrototypeOf2.default)(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return (0, _possibleConstructorReturn2.default)(this, result); }; }
|
|
27
27
|
|
|
@@ -245,7 +245,7 @@ var fakeFactory = function fakeFactory(implementation, implementationPost, imple
|
|
|
245
245
|
}()
|
|
246
246
|
}]);
|
|
247
247
|
return CustomClient;
|
|
248
|
-
}(
|
|
248
|
+
}(_linkProvider.CardClient);
|
|
249
249
|
};
|
|
250
250
|
|
|
251
251
|
exports.fakeFactory = fakeFactory;
|
|
@@ -11,7 +11,7 @@ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")
|
|
|
11
11
|
|
|
12
12
|
var _react = _interopRequireDefault(require("react"));
|
|
13
13
|
|
|
14
|
-
var
|
|
14
|
+
var _linkProvider = require("@atlaskit/link-provider");
|
|
15
15
|
|
|
16
16
|
var _state = require("../state");
|
|
17
17
|
|
|
@@ -30,7 +30,7 @@ exports.renderHook = renderHook;
|
|
|
30
30
|
|
|
31
31
|
var renderSmartLinkHook = function renderSmartLinkHook(callback, providerProps) {
|
|
32
32
|
return /*#__PURE__*/_react.default.createElement(_state.SmartCardProvider, (0, _extends2.default)({
|
|
33
|
-
client: new
|
|
33
|
+
client: new _linkProvider.CardClient()
|
|
34
34
|
}, providerProps), /*#__PURE__*/_react.default.createElement(Hook, {
|
|
35
35
|
callback: callback
|
|
36
36
|
}), ";");
|
package/dist/cjs/version.json
CHANGED
|
@@ -41,6 +41,10 @@ var _analytics2 = require("../../state/analytics");
|
|
|
41
41
|
|
|
42
42
|
var _helpers = require("../../state/helpers");
|
|
43
43
|
|
|
44
|
+
var _extractMetadata = require("../../extractors/hover/extractMetadata");
|
|
45
|
+
|
|
46
|
+
var _utils = require("./utils");
|
|
47
|
+
|
|
44
48
|
function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
|
|
45
49
|
|
|
46
50
|
function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
|
|
@@ -134,7 +138,9 @@ var HoverCardComponent = function HoverCardComponent(_ref) {
|
|
|
134
138
|
};
|
|
135
139
|
}, [url, definitionId, extensionKey, analytics]);
|
|
136
140
|
|
|
137
|
-
var
|
|
141
|
+
var CardComponent = function CardComponent() {
|
|
142
|
+
//TODO: EDM-3224 deleted simulated and use real JsonLd
|
|
143
|
+
var metadataElements = (0, _extractMetadata.extractMetadata)((0, _utils.getSimulatedMetadata)(extensionKey));
|
|
138
144
|
return (0, _core.jsx)("div", {
|
|
139
145
|
onMouseEnter: initShowCard,
|
|
140
146
|
onMouseLeave: initHideCard,
|
|
@@ -148,6 +154,9 @@ var HoverCardComponent = function HoverCardComponent(_ref) {
|
|
|
148
154
|
}
|
|
149
155
|
}, (0, _core.jsx)(_blocks.TitleBlock, {
|
|
150
156
|
actions: [openAction]
|
|
157
|
+
}), (0, _core.jsx)(_blocks.MetadataBlock, {
|
|
158
|
+
primary: metadataElements.primary,
|
|
159
|
+
secondary: metadataElements.secondary
|
|
151
160
|
}), (0, _core.jsx)(_blocks.SnippetBlock, null), (0, _core.jsx)(_blocks.FooterBlock, {
|
|
152
161
|
actions: smartlinkActions
|
|
153
162
|
})));
|
|
@@ -161,7 +170,7 @@ var HoverCardComponent = function HoverCardComponent(_ref) {
|
|
|
161
170
|
isOpen: isOpen,
|
|
162
171
|
onClose: onClose,
|
|
163
172
|
placement: "bottom-start",
|
|
164
|
-
content:
|
|
173
|
+
content: CardComponent,
|
|
165
174
|
trigger: function trigger(triggerProps) {
|
|
166
175
|
return (0, _core.jsx)("span", (0, _extends2.default)({}, triggerProps, {
|
|
167
176
|
onMouseEnter: initShowCard,
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
Object.defineProperty(exports, "__esModule", {
|
|
4
|
+
value: true
|
|
5
|
+
});
|
|
6
|
+
exports.getSimulatedMetadata = void 0;
|
|
7
|
+
|
|
8
|
+
var getSimulatedMetadata = function getSimulatedMetadata(extensionKey) {
|
|
9
|
+
switch (extensionKey) {
|
|
10
|
+
case 'confluence-object-provider':
|
|
11
|
+
return {
|
|
12
|
+
metadata: {
|
|
13
|
+
primary: ['AuthorGroup', 'CreatedBy', 'CommentCount', 'ReactCount'],
|
|
14
|
+
secondary: []
|
|
15
|
+
}
|
|
16
|
+
};
|
|
17
|
+
|
|
18
|
+
case 'jira-object-provider':
|
|
19
|
+
return {
|
|
20
|
+
metadata: {
|
|
21
|
+
primary: ['AuthorGroup', 'State', 'Priority'],
|
|
22
|
+
secondary: []
|
|
23
|
+
}
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
default:
|
|
27
|
+
return {
|
|
28
|
+
metadata: {
|
|
29
|
+
primary: ['ModifiedOn'],
|
|
30
|
+
secondary: []
|
|
31
|
+
}
|
|
32
|
+
};
|
|
33
|
+
}
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
exports.getSimulatedMetadata = getSimulatedMetadata;
|
|
@@ -1,214 +1 @@
|
|
|
1
|
-
|
|
2
|
-
// import setimmediate to temporary fix dataloader 2.0.0 bug
|
|
3
|
-
// @see https://github.com/graphql/dataloader/issues/249
|
|
4
|
-
import 'setimmediate';
|
|
5
|
-
import DataLoader from 'dataloader';
|
|
6
|
-
import retry from 'async-retry';
|
|
7
|
-
import * as api from './api';
|
|
8
|
-
import { APIError } from './errors';
|
|
9
|
-
import { getResolverUrl } from './utils/environments';
|
|
10
|
-
import pThrottle from 'p-throttle';
|
|
11
|
-
import { isSuccessfulResponse, isErrorResponse } from './types/responses';
|
|
12
|
-
const MAX_BATCH_SIZE = 50;
|
|
13
|
-
const MIN_TIME_BETWEEN_BATCHES = 250;
|
|
14
|
-
export default class CardClient {
|
|
15
|
-
constructor(envKey) {
|
|
16
|
-
_defineProperty(this, "batchResolve", async urls => {
|
|
17
|
-
// De-duplicate requested URLs (see `this.createLoader` for more detail).
|
|
18
|
-
const deDuplicatedUrls = [...new Set(urls)];
|
|
19
|
-
let resolvedUrls = [];
|
|
20
|
-
|
|
21
|
-
try {
|
|
22
|
-
// Ask the backend to resolve the URLs for us.
|
|
23
|
-
resolvedUrls = await api.request('post', `${this.resolverUrl}/resolve/batch`, deDuplicatedUrls.map(resourceUrl => ({
|
|
24
|
-
resourceUrl
|
|
25
|
-
})));
|
|
26
|
-
} catch (error) {
|
|
27
|
-
// we make sure we return a valid dataloader response by creating an error
|
|
28
|
-
// response for each url
|
|
29
|
-
resolvedUrls = urls.map(() => {
|
|
30
|
-
const status = isErrorResponse(error) ? error.status : 500;
|
|
31
|
-
const errorResponse = {
|
|
32
|
-
status,
|
|
33
|
-
error
|
|
34
|
-
};
|
|
35
|
-
return errorResponse;
|
|
36
|
-
});
|
|
37
|
-
} // Reduce into a map to make accessing faster and easier.
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
const map = {}; // NOTE: the batch endpoint returns the URLs in the same order they were given.
|
|
41
|
-
|
|
42
|
-
for (let i = 0; i < deDuplicatedUrls.length; ++i) {
|
|
43
|
-
const url = deDuplicatedUrls[i];
|
|
44
|
-
const data = resolvedUrls[i];
|
|
45
|
-
map[url] = data;
|
|
46
|
-
} // Reconvert list back into the original order in which it was given to us.
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
return urls.map(originalUrl => map[originalUrl]);
|
|
50
|
-
});
|
|
51
|
-
|
|
52
|
-
this.resolverUrl = getResolverUrl(envKey);
|
|
53
|
-
this.loadersByDomain = {};
|
|
54
|
-
this.retryConfig = {
|
|
55
|
-
retries: 2
|
|
56
|
-
};
|
|
57
|
-
this.resolvedCache = {};
|
|
58
|
-
}
|
|
59
|
-
|
|
60
|
-
createLoader() {
|
|
61
|
-
const batchResolveThrottler = pThrottle({
|
|
62
|
-
limit: 1,
|
|
63
|
-
interval: MIN_TIME_BETWEEN_BATCHES
|
|
64
|
-
});
|
|
65
|
-
const throttledBatchResolve = batchResolveThrottler(this.batchResolve);
|
|
66
|
-
return new DataLoader( // We place all calls to `batchResolve` in a limiter so we don't send off several simultaneous batch requests.
|
|
67
|
-
// This is for two reasons:
|
|
68
|
-
// 1: we want to avoid getting rate limited upstream (eg: forge and other APIs)
|
|
69
|
-
// 2: we want to avoid sending out heaps of requests from the client at once
|
|
70
|
-
urls => throttledBatchResolve(urls), {
|
|
71
|
-
maxBatchSize: MAX_BATCH_SIZE,
|
|
72
|
-
// NOTE: we turn off DataLoader's cache because it doesn't work for our use-case. Consider the following:
|
|
73
|
-
// - a smartlink to a restricted item is resolved to "forbidden" with a "request access button"
|
|
74
|
-
// - the user clicks "request access", and then following the auth prompts and gets access
|
|
75
|
-
// - the frontend now re-renders the smartlink, but due to DataLoader's caching, the previous "forbidden" state is
|
|
76
|
-
// because the smartlink's URL (which is the cache key) is exactly the same
|
|
77
|
-
//
|
|
78
|
-
// For this reason, we disable DataLoader's cache.
|
|
79
|
-
// This means that URLs will not be de-duplicated by DataLoader, so we perform the de-duplication logic
|
|
80
|
-
// ourselves in `this.batchResolve`.
|
|
81
|
-
cache: false
|
|
82
|
-
});
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
getLoader(hostname) {
|
|
86
|
-
if (!this.loadersByDomain[hostname]) {
|
|
87
|
-
this.loadersByDomain[hostname] = this.createLoader();
|
|
88
|
-
}
|
|
89
|
-
|
|
90
|
-
return this.loadersByDomain[hostname];
|
|
91
|
-
}
|
|
92
|
-
|
|
93
|
-
async prefetchData(url) {
|
|
94
|
-
// 1. Queue the URL as part of a dataloader batch.
|
|
95
|
-
const hostname = new URL(url).hostname;
|
|
96
|
-
const loader = this.getLoader(hostname);
|
|
97
|
-
const response = await loader.load(url);
|
|
98
|
-
|
|
99
|
-
if (isSuccessfulResponse(response)) {
|
|
100
|
-
// 2. If the URL resolves, send it back.
|
|
101
|
-
return response.body;
|
|
102
|
-
} else {
|
|
103
|
-
try {
|
|
104
|
-
// 3. If the URL does not resolve, retry it with exponential backoff.
|
|
105
|
-
// This is done so that we avoid the scenario where users are unable to
|
|
106
|
-
// see a resolved Smart Link, when their expectation is to be able to.
|
|
107
|
-
const retriedResponse = await retry(async () => {
|
|
108
|
-
// We check if the link has resolved in the cache and stop trying if so.
|
|
109
|
-
// We do this by triggering an error that the link has already been resolved.
|
|
110
|
-
// This cascades <retryCount> times after which it is handled like a normal
|
|
111
|
-
// 'error', returning `undefined`.
|
|
112
|
-
if (!this.resolvedCache[url]) {
|
|
113
|
-
const response = await loader.load(url);
|
|
114
|
-
|
|
115
|
-
if (isSuccessfulResponse(response)) {
|
|
116
|
-
return response;
|
|
117
|
-
} else {
|
|
118
|
-
throw new Error('Retry for URL failed');
|
|
119
|
-
}
|
|
120
|
-
} else {
|
|
121
|
-
// Short-circuit each of the retries, as described above.
|
|
122
|
-
throw new Error('Retry unneeded - link has been resolved.');
|
|
123
|
-
}
|
|
124
|
-
}, this.retryConfig); // Trigger callback after successful backoff.
|
|
125
|
-
|
|
126
|
-
return retriedResponse.body;
|
|
127
|
-
} catch (err) {
|
|
128
|
-
// Do nothing in the case of an error - prefetching
|
|
129
|
-
// failures should be silent. Once a link is visible,
|
|
130
|
-
// it will be re-fetched anyhow, in which case a
|
|
131
|
-
// user-facing error is required.
|
|
132
|
-
return undefined;
|
|
133
|
-
}
|
|
134
|
-
}
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
async fetchData(url) {
|
|
138
|
-
const hostname = new URL(url).hostname;
|
|
139
|
-
const loader = this.getLoader(hostname);
|
|
140
|
-
const response = await loader.load(url);
|
|
141
|
-
|
|
142
|
-
if (!isSuccessfulResponse(response)) {
|
|
143
|
-
// Catch non-200 server responses to fallback or return useful information.
|
|
144
|
-
if (response.error) {
|
|
145
|
-
const errorType = response.error.type;
|
|
146
|
-
const errorMessage = response.error.message; // this means there was a network error and we fallback to blue link
|
|
147
|
-
// without impacting SLO's
|
|
148
|
-
|
|
149
|
-
if (response.error instanceof api.NetworkError) {
|
|
150
|
-
throw new APIError('fallback', hostname, errorMessage, errorType);
|
|
151
|
-
}
|
|
152
|
-
|
|
153
|
-
switch (errorType) {
|
|
154
|
-
// BadRequestError - indicative of an API error, render
|
|
155
|
-
// a blue link to mitigate customer impact.
|
|
156
|
-
case 'ResolveBadRequestError':
|
|
157
|
-
throw new APIError('fallback', hostname, errorMessage, errorType);
|
|
158
|
-
// AuthError - if the user logs in, we may be able
|
|
159
|
-
// to recover. Render an unauthorized card.
|
|
160
|
-
|
|
161
|
-
case 'ResolveAuthError':
|
|
162
|
-
throw new APIError('auth', hostname, errorMessage, errorType);
|
|
163
|
-
// UnsupportedError - we do not know how to render this URL.
|
|
164
|
-
// Bail out and ask the Editor to render as a blue link.
|
|
165
|
-
|
|
166
|
-
case 'ResolveUnsupportedError':
|
|
167
|
-
// URL isn't supported
|
|
168
|
-
throw new APIError('fatal', hostname, errorMessage, errorType);
|
|
169
|
-
// ResolveFailedError - link resolver may have failed.
|
|
170
|
-
// We could recover on re-resolve; render with fallback state.
|
|
171
|
-
|
|
172
|
-
case 'ResolveFailedError':
|
|
173
|
-
// Timeouts
|
|
174
|
-
throw new APIError('error', hostname, errorMessage, errorType);
|
|
175
|
-
// TimeoutError - link resolver may be taking a long time.
|
|
176
|
-
// We could recover on re-resolve; render with fallback state.
|
|
177
|
-
|
|
178
|
-
case 'ResolveTimeoutError':
|
|
179
|
-
// Timeouts
|
|
180
|
-
throw new APIError('error', hostname, errorMessage, errorType);
|
|
181
|
-
// InternalServerError - API call failed.
|
|
182
|
-
// We may recover later; render with fallback state.
|
|
183
|
-
|
|
184
|
-
case 'InternalServerError':
|
|
185
|
-
// ORS failures
|
|
186
|
-
throw new APIError('error', hostname, errorMessage, errorType);
|
|
187
|
-
}
|
|
188
|
-
} // Catch all: we don't know this error, bail out.
|
|
189
|
-
|
|
190
|
-
|
|
191
|
-
throw new APIError('fatal', hostname, response.toString(), 'UnexpectedError');
|
|
192
|
-
} else {
|
|
193
|
-
// Set a flag in the `resolvedCache` for this URL. The intent of this is
|
|
194
|
-
// to ensure that the exponential backoff method in `prefetchData` does
|
|
195
|
-
// not continue to retry fetching for this URL, especially if it was previously
|
|
196
|
-
// in a failed state. Note: this scenario only occurs on initial page load, if the
|
|
197
|
-
// user scrolls through the page very fast. Once the URL is visible, prefetching
|
|
198
|
-
// no longer takes place.
|
|
199
|
-
this.resolvedCache[url] = true; // Return the JSON-LD response back up!
|
|
200
|
-
|
|
201
|
-
return response.body;
|
|
202
|
-
}
|
|
203
|
-
}
|
|
204
|
-
|
|
205
|
-
async postData(data) {
|
|
206
|
-
const request = {
|
|
207
|
-
key: data.key,
|
|
208
|
-
action: data.action,
|
|
209
|
-
context: data.context
|
|
210
|
-
};
|
|
211
|
-
return await api.request('post', `${this.resolverUrl}/invoke`, request);
|
|
212
|
-
}
|
|
213
|
-
|
|
214
|
-
}
|
|
1
|
+
export { CardClient as default } from '@atlaskit/link-provider';
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import { extractPreview } from '@atlaskit/linking-common';
|
|
2
1
|
import { extractLink, extractTitle } from '../common/primitives';
|
|
3
2
|
import { extractProvider } from '../common/context';
|
|
3
|
+
import { extractPreview } from '@atlaskit/linking-common';
|
|
4
4
|
import { extractIsTrusted } from '../common/meta/extractIsTrusted';
|
|
5
5
|
|
|
6
6
|
const extractEmbedPreview = (jsonLd, platform) => {
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { ElementName } from '../../constants';
|
|
2
|
+
|
|
3
|
+
const elementNamesToItems = elementNames => {
|
|
4
|
+
return elementNames.filter(element => element in ElementName).map(elementName => ({
|
|
5
|
+
name: elementName,
|
|
6
|
+
testId: `${elementName.toLowerCase()}-metadata-element`
|
|
7
|
+
}));
|
|
8
|
+
};
|
|
9
|
+
|
|
10
|
+
export const extractMetadata = jsonLd => {
|
|
11
|
+
var _jsonLd$metadata, _metadata$primary, _metadata$secondary;
|
|
12
|
+
|
|
13
|
+
const metadata = (_jsonLd$metadata = jsonLd.metadata) !== null && _jsonLd$metadata !== void 0 ? _jsonLd$metadata : [];
|
|
14
|
+
return {
|
|
15
|
+
primary: elementNamesToItems((_metadata$primary = metadata.primary) !== null && _metadata$primary !== void 0 ? _metadata$primary : []),
|
|
16
|
+
secondary: elementNamesToItems((_metadata$secondary = metadata.secondary) !== null && _metadata$secondary !== void 0 ? _metadata$secondary : [])
|
|
17
|
+
};
|
|
18
|
+
};
|