@atlaskit/smart-card 44.24.1 → 44.25.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 +19 -0
- package/dist/cjs/extractors/flexible/extract-state.js +4 -1
- package/dist/cjs/ssr.js +14 -3
- package/dist/cjs/state/actions/index.js +111 -23
- package/dist/cjs/state/hooks/use-resolve/index.js +7 -13
- package/dist/cjs/state/hooks/use-response/index.js +9 -3
- package/dist/cjs/state/hooks/usePrefetch.js +7 -6
- package/dist/cjs/state/hooks/useSmartLink.js +12 -3
- package/dist/cjs/state/hooks-external/useSmartLinkActions.js +3 -1
- package/dist/cjs/utils/analytics/analytics.js +1 -1
- package/dist/cjs/view/CardWithUrl/component-lazy/LazyIntersectionObserverCard.js +1 -1
- package/dist/cjs/view/CardWithUrl/component.js +25 -3
- package/dist/cjs/view/CardWithUrl/loader.js +7 -1
- package/dist/cjs/view/EmbedCard/useEmbedResolvePostMessageListener.js +4 -1
- package/dist/cjs/view/FlexibleCard/components/actions/action/server-action/index.js +5 -1
- package/dist/cjs/view/FlexibleCard/components/elements/common/base-lozenge-element/lozenge-action/index.js +5 -1
- package/dist/cjs/view/HoverCard/components/HoverCardComponent.js +2 -1
- package/dist/cjs/view/LinkUrl/index.js +1 -1
- package/dist/es2019/extractors/flexible/extract-state.js +4 -1
- package/dist/es2019/ssr.js +14 -3
- package/dist/es2019/state/actions/index.js +85 -12
- package/dist/es2019/state/hooks/use-resolve/index.js +11 -2
- package/dist/es2019/state/hooks/use-response/index.js +9 -5
- package/dist/es2019/state/hooks/usePrefetch.js +8 -7
- package/dist/es2019/state/hooks/useSmartLink.js +13 -3
- package/dist/es2019/state/hooks-external/useSmartLinkActions.js +3 -1
- package/dist/es2019/utils/analytics/analytics.js +1 -1
- package/dist/es2019/view/CardWithUrl/component-lazy/LazyIntersectionObserverCard.js +1 -1
- package/dist/es2019/view/CardWithUrl/component.js +28 -4
- package/dist/es2019/view/CardWithUrl/loader.js +7 -1
- package/dist/es2019/view/EmbedCard/useEmbedResolvePostMessageListener.js +4 -1
- package/dist/es2019/view/FlexibleCard/components/actions/action/server-action/index.js +5 -1
- package/dist/es2019/view/FlexibleCard/components/elements/common/base-lozenge-element/lozenge-action/index.js +5 -1
- package/dist/es2019/view/HoverCard/components/HoverCardComponent.js +2 -1
- package/dist/es2019/view/LinkUrl/index.js +1 -1
- package/dist/esm/extractors/flexible/extract-state.js +4 -1
- package/dist/esm/ssr.js +14 -3
- package/dist/esm/state/actions/index.js +111 -23
- package/dist/esm/state/hooks/use-resolve/index.js +7 -13
- package/dist/esm/state/hooks/use-response/index.js +9 -3
- package/dist/esm/state/hooks/usePrefetch.js +7 -6
- package/dist/esm/state/hooks/useSmartLink.js +13 -3
- package/dist/esm/state/hooks-external/useSmartLinkActions.js +3 -1
- package/dist/esm/utils/analytics/analytics.js +1 -1
- package/dist/esm/view/CardWithUrl/component-lazy/LazyIntersectionObserverCard.js +1 -1
- package/dist/esm/view/CardWithUrl/component.js +26 -4
- package/dist/esm/view/CardWithUrl/loader.js +7 -1
- package/dist/esm/view/EmbedCard/useEmbedResolvePostMessageListener.js +4 -1
- package/dist/esm/view/FlexibleCard/components/actions/action/server-action/index.js +5 -1
- package/dist/esm/view/FlexibleCard/components/elements/common/base-lozenge-element/lozenge-action/index.js +5 -1
- package/dist/esm/view/HoverCard/components/HoverCardComponent.js +2 -1
- package/dist/esm/view/LinkUrl/index.js +1 -1
- package/dist/types/state/actions/index.d.ts +3 -2
- package/dist/types/state/hooks/use-resolve/index.d.ts +9 -1
- package/dist/types/state/hooks/use-response/index.d.ts +2 -2
- package/dist/types/state/hooks/usePrefetch.d.ts +2 -1
- package/dist/types/state/hooks/useSmartLink.d.ts +14 -6
- package/dist/types-ts4.5/state/actions/index.d.ts +3 -2
- package/dist/types-ts4.5/state/hooks/use-resolve/index.d.ts +9 -1
- package/dist/types-ts4.5/state/hooks/use-response/index.d.ts +2 -2
- package/dist/types-ts4.5/state/hooks/usePrefetch.d.ts +2 -1
- package/dist/types-ts4.5/state/hooks/useSmartLink.d.ts +14 -6
- package/package.json +7 -4
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,24 @@
|
|
|
1
1
|
# @atlaskit/smart-card
|
|
2
2
|
|
|
3
|
+
## 44.25.0
|
|
4
|
+
|
|
5
|
+
### Minor Changes
|
|
6
|
+
|
|
7
|
+
- [`fdea0f8bc06c4`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/fdea0f8bc06c4) -
|
|
8
|
+
Pass card appearance to ORS for optimized response payload. When
|
|
9
|
+
platform_smartlink_inline_resolve_optimization is enabled, inline cards request minimal data on
|
|
10
|
+
initial load and fetch full block data on hover.
|
|
11
|
+
|
|
12
|
+
### Patch Changes
|
|
13
|
+
|
|
14
|
+
- Updated dependencies
|
|
15
|
+
|
|
16
|
+
## 44.24.2
|
|
17
|
+
|
|
18
|
+
### Patch Changes
|
|
19
|
+
|
|
20
|
+
- Updated dependencies
|
|
21
|
+
|
|
3
22
|
## 44.24.1
|
|
4
23
|
|
|
5
24
|
### Patch Changes
|
|
@@ -51,7 +51,10 @@ var extractAction = function extractAction(response, id, actionOptions, appearan
|
|
|
51
51
|
fireEvent: fireEvent,
|
|
52
52
|
id: id,
|
|
53
53
|
onClose: resolve ? function () {
|
|
54
|
-
return url && resolve(
|
|
54
|
+
return url && resolve({
|
|
55
|
+
url: url,
|
|
56
|
+
isReloading: true
|
|
57
|
+
});
|
|
55
58
|
} : undefined,
|
|
56
59
|
origin: origin,
|
|
57
60
|
response: response,
|
package/dist/cjs/ssr.js
CHANGED
|
@@ -14,6 +14,7 @@ var _uuid = _interopRequireDefault(require("uuid"));
|
|
|
14
14
|
var _analyticsNext = require("@atlaskit/analytics-next");
|
|
15
15
|
var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
|
|
16
16
|
var _analytics = require("./utils/analytics/analytics");
|
|
17
|
+
var _flexible = require("./utils/flexible");
|
|
17
18
|
var _cardErrorBoundary = _interopRequireDefault(require("./view/CardWithUrl/card-error-boundary"));
|
|
18
19
|
var _component = require("./view/CardWithUrl/component");
|
|
19
20
|
var _LoadingCardLink = require("./view/CardWithUrl/component-lazy/LoadingCardLink");
|
|
@@ -31,8 +32,13 @@ var CardSSROld = function CardSSROld(props) {
|
|
|
31
32
|
}),
|
|
32
33
|
_useState2 = (0, _slicedToArray2.default)(_useState, 1),
|
|
33
34
|
id = _useState2[0];
|
|
35
|
+
// FlexibleCards always need full ORS data regardless of appearance prop,
|
|
36
|
+
// because they render custom blocks (TitleBlock etc.) requiring a complete response.
|
|
37
|
+
// Override appearance to 'block' for FlexibleCards when FG is enabled.
|
|
38
|
+
var effectiveAppearance = (0, _flexible.isFlexibleUiCard)(props.children, props.ui) && (0, _platformFeatureFlags.fg)('platform_smartlink_inline_resolve_optimization') ? 'block' : props.appearance;
|
|
34
39
|
var cardProps = _objectSpread(_objectSpread({}, props), {}, {
|
|
35
|
-
id: id
|
|
40
|
+
id: id,
|
|
41
|
+
appearance: effectiveAppearance
|
|
36
42
|
});
|
|
37
43
|
var ErrorFallbackComponent = cardProps.fallbackComponent;
|
|
38
44
|
var errorBoundaryFallbackComponent = function errorBoundaryFallbackComponent() {
|
|
@@ -41,7 +47,7 @@ var CardSSROld = function CardSSROld(props) {
|
|
|
41
47
|
}
|
|
42
48
|
return /*#__PURE__*/_react.default.createElement(_LoadingCardLink.LoadingCardLink, cardProps);
|
|
43
49
|
};
|
|
44
|
-
var Component =
|
|
50
|
+
var Component = effectiveAppearance === 'inline' ? 'span' : 'div';
|
|
45
51
|
return /*#__PURE__*/_react.default.createElement(_analyticsNext.AnalyticsContext, {
|
|
46
52
|
data: _analytics.context
|
|
47
53
|
}, /*#__PURE__*/_react.default.createElement(_reactErrorBoundary.ErrorBoundary, {
|
|
@@ -62,8 +68,13 @@ var CardSSRNew = function CardSSRNew(props) {
|
|
|
62
68
|
}),
|
|
63
69
|
_useState4 = (0, _slicedToArray2.default)(_useState3, 1),
|
|
64
70
|
id = _useState4[0];
|
|
71
|
+
// FlexibleCards always need full ORS data regardless of appearance prop,
|
|
72
|
+
// because they render custom blocks (TitleBlock etc.) requiring a complete response.
|
|
73
|
+
// Override appearance to 'block' for FlexibleCards when FG is enabled.
|
|
74
|
+
var effectiveAppearance = (0, _flexible.isFlexibleUiCard)(props.children, props.ui) && (0, _platformFeatureFlags.fg)('platform_smartlink_inline_resolve_optimization') ? 'block' : props.appearance;
|
|
65
75
|
var propsWithId = _objectSpread(_objectSpread({}, props), {}, {
|
|
66
|
-
id: id
|
|
76
|
+
id: id,
|
|
77
|
+
appearance: effectiveAppearance
|
|
67
78
|
});
|
|
68
79
|
return /*#__PURE__*/_react.default.createElement(_analyticsNext.AnalyticsContext, {
|
|
69
80
|
data: _analytics.context
|
|
@@ -107,6 +107,8 @@ var useSmartCardActions = exports.useSmartCardActions = function useSmartCardAct
|
|
|
107
107
|
url: url
|
|
108
108
|
}, undefined, undefined, metadataStatus));
|
|
109
109
|
}, [dispatch, url]);
|
|
110
|
+
|
|
111
|
+
// Original resolve function — signature kept intact for maximum safety when FG is off.
|
|
110
112
|
var resolve = (0, _react.useCallback)( /*#__PURE__*/(0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee() {
|
|
111
113
|
var resourceUrl,
|
|
112
114
|
isReloading,
|
|
@@ -118,45 +120,131 @@ var useSmartCardActions = exports.useSmartCardActions = function useSmartCardAct
|
|
|
118
120
|
resourceUrl = _args.length > 0 && _args[0] !== undefined ? _args[0] : url;
|
|
119
121
|
isReloading = _args.length > 1 && _args[1] !== undefined ? _args[1] : false;
|
|
120
122
|
isMetadataRequest = _args.length > 2 && _args[2] !== undefined ? _args[2] : false;
|
|
121
|
-
return _context.abrupt("return", resolveUrl(
|
|
123
|
+
return _context.abrupt("return", resolveUrl({
|
|
124
|
+
url: resourceUrl,
|
|
125
|
+
isReloading: isReloading,
|
|
126
|
+
isMetadataRequest: isMetadataRequest,
|
|
127
|
+
id: id
|
|
128
|
+
}));
|
|
122
129
|
case 1:
|
|
123
130
|
case "end":
|
|
124
131
|
return _context.stop();
|
|
125
132
|
}
|
|
126
133
|
}, _callee);
|
|
127
134
|
})), [id, resolveUrl, url]);
|
|
128
|
-
|
|
135
|
+
|
|
136
|
+
// New resolve function accepting ResolveUrlParams (minus 'id' which is closed over).
|
|
137
|
+
// Used when FG is enabled to pass appearance to ORS.
|
|
138
|
+
var resolveNew = (0, _react.useCallback)( /*#__PURE__*/(0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2() {
|
|
139
|
+
var params,
|
|
140
|
+
_params$url,
|
|
141
|
+
resourceUrl,
|
|
142
|
+
_params$isReloading,
|
|
143
|
+
isReloading,
|
|
144
|
+
_params$isMetadataReq,
|
|
145
|
+
isMetadataRequest,
|
|
146
|
+
appearance,
|
|
147
|
+
_args2 = arguments;
|
|
148
|
+
return _regenerator.default.wrap(function (_context2) {
|
|
149
|
+
while (1) switch (_context2.prev = _context2.next) {
|
|
150
|
+
case 0:
|
|
151
|
+
params = _args2.length > 0 && _args2[0] !== undefined ? _args2[0] : {};
|
|
152
|
+
_params$url = params.url, resourceUrl = _params$url === void 0 ? url : _params$url, _params$isReloading = params.isReloading, isReloading = _params$isReloading === void 0 ? false : _params$isReloading, _params$isMetadataReq = params.isMetadataRequest, isMetadataRequest = _params$isMetadataReq === void 0 ? false : _params$isMetadataReq, appearance = params.appearance;
|
|
153
|
+
return _context2.abrupt("return", resolveUrl({
|
|
154
|
+
url: resourceUrl,
|
|
155
|
+
isReloading: isReloading,
|
|
156
|
+
isMetadataRequest: isMetadataRequest,
|
|
157
|
+
id: id,
|
|
158
|
+
appearance: appearance
|
|
159
|
+
}));
|
|
160
|
+
case 1:
|
|
161
|
+
case "end":
|
|
162
|
+
return _context2.stop();
|
|
163
|
+
}
|
|
164
|
+
}, _callee2);
|
|
165
|
+
})), [id, resolveUrl, url]);
|
|
166
|
+
|
|
167
|
+
/**
|
|
168
|
+
* Register a smart link for resolution.
|
|
169
|
+
* @param appearance - Card appearance hint for ORS to optimize response payload.
|
|
170
|
+
* When 'inline', ORS returns minimal data (title, status).
|
|
171
|
+
* When 'block' or 'embed', ORS returns full data including summary.
|
|
172
|
+
*/
|
|
173
|
+
var register = (0, _react.useCallback)(function (appearance) {
|
|
129
174
|
var _getSmartLinkState = getSmartLinkState(),
|
|
130
175
|
details = _getSmartLinkState.details;
|
|
131
176
|
if (!details) {
|
|
132
177
|
dispatch((0, _linkingCommon.cardAction)(_linkingCommon.ACTION_RESOLVING, {
|
|
133
178
|
url: url
|
|
134
179
|
}));
|
|
180
|
+
// Always set metadataStatus to 'pending' during registration to prevent
|
|
181
|
+
// loadMetadata from firing a duplicate concurrent fetch if a hover card
|
|
182
|
+
// mounts while registration is in-flight. This matches pre-PR behaviour.
|
|
135
183
|
setMetadataStatus('pending');
|
|
136
184
|
}
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
185
|
+
if ((0, _platformFeatureFlags.fg)('platform_smartlink_inline_resolve_optimization')) {
|
|
186
|
+
return resolveNew({
|
|
187
|
+
url: url,
|
|
188
|
+
appearance: appearance
|
|
189
|
+
});
|
|
190
|
+
}
|
|
191
|
+
return resolve(url);
|
|
192
|
+
}, [getSmartLinkState, resolve, resolveNew, dispatch, url, setMetadataStatus]);
|
|
193
|
+
var reload = (0, _react.useCallback)(function (appearance) {
|
|
140
194
|
var _getSmartLinkState2 = getSmartLinkState(),
|
|
141
195
|
details = _getSmartLinkState2.details;
|
|
142
196
|
var definitionId = (0, _helpers.getDefinitionId)(details);
|
|
143
|
-
if (
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
197
|
+
if ((0, _platformFeatureFlags.fg)('platform_smartlink_inline_resolve_optimization')) {
|
|
198
|
+
if (definitionId) {
|
|
199
|
+
(0, _helpers.getByDefinitionId)(definitionId, getState()).map(function (reloadUrl) {
|
|
200
|
+
return resolveNew({
|
|
201
|
+
url: reloadUrl,
|
|
202
|
+
isReloading: true,
|
|
203
|
+
appearance: appearance
|
|
204
|
+
});
|
|
205
|
+
});
|
|
206
|
+
} else {
|
|
207
|
+
resolveNew({
|
|
208
|
+
url: url,
|
|
209
|
+
isReloading: true,
|
|
210
|
+
appearance: appearance
|
|
211
|
+
});
|
|
212
|
+
}
|
|
147
213
|
} else {
|
|
148
|
-
|
|
214
|
+
if (definitionId) {
|
|
215
|
+
(0, _helpers.getByDefinitionId)(definitionId, getState()).map(function (reloadUrl) {
|
|
216
|
+
return resolve(reloadUrl, true);
|
|
217
|
+
});
|
|
218
|
+
} else {
|
|
219
|
+
resolve(url, true);
|
|
220
|
+
}
|
|
149
221
|
}
|
|
150
|
-
}, [getSmartLinkState, url, getState, resolve]);
|
|
222
|
+
}, [getSmartLinkState, url, getState, resolve, resolveNew]);
|
|
223
|
+
|
|
224
|
+
/**
|
|
225
|
+
* Load metadata for hover card preview.
|
|
226
|
+
* This always requests 'block' appearance to get full data including summary.
|
|
227
|
+
*
|
|
228
|
+
* Inline optimized and SSR-resolved links keep metadataStatus pending until hover
|
|
229
|
+
* requests the full block response.
|
|
230
|
+
*/
|
|
151
231
|
var loadMetadata = (0, _react.useCallback)(function () {
|
|
152
232
|
var _getSmartLinkState3 = getSmartLinkState(),
|
|
153
233
|
metadataStatus = _getSmartLinkState3.metadataStatus;
|
|
154
|
-
|
|
155
|
-
if (
|
|
234
|
+
var needsBlockData = metadataStatus === undefined || metadataStatus === 'pending' && (0, _platformFeatureFlags.fg)('platform_smartlink_inline_resolve_optimization');
|
|
235
|
+
if (needsBlockData) {
|
|
156
236
|
setMetadataStatus('pending');
|
|
237
|
+
if ((0, _platformFeatureFlags.fg)('platform_smartlink_inline_resolve_optimization')) {
|
|
238
|
+
// Always request 'block' appearance for hover card metadata to get full data
|
|
239
|
+
return resolveNew({
|
|
240
|
+
url: url,
|
|
241
|
+
isMetadataRequest: true,
|
|
242
|
+
appearance: 'block'
|
|
243
|
+
});
|
|
244
|
+
}
|
|
157
245
|
return resolve(url, false, true);
|
|
158
246
|
}
|
|
159
|
-
}, [getSmartLinkState, resolve, setMetadataStatus, url]);
|
|
247
|
+
}, [getSmartLinkState, resolve, resolveNew, setMetadataStatus, url]);
|
|
160
248
|
var authorize = (0, _react.useCallback)(function (appearance) {
|
|
161
249
|
var _getSmartLinkState4 = getSmartLinkState(),
|
|
162
250
|
details = _getSmartLinkState4.details,
|
|
@@ -237,18 +325,18 @@ var useSmartCardActions = exports.useSmartCardActions = function useSmartCardAct
|
|
|
237
325
|
}
|
|
238
326
|
}, [getSmartLinkState, id, reload, fireEvent, flags, url]);
|
|
239
327
|
var invoke = (0, _react.useCallback)( /*#__PURE__*/function () {
|
|
240
|
-
var
|
|
328
|
+
var _ref4 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee3(opts, appearance) {
|
|
241
329
|
var key, action, source;
|
|
242
|
-
return _regenerator.default.wrap(function (
|
|
243
|
-
while (1) switch (
|
|
330
|
+
return _regenerator.default.wrap(function (_context3) {
|
|
331
|
+
while (1) switch (_context3.prev = _context3.next) {
|
|
244
332
|
case 0:
|
|
245
333
|
key = opts.key, action = opts.action;
|
|
246
334
|
source = opts.source || appearance;
|
|
247
335
|
if (!(opts.type === 'client')) {
|
|
248
|
-
|
|
336
|
+
_context3.next = 2;
|
|
249
337
|
break;
|
|
250
338
|
}
|
|
251
|
-
|
|
339
|
+
_context3.next = 1;
|
|
252
340
|
return invokeClientAction({
|
|
253
341
|
actionFn: opts.action.promise,
|
|
254
342
|
actionType: action.type,
|
|
@@ -256,15 +344,15 @@ var useSmartCardActions = exports.useSmartCardActions = function useSmartCardAct
|
|
|
256
344
|
extensionKey: key
|
|
257
345
|
});
|
|
258
346
|
case 1:
|
|
259
|
-
return
|
|
347
|
+
return _context3.abrupt("return", _context3.sent);
|
|
260
348
|
case 2:
|
|
261
349
|
case "end":
|
|
262
|
-
return
|
|
350
|
+
return _context3.stop();
|
|
263
351
|
}
|
|
264
|
-
},
|
|
352
|
+
}, _callee3);
|
|
265
353
|
}));
|
|
266
354
|
return function (_x, _x2) {
|
|
267
|
-
return
|
|
355
|
+
return _ref4.apply(this, arguments);
|
|
268
356
|
};
|
|
269
357
|
}(), [invokeClientAction]);
|
|
270
358
|
return (0, _react.useMemo)(function () {
|
|
@@ -10,6 +10,7 @@ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/
|
|
|
10
10
|
var _react = require("react");
|
|
11
11
|
var _linkExtractors = require("@atlaskit/link-extractors");
|
|
12
12
|
var _linkProvider = require("@atlaskit/link-provider");
|
|
13
|
+
var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
|
|
13
14
|
var _constants = require("../../../constants");
|
|
14
15
|
var _analytics = require("../../analytics");
|
|
15
16
|
var _useResponse2 = _interopRequireDefault(require("../use-response"));
|
|
@@ -26,20 +27,12 @@ var useResolve = function useResolve() {
|
|
|
26
27
|
handleResolvedLinkResponse = _useResponse.handleResolvedLinkResponse,
|
|
27
28
|
handleResolvedLinkError = _useResponse.handleResolvedLinkError;
|
|
28
29
|
return (0, _react.useCallback)( /*#__PURE__*/function () {
|
|
29
|
-
var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(
|
|
30
|
-
var isReloading,
|
|
31
|
-
isMetadataRequest,
|
|
32
|
-
id,
|
|
33
|
-
_ref2,
|
|
34
|
-
details,
|
|
35
|
-
hasData,
|
|
36
|
-
_args = arguments;
|
|
30
|
+
var _ref = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(params) {
|
|
31
|
+
var url, _params$isReloading, isReloading, _params$isMetadataReq, isMetadataRequest, _params$id, id, appearance, _ref2, details, hasData, metadataStatus;
|
|
37
32
|
return _regenerator.default.wrap(function (_context) {
|
|
38
33
|
while (1) switch (_context.prev = _context.next) {
|
|
39
34
|
case 0:
|
|
40
|
-
isReloading =
|
|
41
|
-
isMetadataRequest = _args.length > 2 && _args[2] !== undefined ? _args[2] : false;
|
|
42
|
-
id = _args.length > 3 && _args[3] !== undefined ? _args[3] : '';
|
|
35
|
+
url = params.url, _params$isReloading = params.isReloading, isReloading = _params$isReloading === void 0 ? false : _params$isReloading, _params$isMetadataReq = params.isMetadataRequest, isMetadataRequest = _params$isMetadataReq === void 0 ? false : _params$isMetadataReq, _params$id = params.id, id = _params$id === void 0 ? '' : _params$id, appearance = params.appearance;
|
|
43
36
|
_ref2 = getState()[url] || {
|
|
44
37
|
status: _constants.SmartLinkStatus.Pending,
|
|
45
38
|
details: undefined
|
|
@@ -49,8 +42,9 @@ var useResolve = function useResolve() {
|
|
|
49
42
|
_context.next = 1;
|
|
50
43
|
break;
|
|
51
44
|
}
|
|
52
|
-
|
|
53
|
-
|
|
45
|
+
metadataStatus = appearance === 'inline' && !isMetadataRequest && (0, _platformFeatureFlags.fg)('platform_smartlink_inline_resolve_optimization') ? 'pending' : undefined;
|
|
46
|
+
return _context.abrupt("return", connections.client.fetchData(url, isReloading, appearance).then(function (response) {
|
|
47
|
+
return handleResolvedLinkResponse(url, response, isReloading, isMetadataRequest, metadataStatus);
|
|
54
48
|
}).catch(function (error) {
|
|
55
49
|
return handleResolvedLinkError(url, error, undefined, isMetadataRequest);
|
|
56
50
|
}));
|
|
@@ -8,6 +8,7 @@ var _react = require("react");
|
|
|
8
8
|
var _reactDom = require("react-dom");
|
|
9
9
|
var _linkProvider = require("@atlaskit/link-provider");
|
|
10
10
|
var _linkingCommon = require("@atlaskit/linking-common");
|
|
11
|
+
var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
|
|
11
12
|
var _constants = require("../../../constants");
|
|
12
13
|
var _jsonld = require("../../../utils/jsonld");
|
|
13
14
|
var _constants2 = require("../../actions/constants");
|
|
@@ -77,8 +78,9 @@ var useResponse = function useResponse() {
|
|
|
77
78
|
}
|
|
78
79
|
}, [getState, setMetadataStatus, dispatch]);
|
|
79
80
|
var handleResolvedLinkSuccess = (0, _react.useCallback)(function (resourceUrl, response, isReloading, isMetadataRequest) {
|
|
80
|
-
|
|
81
|
-
|
|
81
|
+
var metadataStatus = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 'resolved';
|
|
82
|
+
// Some optimized resolves intentionally leave metadata pending so hover can fetch it.
|
|
83
|
+
setMetadataStatus(resourceUrl, (0, _platformFeatureFlags.fg)('platform_smartlink_inline_resolve_optimization') ? metadataStatus : 'resolved');
|
|
82
84
|
// Dispatch Analytics and resolved card action - including unauthorized states.
|
|
83
85
|
if (isReloading) {
|
|
84
86
|
dispatch((0, _linkingCommon.cardAction)(_linkingCommon.ACTION_RELOADING, {
|
|
@@ -93,6 +95,10 @@ var useResponse = function useResponse() {
|
|
|
93
95
|
var handleResolvedLinkResponse = (0, _react.useCallback)(function (resourceUrl, response) {
|
|
94
96
|
var isReloading = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
|
|
95
97
|
var isMetadataRequest = arguments.length > 3 ? arguments[3] : undefined;
|
|
98
|
+
var metadataStatus = arguments.length > 4 ? arguments[4] : undefined;
|
|
99
|
+
if (!resourceUrl) {
|
|
100
|
+
return;
|
|
101
|
+
}
|
|
96
102
|
var hostname = new URL(resourceUrl).hostname;
|
|
97
103
|
var nextStatus = response ? (0, _linkingCommon.getStatus)(response) : 'fatal';
|
|
98
104
|
|
|
@@ -122,7 +128,7 @@ var useResponse = function useResponse() {
|
|
|
122
128
|
* https://react-redux.js.org/api/batch
|
|
123
129
|
*/
|
|
124
130
|
(0, _reactDom.unstable_batchedUpdates)(function () {
|
|
125
|
-
handleResolvedLinkSuccess(resourceUrl, response, isReloading, isMetadataRequest);
|
|
131
|
+
handleResolvedLinkSuccess(resourceUrl, response, isReloading, isMetadataRequest, metadataStatus);
|
|
126
132
|
});
|
|
127
133
|
}, [handleResolvedLinkError, handleResolvedLinkSuccess, hasAuthFlowSupported]);
|
|
128
134
|
return (0, _react.useMemo)(function () {
|
|
@@ -10,7 +10,8 @@ var _asyncToGenerator2 = _interopRequireDefault(require("@babel/runtime/helpers/
|
|
|
10
10
|
var _react = require("react");
|
|
11
11
|
var _linkProvider = require("@atlaskit/link-provider");
|
|
12
12
|
var _linkingCommon = require("@atlaskit/linking-common");
|
|
13
|
-
|
|
13
|
+
var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
|
|
14
|
+
function usePrefetch(url, appearance) {
|
|
14
15
|
var _useSmartLinkContext = (0, _linkProvider.useSmartLinkContext)(),
|
|
15
16
|
store = _useSmartLinkContext.store,
|
|
16
17
|
prefetchStore = _useSmartLinkContext.prefetchStore,
|
|
@@ -54,7 +55,7 @@ function usePrefetch(url) {
|
|
|
54
55
|
// we create between browser -> ORS when making network requests.
|
|
55
56
|
_context.prev = 2;
|
|
56
57
|
_context.next = 3;
|
|
57
|
-
return client.prefetchData(url);
|
|
58
|
+
return client.prefetchData(url, appearance);
|
|
58
59
|
case 3:
|
|
59
60
|
response = _context.sent;
|
|
60
61
|
// Once the data comes back, we put the link in the `resolved` status. This ensures
|
|
@@ -66,11 +67,11 @@ function usePrefetch(url) {
|
|
|
66
67
|
url: url,
|
|
67
68
|
payload: response
|
|
68
69
|
});
|
|
69
|
-
// Put the metadata
|
|
70
|
-
//
|
|
70
|
+
// Put the metadata status: 'pending' for inline appearance when FG is on, so HoverCard
|
|
71
|
+
// can upgrade to full block data. Otherwise 'resolved' preserves existing behaviour.
|
|
71
72
|
dispatch((0, _linkingCommon.cardAction)(_linkingCommon.ACTION_UPDATE_METADATA_STATUS, {
|
|
72
73
|
url: url
|
|
73
|
-
}, undefined, undefined, 'resolved'));
|
|
74
|
+
}, undefined, undefined, appearance === 'inline' && (0, _platformFeatureFlags.fg)('platform_smartlink_inline_resolve_optimization') ? 'pending' : 'resolved'));
|
|
74
75
|
}
|
|
75
76
|
_context.next = 5;
|
|
76
77
|
break;
|
|
@@ -82,5 +83,5 @@ function usePrefetch(url) {
|
|
|
82
83
|
return _context.stop();
|
|
83
84
|
}
|
|
84
85
|
}, _callee, null, [[2, 4]]);
|
|
85
|
-
})), [store, prefetchStore, connections, url, getState, client, dispatch]);
|
|
86
|
+
})), [store, prefetchStore, connections, url, getState, client, dispatch, appearance]);
|
|
86
87
|
}
|
|
@@ -8,11 +8,20 @@ exports.useSmartLink = useSmartLink;
|
|
|
8
8
|
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
9
9
|
var _react = require("react");
|
|
10
10
|
var _linkProvider = require("@atlaskit/link-provider");
|
|
11
|
+
var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
|
|
11
12
|
var _actions = require("../actions");
|
|
12
13
|
var _config = require("../config");
|
|
13
14
|
var _renderers = require("../renderers");
|
|
14
15
|
var _store = require("../store");
|
|
15
|
-
|
|
16
|
+
/**
|
|
17
|
+
* Hook for smart link state and actions.
|
|
18
|
+
* @param id - Unique identifier for the smart link
|
|
19
|
+
* @param url - The URL to resolve
|
|
20
|
+
* @param appearance - Card appearance hint for ORS to optimize response payload.
|
|
21
|
+
* When 'inline', ORS returns minimal data (title, status).
|
|
22
|
+
* When 'block' or 'embed', ORS returns full data including summary.
|
|
23
|
+
*/
|
|
24
|
+
function useSmartLink(id, url, appearance) {
|
|
16
25
|
var state = (0, _store.useSmartCardState)(url);
|
|
17
26
|
var _useSmartLinkContext = (0, _linkProvider.useSmartLinkContext)(),
|
|
18
27
|
store = _useSmartLinkContext.store,
|
|
@@ -27,9 +36,9 @@ function useSmartLink(id, url) {
|
|
|
27
36
|
_useState2 = (0, _slicedToArray2.default)(_useState, 2),
|
|
28
37
|
error = _useState2[0],
|
|
29
38
|
setError = _useState2[1];
|
|
30
|
-
// Register the current card.
|
|
39
|
+
// Register the current card with appearance hint for optimized ORS response.
|
|
31
40
|
var register = function register() {
|
|
32
|
-
actions.register().catch(function (err) {
|
|
41
|
+
actions.register((0, _platformFeatureFlags.fg)('platform_smartlink_inline_resolve_optimization') ? appearance : undefined).catch(function (err) {
|
|
33
42
|
return setError(err);
|
|
34
43
|
});
|
|
35
44
|
};
|
|
@@ -47,7 +47,9 @@ function useSmartLinkActions(_ref) {
|
|
|
47
47
|
details: linkState.details
|
|
48
48
|
});
|
|
49
49
|
if ((0, _expValEquals.expValEquals)('platform_hover_card_preview_panel', 'cohort', 'test') && prefetch && !linkState.details) {
|
|
50
|
-
resolve(
|
|
50
|
+
resolve({
|
|
51
|
+
url: url
|
|
52
|
+
});
|
|
51
53
|
}
|
|
52
54
|
if (linkState.details && !(actionOptions !== null && actionOptions !== void 0 && actionOptions.hide)) {
|
|
53
55
|
var actions = [];
|
|
@@ -11,7 +11,7 @@ var ANALYTICS_CHANNEL = exports.ANALYTICS_CHANNEL = 'media';
|
|
|
11
11
|
var context = exports.context = {
|
|
12
12
|
componentName: 'smart-cards',
|
|
13
13
|
packageName: "@atlaskit/smart-card" || '',
|
|
14
|
-
packageVersion: "44.24.
|
|
14
|
+
packageVersion: "44.24.2" || ''
|
|
15
15
|
};
|
|
16
16
|
var TrackQuickActionType = exports.TrackQuickActionType = /*#__PURE__*/function (TrackQuickActionType) {
|
|
17
17
|
TrackQuickActionType["StatusUpdate"] = "StatusUpdate";
|
|
@@ -36,7 +36,7 @@ function LazyIntersectionObserverCardOld(props) {
|
|
|
36
36
|
var appearance = props.appearance,
|
|
37
37
|
url = props.url,
|
|
38
38
|
id = props.id;
|
|
39
|
-
var prefetch = (0, _state.usePrefetch)(url);
|
|
39
|
+
var prefetch = (0, _state.usePrefetch)(url, appearance);
|
|
40
40
|
var Component = appearance === 'inline' ? 'span' : 'div';
|
|
41
41
|
var ComponentObserver = Component;
|
|
42
42
|
var onIntersection = (0, _react.useCallback)(function (entries, observer) {
|
|
@@ -77,7 +77,10 @@ function Component(_ref) {
|
|
|
77
77
|
}, [children, ui]);
|
|
78
78
|
|
|
79
79
|
// Get state, actions for this card.
|
|
80
|
-
|
|
80
|
+
// appearance is pre-resolved by the caller (loader.tsx for Card, ssr.tsx for CardSSR):
|
|
81
|
+
// FlexibleCards are always passed appearance='block' when FG is on, so component.tsx
|
|
82
|
+
// simply consumes whatever appearance it receives.
|
|
83
|
+
var _useSmartLink = (0, _state.useSmartLink)(id, url, appearance),
|
|
81
84
|
state = _useSmartLink.state,
|
|
82
85
|
actions = _useSmartLink.actions,
|
|
83
86
|
config = _useSmartLink.config,
|
|
@@ -270,12 +273,31 @@ function Component(_ref) {
|
|
|
270
273
|
});
|
|
271
274
|
}
|
|
272
275
|
}, [fire3PClickEvent, shouldFire3PClickEvent]);
|
|
276
|
+
var reload = actions.reload;
|
|
273
277
|
var handleAuthorize = (0, _react.useCallback)(function () {
|
|
274
278
|
return actions.authorize(appearance);
|
|
275
279
|
}, [actions, appearance]);
|
|
276
280
|
var handleRetry = (0, _react.useCallback)(function () {
|
|
277
|
-
|
|
278
|
-
}, [
|
|
281
|
+
reload();
|
|
282
|
+
}, [reload]);
|
|
283
|
+
var hasMounted = (0, _react.useRef)(false);
|
|
284
|
+
var prevAppearance = (0, _react.useRef)(appearance);
|
|
285
|
+
|
|
286
|
+
// When appearance changes from inline to non-inline on a mounted card
|
|
287
|
+
// (e.g. direct consumer changes inline → block/embed), reload with the new appearance
|
|
288
|
+
// so ORS can return the appropriate full data. We intentionally do NOT reload on
|
|
289
|
+
// block → embed or embed → block transitions since both already have full ORS data.
|
|
290
|
+
(0, _react.useEffect)(function () {
|
|
291
|
+
if (!hasMounted.current) {
|
|
292
|
+
hasMounted.current = true;
|
|
293
|
+
prevAppearance.current = appearance;
|
|
294
|
+
return;
|
|
295
|
+
}
|
|
296
|
+
if (prevAppearance.current === 'inline' && appearance !== 'inline' && (0, _platformFeatureFlags.fg)('platform_smartlink_inline_resolve_optimization')) {
|
|
297
|
+
reload(appearance);
|
|
298
|
+
}
|
|
299
|
+
prevAppearance.current = appearance;
|
|
300
|
+
}, [appearance, reload]);
|
|
279
301
|
var handleInvoke = (0, _react.useCallback)(function (opts) {
|
|
280
302
|
return actions.invoke(opts, appearance);
|
|
281
303
|
}, [actions, appearance]);
|
|
@@ -13,6 +13,7 @@ var _react = _interopRequireWildcard(require("react"));
|
|
|
13
13
|
var _reactErrorBoundary = require("react-error-boundary");
|
|
14
14
|
var _reactMagneticDi = require("react-magnetic-di");
|
|
15
15
|
var _uuid = _interopRequireDefault(require("uuid"));
|
|
16
|
+
var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
|
|
16
17
|
var _useAnalyticsEvents2 = require("../../common/analytics/generated/use-analytics-events");
|
|
17
18
|
var _analytics = require("../../state/analytics");
|
|
18
19
|
var _utils = require("../../utils");
|
|
@@ -123,10 +124,15 @@ function CardWithURLRenderer(props) {
|
|
|
123
124
|
var ErrorFallback = function ErrorFallback() {
|
|
124
125
|
return /*#__PURE__*/_react.default.createElement(FallbackComponent, null);
|
|
125
126
|
};
|
|
127
|
+
|
|
128
|
+
// FlexibleCards always need full ORS data regardless of appearance prop,
|
|
129
|
+
// because they render custom blocks (TitleBlock etc.) requiring complete response.
|
|
130
|
+
// Override appearance to 'block' for all FlexibleCards when FG is enabled.
|
|
131
|
+
var effectiveAppearance = isFlexibleUi && (0, _platformFeatureFlags.fg)('platform_smartlink_inline_resolve_optimization') ? 'block' : appearance;
|
|
126
132
|
var cardWithUrlProps = {
|
|
127
133
|
id: id,
|
|
128
134
|
url: url,
|
|
129
|
-
appearance:
|
|
135
|
+
appearance: effectiveAppearance,
|
|
130
136
|
onClick: onClick,
|
|
131
137
|
isSelected: isSelected,
|
|
132
138
|
isHovered: isHovered,
|
|
@@ -19,7 +19,10 @@ var useEmbedResolvePostMessageListener = exports.useEmbedResolvePostMessageListe
|
|
|
19
19
|
}
|
|
20
20
|
var isFromExpectedIframe = embedIframeRef && event.source === ((_embedIframeRef$curre = embedIframeRef.current) === null || _embedIframeRef$curre === void 0 ? void 0 : _embedIframeRef$curre.contentWindow);
|
|
21
21
|
if (event.data === 'force-resolve-smart-link' && isFromExpectedIframe) {
|
|
22
|
-
resolve(
|
|
22
|
+
resolve({
|
|
23
|
+
url: url,
|
|
24
|
+
isReloading: true
|
|
25
|
+
});
|
|
23
26
|
}
|
|
24
27
|
};
|
|
25
28
|
window.addEventListener('message', messageCallback);
|
|
@@ -65,7 +65,11 @@ var ServerAction = function ServerAction(_ref) {
|
|
|
65
65
|
break;
|
|
66
66
|
}
|
|
67
67
|
_context.next = 3;
|
|
68
|
-
return reload(
|
|
68
|
+
return reload({
|
|
69
|
+
url: action.reload.url,
|
|
70
|
+
isReloading: true,
|
|
71
|
+
id: action.reload.id
|
|
72
|
+
});
|
|
69
73
|
case 3:
|
|
70
74
|
setIsLoading(false);
|
|
71
75
|
if (onClick) {
|
|
@@ -192,7 +192,11 @@ var LozengeAction = function LozengeAction(_ref) {
|
|
|
192
192
|
break;
|
|
193
193
|
}
|
|
194
194
|
_context2.next = 2;
|
|
195
|
-
return reload(
|
|
195
|
+
return reload({
|
|
196
|
+
url: url,
|
|
197
|
+
isReloading: true,
|
|
198
|
+
id: linkId
|
|
199
|
+
});
|
|
196
200
|
case 2:
|
|
197
201
|
_context2.next = 4;
|
|
198
202
|
break;
|
|
@@ -10,6 +10,7 @@ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")
|
|
|
10
10
|
var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutProperties"));
|
|
11
11
|
var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
|
|
12
12
|
var _react = _interopRequireWildcard(require("react"));
|
|
13
|
+
var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
|
|
13
14
|
var _popup = _interopRequireDefault(require("@atlaskit/popup"));
|
|
14
15
|
var _experiments = require("@atlaskit/tmp-editor-statsig/experiments");
|
|
15
16
|
var _constants = require("../../../constants");
|
|
@@ -144,7 +145,7 @@ var HoverCardComponent = exports.HoverCardComponent = function HoverCardComponen
|
|
|
144
145
|
// to minimize the loading state
|
|
145
146
|
var initResolve = (0, _react.useCallback)(function () {
|
|
146
147
|
// this check covers both non-SSR (status) & SSR case (metadataStatus)
|
|
147
|
-
var isLinkUnresolved = linkState.status === 'pending' || !linkState.metadataStatus;
|
|
148
|
+
var isLinkUnresolved = linkState.status === 'pending' || !linkState.metadataStatus || linkState.status === 'resolved' && linkState.metadataStatus === 'pending' && (0, _platformFeatureFlags.fg)('platform_smartlink_inline_resolve_optimization');
|
|
148
149
|
if (!resolveTimeOutId.current && isLinkUnresolved) {
|
|
149
150
|
resolveTimeOutId.current = setTimeout(function () {
|
|
150
151
|
if (linkState.status === 'pending') {
|
|
@@ -19,7 +19,7 @@ var _excluded = ["href", "children", "checkSafety", "onClick", "testId", "isLink
|
|
|
19
19
|
_excluded2 = ["isLinkSafe", "showSafetyWarningModal"];
|
|
20
20
|
var PACKAGE_DATA = {
|
|
21
21
|
packageName: "@atlaskit/smart-card",
|
|
22
|
-
packageVersion: "44.24.
|
|
22
|
+
packageVersion: "44.24.2",
|
|
23
23
|
componentName: 'linkUrl'
|
|
24
24
|
};
|
|
25
25
|
var LinkUrl = function LinkUrl(_ref) {
|
|
@@ -38,7 +38,10 @@ const extractAction = (response, id, actionOptions, appearance, origin, fireEven
|
|
|
38
38
|
appearance,
|
|
39
39
|
fireEvent,
|
|
40
40
|
id,
|
|
41
|
-
onClose: resolve ? () => url && resolve(
|
|
41
|
+
onClose: resolve ? () => url && resolve({
|
|
42
|
+
url,
|
|
43
|
+
isReloading: true
|
|
44
|
+
}) : undefined,
|
|
42
45
|
origin,
|
|
43
46
|
response,
|
|
44
47
|
isPreviewPanelAvailable,
|