@atlaskit/smart-card 44.24.2 → 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.
Files changed (63) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/cjs/extractors/flexible/extract-state.js +4 -1
  3. package/dist/cjs/ssr.js +14 -3
  4. package/dist/cjs/state/actions/index.js +111 -23
  5. package/dist/cjs/state/hooks/use-resolve/index.js +7 -13
  6. package/dist/cjs/state/hooks/use-response/index.js +9 -3
  7. package/dist/cjs/state/hooks/usePrefetch.js +7 -6
  8. package/dist/cjs/state/hooks/useSmartLink.js +12 -3
  9. package/dist/cjs/state/hooks-external/useSmartLinkActions.js +3 -1
  10. package/dist/cjs/utils/analytics/analytics.js +1 -1
  11. package/dist/cjs/view/CardWithUrl/component-lazy/LazyIntersectionObserverCard.js +1 -1
  12. package/dist/cjs/view/CardWithUrl/component.js +25 -3
  13. package/dist/cjs/view/CardWithUrl/loader.js +7 -1
  14. package/dist/cjs/view/EmbedCard/useEmbedResolvePostMessageListener.js +4 -1
  15. package/dist/cjs/view/FlexibleCard/components/actions/action/server-action/index.js +5 -1
  16. package/dist/cjs/view/FlexibleCard/components/elements/common/base-lozenge-element/lozenge-action/index.js +5 -1
  17. package/dist/cjs/view/HoverCard/components/HoverCardComponent.js +2 -1
  18. package/dist/cjs/view/LinkUrl/index.js +1 -1
  19. package/dist/es2019/extractors/flexible/extract-state.js +4 -1
  20. package/dist/es2019/ssr.js +14 -3
  21. package/dist/es2019/state/actions/index.js +85 -12
  22. package/dist/es2019/state/hooks/use-resolve/index.js +11 -2
  23. package/dist/es2019/state/hooks/use-response/index.js +9 -5
  24. package/dist/es2019/state/hooks/usePrefetch.js +8 -7
  25. package/dist/es2019/state/hooks/useSmartLink.js +13 -3
  26. package/dist/es2019/state/hooks-external/useSmartLinkActions.js +3 -1
  27. package/dist/es2019/utils/analytics/analytics.js +1 -1
  28. package/dist/es2019/view/CardWithUrl/component-lazy/LazyIntersectionObserverCard.js +1 -1
  29. package/dist/es2019/view/CardWithUrl/component.js +28 -4
  30. package/dist/es2019/view/CardWithUrl/loader.js +7 -1
  31. package/dist/es2019/view/EmbedCard/useEmbedResolvePostMessageListener.js +4 -1
  32. package/dist/es2019/view/FlexibleCard/components/actions/action/server-action/index.js +5 -1
  33. package/dist/es2019/view/FlexibleCard/components/elements/common/base-lozenge-element/lozenge-action/index.js +5 -1
  34. package/dist/es2019/view/HoverCard/components/HoverCardComponent.js +2 -1
  35. package/dist/es2019/view/LinkUrl/index.js +1 -1
  36. package/dist/esm/extractors/flexible/extract-state.js +4 -1
  37. package/dist/esm/ssr.js +14 -3
  38. package/dist/esm/state/actions/index.js +111 -23
  39. package/dist/esm/state/hooks/use-resolve/index.js +7 -13
  40. package/dist/esm/state/hooks/use-response/index.js +9 -3
  41. package/dist/esm/state/hooks/usePrefetch.js +7 -6
  42. package/dist/esm/state/hooks/useSmartLink.js +13 -3
  43. package/dist/esm/state/hooks-external/useSmartLinkActions.js +3 -1
  44. package/dist/esm/utils/analytics/analytics.js +1 -1
  45. package/dist/esm/view/CardWithUrl/component-lazy/LazyIntersectionObserverCard.js +1 -1
  46. package/dist/esm/view/CardWithUrl/component.js +26 -4
  47. package/dist/esm/view/CardWithUrl/loader.js +7 -1
  48. package/dist/esm/view/EmbedCard/useEmbedResolvePostMessageListener.js +4 -1
  49. package/dist/esm/view/FlexibleCard/components/actions/action/server-action/index.js +5 -1
  50. package/dist/esm/view/FlexibleCard/components/elements/common/base-lozenge-element/lozenge-action/index.js +5 -1
  51. package/dist/esm/view/HoverCard/components/HoverCardComponent.js +2 -1
  52. package/dist/esm/view/LinkUrl/index.js +1 -1
  53. package/dist/types/state/actions/index.d.ts +3 -2
  54. package/dist/types/state/hooks/use-resolve/index.d.ts +9 -1
  55. package/dist/types/state/hooks/use-response/index.d.ts +2 -2
  56. package/dist/types/state/hooks/usePrefetch.d.ts +2 -1
  57. package/dist/types/state/hooks/useSmartLink.d.ts +14 -6
  58. package/dist/types-ts4.5/state/actions/index.d.ts +3 -2
  59. package/dist/types-ts4.5/state/hooks/use-resolve/index.d.ts +9 -1
  60. package/dist/types-ts4.5/state/hooks/use-response/index.d.ts +2 -2
  61. package/dist/types-ts4.5/state/hooks/usePrefetch.d.ts +2 -1
  62. package/dist/types-ts4.5/state/hooks/useSmartLink.d.ts +14 -6
  63. package/package.json +6 -3
package/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
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
+
3
16
  ## 44.24.2
4
17
 
5
18
  ### 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(url, true);
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 = cardProps.appearance === 'inline' ? 'span' : 'div';
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(resourceUrl, isReloading, isMetadataRequest, id));
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
- var register = (0, _react.useCallback)(function () {
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
- return resolve();
138
- }, [getSmartLinkState, resolve, dispatch, url, setMetadataStatus]);
139
- var reload = (0, _react.useCallback)(function () {
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 (definitionId) {
144
- (0, _helpers.getByDefinitionId)(definitionId, getState()).map(function (url) {
145
- return resolve(url, true);
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
- resolve(url, true);
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
- //metadataStatus will be undefined for SSR links only
155
- if (metadataStatus === undefined) {
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 _ref3 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee2(opts, appearance) {
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 (_context2) {
243
- while (1) switch (_context2.prev = _context2.next) {
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
- _context2.next = 2;
336
+ _context3.next = 2;
249
337
  break;
250
338
  }
251
- _context2.next = 1;
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 _context2.abrupt("return", _context2.sent);
347
+ return _context3.abrupt("return", _context3.sent);
260
348
  case 2:
261
349
  case "end":
262
- return _context2.stop();
350
+ return _context3.stop();
263
351
  }
264
- }, _callee2);
352
+ }, _callee3);
265
353
  }));
266
354
  return function (_x, _x2) {
267
- return _ref3.apply(this, arguments);
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(url) {
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 = _args.length > 1 && _args[1] !== undefined ? _args[1] : false;
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
- return _context.abrupt("return", connections.client.fetchData(url, isReloading).then(function (response) {
53
- return handleResolvedLinkResponse(url, response, isReloading, isMetadataRequest);
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
- //if a link resolves normally, metadata will also always be resolved
81
- setMetadataStatus(resourceUrl, 'resolved');
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
- function usePrefetch(url) {
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 in resolved state, theres no need for a pending or errored state as
70
- // we are following the same render flow as described by the comments above and below.
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
- function useSmartLink(id, url) {
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(url);
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.1" || ''
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
- var _useSmartLink = (0, _state.useSmartLink)(id, url),
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
- actions.reload();
278
- }, [actions]);
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: 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(url, true);
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(action.reload.url, true, undefined, action.reload.id);
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(url, true, undefined, linkId);
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.1",
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(url, true) : undefined,
41
+ onClose: resolve ? () => url && resolve({
42
+ url,
43
+ isReloading: true
44
+ }) : undefined,
42
45
  origin,
43
46
  response,
44
47
  isPreviewPanelAvailable,