@atlaskit/smart-card 45.22.6 → 45.23.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 (61) hide show
  1. package/CHANGELOG.md +15 -0
  2. package/dist/cjs/entry-points/hover.js +21 -0
  3. package/dist/cjs/hoverCard.js +2 -2
  4. package/dist/cjs/state/hooks/use-resolve/index.js +7 -5
  5. package/dist/cjs/state/hooks/use-response/index.js +17 -5
  6. package/dist/cjs/utils/analytics/analytics.js +1 -1
  7. package/dist/cjs/view/CardWithUrl/component-lazy/LazyIntersectionObserverCard.js +1 -1
  8. package/dist/cjs/view/FlexibleCard/components/container/hover-card-control/index.js +1 -1
  9. package/dist/cjs/view/HoverCard/index.js +58 -14
  10. package/dist/cjs/view/InlineCard/ErroredView/index.js +1 -1
  11. package/dist/cjs/view/InlineCard/ForbiddenView/index.js +1 -1
  12. package/dist/cjs/view/InlineCard/ResolvedView/InlineCardResolvedViewFunctional.js +1 -1
  13. package/dist/cjs/view/InlineCard/ResolvedView/index.js +1 -1
  14. package/dist/cjs/view/InlineCard/UnauthorisedView/index.js +1 -1
  15. package/dist/cjs/view/LinkUrl/index.js +1 -1
  16. package/dist/es2019/entry-points/hover.js +9 -0
  17. package/dist/es2019/hoverCard.js +1 -3
  18. package/dist/es2019/state/hooks/use-resolve/index.js +7 -4
  19. package/dist/es2019/state/hooks/use-response/index.js +17 -5
  20. package/dist/es2019/utils/analytics/analytics.js +1 -1
  21. package/dist/es2019/view/CardWithUrl/component-lazy/LazyIntersectionObserverCard.js +1 -1
  22. package/dist/es2019/view/FlexibleCard/components/container/hover-card-control/index.js +1 -1
  23. package/dist/es2019/view/HoverCard/index.js +52 -7
  24. package/dist/es2019/view/InlineCard/ErroredView/index.js +1 -1
  25. package/dist/es2019/view/InlineCard/ForbiddenView/index.js +1 -1
  26. package/dist/es2019/view/InlineCard/ResolvedView/InlineCardResolvedViewFunctional.js +1 -1
  27. package/dist/es2019/view/InlineCard/ResolvedView/index.js +1 -1
  28. package/dist/es2019/view/InlineCard/UnauthorisedView/index.js +1 -1
  29. package/dist/es2019/view/LinkUrl/index.js +1 -1
  30. package/dist/esm/entry-points/hover.js +13 -0
  31. package/dist/esm/hoverCard.js +1 -3
  32. package/dist/esm/state/hooks/use-resolve/index.js +7 -5
  33. package/dist/esm/state/hooks/use-response/index.js +17 -5
  34. package/dist/esm/utils/analytics/analytics.js +1 -1
  35. package/dist/esm/view/CardWithUrl/component-lazy/LazyIntersectionObserverCard.js +1 -1
  36. package/dist/esm/view/FlexibleCard/components/container/hover-card-control/index.js +1 -1
  37. package/dist/esm/view/HoverCard/index.js +51 -7
  38. package/dist/esm/view/InlineCard/ErroredView/index.js +1 -1
  39. package/dist/esm/view/InlineCard/ForbiddenView/index.js +1 -1
  40. package/dist/esm/view/InlineCard/ResolvedView/InlineCardResolvedViewFunctional.js +1 -1
  41. package/dist/esm/view/InlineCard/ResolvedView/index.js +1 -1
  42. package/dist/esm/view/InlineCard/UnauthorisedView/index.js +1 -1
  43. package/dist/esm/view/LinkUrl/index.js +1 -1
  44. package/dist/types/entry-points/hover.d.ts +7 -0
  45. package/dist/types/hoverCard.d.ts +1 -3
  46. package/dist/types/view/HoverCard/components/ContentContainer.d.ts +10 -1
  47. package/dist/types/view/HoverCard/components/HoverCardComponent.d.ts +8 -1
  48. package/dist/types/view/HoverCard/components/HoverCardContent.d.ts +22 -2
  49. package/dist/types/view/HoverCard/components/ImagePreview.d.ts +5 -1
  50. package/dist/types/view/HoverCard/index.d.ts +8 -6
  51. package/dist/types/view/HoverCard/types.d.ts +22 -6
  52. package/hover/package.json +4 -4
  53. package/package.json +4 -4
  54. package/dist/cjs/view/HoverCard/HoverCard.js +0 -63
  55. package/dist/cjs/view/HoverCard/StandaloneHoverCard.js +0 -15
  56. package/dist/es2019/view/HoverCard/HoverCard.js +0 -55
  57. package/dist/es2019/view/HoverCard/StandaloneHoverCard.js +0 -6
  58. package/dist/esm/view/HoverCard/HoverCard.js +0 -54
  59. package/dist/esm/view/HoverCard/StandaloneHoverCard.js +0 -8
  60. package/dist/types/view/HoverCard/HoverCard.d.ts +0 -10
  61. package/dist/types/view/HoverCard/StandaloneHoverCard.d.ts +0 -6
package/CHANGELOG.md CHANGED
@@ -1,5 +1,20 @@
1
1
  # @atlaskit/smart-card
2
2
 
3
+ ## 45.23.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`67e2f90d073f8`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/67e2f90d073f8) -
8
+ Refactor hover card entry points and mark its internal props that were expose unintentionally
9
+ durng volt migration as deprecated
10
+
11
+ ### Patch Changes
12
+
13
+ - [`ec5808c03c48f`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/ec5808c03c48f) -
14
+ Avoid redundant full block resolves and preserve concurrent appearance payloads for
15
+ platform_smartlink_inline_resolve_optimization.
16
+ - Updated dependencies
17
+
3
18
  ## 45.22.6
4
19
 
5
20
  ### Patch Changes
@@ -0,0 +1,21 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.StandaloneHoverCard = exports.HoverCard = void 0;
8
+ var _react = _interopRequireDefault(require("react"));
9
+ var _HoverCard = require("../view/HoverCard");
10
+ /* eslint-disable @repo/internal/deprecations/deprecation-ticket-required -- VOLTC-139 tracks removal of these deprecated re-export shims. */
11
+
12
+ var HoverCard = exports.HoverCard = function HoverCard(props) {
13
+ return /*#__PURE__*/_react.default.createElement(_HoverCard.HoverCard, props);
14
+ };
15
+
16
+ /**
17
+ * @deprecated Use `import { HoverCard } from '@atlaskit/smart-card/hover'` instead.
18
+ */
19
+ var StandaloneHoverCard = exports.StandaloneHoverCard = function StandaloneHoverCard(props) {
20
+ return /*#__PURE__*/_react.default.createElement(_HoverCard.HoverCard, props);
21
+ };
@@ -6,7 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  Object.defineProperty(exports, "HoverCard", {
7
7
  enumerable: true,
8
8
  get: function get() {
9
- return _StandaloneHoverCard.StandaloneHoverCard;
9
+ return _hover.HoverCard;
10
10
  }
11
11
  });
12
- var _StandaloneHoverCard = require("./view/HoverCard/StandaloneHoverCard");
12
+ var _hover = require("./entry-points/hover");
@@ -28,7 +28,7 @@ var useResolve = function useResolve() {
28
28
  handleResolvedLinkError = _useResponse.handleResolvedLinkError;
29
29
  return (0, _react.useCallback)( /*#__PURE__*/function () {
30
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, isOptimizedBlockRequest, _ref2, details, hasData, shouldForceFetch, metadataStatus;
31
+ var url, _params$isReloading, isReloading, _params$isMetadataReq, isMetadataRequest, _params$id, id, appearance, isOptimizedBlockRequest, _ref2, details, currentMetadataStatus, hasData, needsOptimizedBlockData, shouldForceFetch, metadataStatus;
32
32
  return _regenerator.default.wrap(function (_context) {
33
33
  while (1) switch (_context.prev = _context.next) {
34
34
  case 0:
@@ -37,15 +37,17 @@ var useResolve = function useResolve() {
37
37
  _ref2 = getState()[url] || {
38
38
  status: _constants.SmartLinkStatus.Pending,
39
39
  details: undefined
40
- }, details = _ref2.details;
40
+ }, details = _ref2.details, currentMetadataStatus = _ref2.metadataStatus;
41
41
  hasData = !!(details && details.data || (0, _isEntityPresent.isEntityPresent)(details));
42
- if (!(isReloading || !hasData || isMetadataRequest || isOptimizedBlockRequest)) {
42
+ needsOptimizedBlockData = isOptimizedBlockRequest && currentMetadataStatus !== 'resolved';
43
+ if (!(isReloading || !hasData || isMetadataRequest || needsOptimizedBlockData)) {
43
44
  _context.next = 1;
44
45
  break;
45
46
  }
46
47
  // A reduced inline response can populate the shared resolver cache before an initial
47
- // block request completes, so every optimized block request must bypass that cache.
48
- shouldForceFetch = isReloading || isOptimizedBlockRequest;
48
+ // block request completes. Bypass that cache until full metadata has been resolved,
49
+ // then reuse the full block response for subsequent block cards with the same URL.
50
+ shouldForceFetch = isReloading || needsOptimizedBlockData;
49
51
  metadataStatus = appearance === 'inline' && !isMetadataRequest && (0, _fg.fg)('platform_smartlink_inline_resolve_optimization') ? 'pending' : undefined;
50
52
  return _context.abrupt("return", connections.client.fetchData(url, shouldForceFetch, appearance).then(function (response) {
51
53
  return handleResolvedLinkResponse(url, response, shouldForceFetch, isMetadataRequest, metadataStatus);
@@ -80,12 +80,24 @@ var useResponse = function useResponse() {
80
80
  }
81
81
  }, [getState, setMetadataStatus, dispatch]);
82
82
  var handleResolvedLinkSuccess = (0, _react.useCallback)(function (resourceUrl, response, isReloading, isMetadataRequest) {
83
+ var _getState$resourceUrl;
83
84
  var metadataStatus = arguments.length > 4 && arguments[4] !== undefined ? arguments[4] : 'resolved';
84
- // Some optimized resolves intentionally leave metadata pending so hover can fetch it.
85
- // Check response status before evaluating the feature gate so non-resolved responses
86
- // do not fire a gate exposure when the gate result would be ignored.
85
+ /**
86
+ * Metadata status scenarios:
87
+ * - Gate off, or a non-resolved response: use `resolved`, preserving legacy behavior and
88
+ * avoiding a gate exposure when the result would not affect the status.
89
+ * - Gate on with full metadata: use the provided/default `resolved` status.
90
+ * - Gate on with reduced inline metadata: use the provided `pending` status so block or
91
+ * hover rendering knows to request the full metadata later.
92
+ * - Reduced inline metadata arriving after full metadata: keep the existing `resolved`
93
+ * status so an out-of-order response cannot trigger another full request.
94
+ * - Explicit reload: allow `pending` even after full metadata, because the caller is
95
+ * intentionally replacing the existing data.
96
+ */
87
97
  var shouldUseProvidedMetadataStatus = (0, _getStatus.getStatus)(response) === 'resolved' && (0, _fg.fg)('platform_smartlink_inline_resolve_optimization');
88
- setMetadataStatus(resourceUrl, shouldUseProvidedMetadataStatus ? metadataStatus : 'resolved');
98
+ var shouldPreserveResolvedMetadata = shouldUseProvidedMetadataStatus && metadataStatus === 'pending' && !isReloading && ((_getState$resourceUrl = getState()[resourceUrl]) === null || _getState$resourceUrl === void 0 ? void 0 : _getState$resourceUrl.metadataStatus) === 'resolved';
99
+ var nextMetadataStatus = shouldUseProvidedMetadataStatus && !shouldPreserveResolvedMetadata ? metadataStatus : 'resolved';
100
+ setMetadataStatus(resourceUrl, nextMetadataStatus);
89
101
  // Dispatch Analytics and resolved card action - including unauthorized states.
90
102
  if (isReloading) {
91
103
  dispatch((0, _actions.cardAction)(_actions.ACTION_RELOADING, {
@@ -96,7 +108,7 @@ var useResponse = function useResponse() {
96
108
  url: resourceUrl
97
109
  }, response, undefined, undefined, isMetadataRequest));
98
110
  }
99
- }, [setMetadataStatus, dispatch]);
111
+ }, [getState, setMetadataStatus, dispatch]);
100
112
  var handleResolvedLinkResponse = (0, _react.useCallback)(function (resourceUrl, response) {
101
113
  var isReloading = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
102
114
  var isMetadataRequest = arguments.length > 3 ? arguments[3] : undefined;
@@ -24,7 +24,7 @@ var ANALYTICS_CHANNEL = exports.ANALYTICS_CHANNEL = 'media';
24
24
  var context = exports.context = {
25
25
  componentName: 'smart-cards',
26
26
  packageName: "@atlaskit/smart-card" || '',
27
- packageVersion: "45.22.5" || ''
27
+ packageVersion: "45.22.6" || ''
28
28
  };
29
29
  var TrackQuickActionType = exports.TrackQuickActionType = /*#__PURE__*/function (TrackQuickActionType) {
30
30
  TrackQuickActionType["StatusUpdate"] = "StatusUpdate";
@@ -32,7 +32,7 @@ var LazyIntersectionObserverCard = exports.LazyIntersectionObserverCard = functi
32
32
  onErrorCallback = props.onError,
33
33
  ui = props.ui,
34
34
  url = props.url;
35
- var prefetch = (0, _usePrefetch.usePrefetch)(url);
35
+ var prefetch = (0, _usePrefetch.usePrefetch)(url, appearance);
36
36
  var ComponentObserver = appearance === 'inline' ? 'span' : 'div';
37
37
  var _useSmartLinkSeenEven = (0, _useSmartLinkSeenEvent.useSmartLinkSeenEvent)({
38
38
  appearance: appearance,
@@ -10,7 +10,7 @@ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/sli
10
10
  var _react = _interopRequireWildcard(require("react"));
11
11
  var _constants = require("../../../../../constants");
12
12
  var _noop = require("../../../../../utils/noop");
13
- var _HoverCard = require("../../../../HoverCard/HoverCard");
13
+ var _HoverCard = require("../../../../HoverCard");
14
14
  function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
15
15
  var FLEXIBLE_HOVER_CARD_CAN_OPEN_DELAY = 100;
16
16
  var HoverCardControl = function HoverCardControl(_ref) {
@@ -1,19 +1,63 @@
1
1
  "use strict";
2
2
 
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof = require("@babel/runtime/helpers/typeof");
3
5
  Object.defineProperty(exports, "__esModule", {
4
6
  value: true
5
7
  });
6
- Object.defineProperty(exports, "HoverCard", {
7
- enumerable: true,
8
- get: function get() {
9
- return _HoverCard.HoverCard;
10
- }
11
- });
12
- Object.defineProperty(exports, "StandaloneHoverCard", {
13
- enumerable: true,
14
- get: function get() {
15
- return _StandaloneHoverCard.StandaloneHoverCard;
16
- }
17
- });
18
- var _HoverCard = require("./HoverCard");
19
- var _StandaloneHoverCard = require("./StandaloneHoverCard");
8
+ exports.HoverCard = void 0;
9
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
10
+ var _react = _interopRequireWildcard(require("react"));
11
+ var _reactErrorBoundary = require("react-error-boundary");
12
+ var _reactMagneticDi = require("react-magnetic-di");
13
+ var _withAnalyticsEvents = _interopRequireDefault(require("@atlaskit/analytics-next/withAnalyticsEvents"));
14
+ var _useAnalyticsEvents2 = require("../../common/analytics/generated/use-analytics-events");
15
+ var _constants = require("../../constants");
16
+ var _failUfoExperience = require("../../state/analytics/failUfoExperience");
17
+ var _startUfoExperience = require("../../state/analytics/startUfoExperience");
18
+ var _SmartLinkModalProvider = require("../../state/modal/SmartLinkModalProvider");
19
+ var _useSmartLinkAnalyticsContext = require("../../utils/analytics/useSmartLinkAnalyticsContext");
20
+ var _HoverCardComponent = require("./components/HoverCardComponent");
21
+ function _interopRequireWildcard(e, t) { if ("function" == typeof WeakMap) var r = new WeakMap(), n = new WeakMap(); return (_interopRequireWildcard = function _interopRequireWildcard(e, t) { if (!t && e && e.__esModule) return e; var o, i, f = { __proto__: null, default: e }; if (null === e || "object" != _typeof(e) && "function" != typeof e) return f; if (o = t ? n : r) { if (o.has(e)) return o.get(e); o.set(e, f); } for (var _t in e) "default" !== _t && {}.hasOwnProperty.call(e, _t) && ((i = (o = Object.defineProperty) && Object.getOwnPropertyDescriptor(e, _t)) && (i.get || i.set) ? o(f, _t, i) : f[_t] = e[_t]); return f; })(e, t); }
22
+ function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
23
+ function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { (0, _defineProperty2.default)(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
24
+ var HoverCardWithErrorBoundary = function HoverCardWithErrorBoundary(props) {
25
+ var _useAnalyticsEvents = (0, _useAnalyticsEvents2.useAnalyticsEvents)(),
26
+ fireEvent = _useAnalyticsEvents.fireEvent;
27
+ var url = props.url,
28
+ id = props.id,
29
+ children = props.children;
30
+ var analyticsContext = (0, _useSmartLinkAnalyticsContext.useSmartLinkAnalyticsContext)({
31
+ display: _constants.CardDisplay.HoverCardPreview,
32
+ id: id,
33
+ source: _HoverCardComponent.HOVER_CARD_SOURCE,
34
+ url: url
35
+ });
36
+ var onError = (0, _react.useCallback)(function (error, info) {
37
+ (0, _startUfoExperience.startUfoExperience)('smart-link-rendered', id || 'NULL');
38
+ (0, _failUfoExperience.failUfoExperience)('smart-link-rendered', id || 'NULL');
39
+ (0, _failUfoExperience.failUfoExperience)('smart-link-authenticated', id || 'NULL');
40
+ fireEvent('ui.smartLink.renderFailed', _objectSpread(_objectSpread({}, analyticsContext === null || analyticsContext === void 0 ? void 0 : analyticsContext.attributes), {}, {
41
+ display: _constants.CardDisplay.HoverCardPreview,
42
+ id: id !== null && id !== void 0 ? id : null,
43
+ error: error,
44
+ errorInfo: info
45
+ }));
46
+ }, [analyticsContext, id, fireEvent]);
47
+ return /*#__PURE__*/_react.default.createElement(_reactErrorBoundary.ErrorBoundary, {
48
+ fallback: children,
49
+ onError: onError
50
+ }, /*#__PURE__*/_react.default.createElement(_SmartLinkModalProvider.SmartLinkModalProvider, null, /*#__PURE__*/_react.default.createElement(_HoverCardComponent.HoverCardComponent, props, children)));
51
+ };
52
+ var HoverCardWithoutAnalyticsContext = (0, _withAnalyticsEvents.default)()(HoverCardWithErrorBoundary);
53
+
54
+ /**
55
+ * A hover preview component using within smart links,
56
+ * e.g. inline card's hover preview and auth tooltip, flexible card's hover preview.
57
+ *
58
+ * This component contains additional props that smart-card internal components
59
+ * use to configure hover preview behaviour.
60
+ */
61
+ var HoverCard = exports.HoverCard = function HoverCard(props) {
62
+ return /*#__PURE__*/_react.default.createElement(HoverCardWithoutAnalyticsContext, props);
63
+ };
@@ -11,7 +11,7 @@ var _react = _interopRequireDefault(require("react"));
11
11
  var _reactIntl = require("react-intl");
12
12
  var _statusError = _interopRequireDefault(require("@atlaskit/icon/core/status-error"));
13
13
  var _messages = require("../../../messages");
14
- var _HoverCard = require("../../HoverCard/HoverCard");
14
+ var _HoverCard = require("../../HoverCard");
15
15
  var _Frame = require("../Frame");
16
16
  var _IconAndTitleLayout = require("../IconAndTitleLayout");
17
17
  var _actionButton = require("../common/action-button");
@@ -15,7 +15,7 @@ var _reactIntl = require("react-intl");
15
15
  var _lockLocked = _interopRequireDefault(require("@atlaskit/icon/core/lock-locked"));
16
16
  var _compiled = require("@atlaskit/primitives/compiled");
17
17
  var _messages = require("../../../messages");
18
- var _HoverCard = require("../../HoverCard/HoverCard");
18
+ var _HoverCard = require("../../HoverCard");
19
19
  var _Frame = require("../Frame");
20
20
  var _IconAndTitleLayout = require("../IconAndTitleLayout");
21
21
  var _actionButton = require("../common/action-button");
@@ -7,7 +7,7 @@ Object.defineProperty(exports, "__esModule", {
7
7
  exports.InlineCardResolvedViewFunctional = InlineCardResolvedViewFunctional;
8
8
  var _react = _interopRequireDefault(require("react"));
9
9
  var _useInlineTailoredActions = _interopRequireDefault(require("../../../state/hooks/use-inline-tailored-actions"));
10
- var _HoverCard = require("../../HoverCard/HoverCard");
10
+ var _HoverCard = require("../../HoverCard");
11
11
  var _Frame = require("../Frame");
12
12
  var _IconAndTitleLayout = require("../IconAndTitleLayout");
13
13
  var _rovoActionsCta = require("../common/rovo-actions-cta");
@@ -14,7 +14,7 @@ var _inherits2 = _interopRequireDefault(require("@babel/runtime/helpers/inherits
14
14
  var _react = _interopRequireDefault(require("react"));
15
15
  var _componentWithFg = require("@atlaskit/platform-feature-flags-react/component-with-fg");
16
16
  var _fg = require("@atlaskit/platform-feature-flags/fg");
17
- var _HoverCard = require("../../HoverCard/HoverCard");
17
+ var _HoverCard = require("../../HoverCard");
18
18
  var _Frame = require("../Frame");
19
19
  var _IconAndTitleLayout = require("../IconAndTitleLayout");
20
20
  var _inlineLozenge = _interopRequireDefault(require("../common/inline-lozenge"));
@@ -20,7 +20,7 @@ var _expValEquals = require("@atlaskit/tmp-editor-statsig/exp-val-equals");
20
20
  var _useAnalyticsEvents2 = require("../../../common/analytics/generated/use-analytics-events");
21
21
  var _messages = require("../../../messages");
22
22
  var _getCachedProviderPctMapAndRefresh = require("../../../state/services/personalization/getCachedProviderPctMapAndRefresh");
23
- var _HoverCard = require("../../HoverCard/HoverCard");
23
+ var _HoverCard = require("../../HoverCard");
24
24
  var _Frame = require("../Frame");
25
25
  var _IconAndTitleLayout = require("../IconAndTitleLayout");
26
26
  var _actionButton = require("../common/action-button");
@@ -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: "45.22.5",
22
+ packageVersion: "45.22.6",
23
23
  componentName: 'linkUrl'
24
24
  };
25
25
  var LinkUrl = function LinkUrl(_ref) {
@@ -0,0 +1,9 @@
1
+ /* eslint-disable @repo/internal/deprecations/deprecation-ticket-required -- VOLTC-139 tracks removal of these deprecated re-export shims. */
2
+ import React from 'react';
3
+ import { HoverCard as HoverCardComponent } from '../view/HoverCard';
4
+ export const HoverCard = props => /*#__PURE__*/React.createElement(HoverCardComponent, props);
5
+
6
+ /**
7
+ * @deprecated Use `import { HoverCard } from '@atlaskit/smart-card/hover'` instead.
8
+ */
9
+ export const StandaloneHoverCard = props => /*#__PURE__*/React.createElement(HoverCardComponent, props);
@@ -1,11 +1,9 @@
1
1
  /* eslint-disable @repo/internal/deprecations/deprecation-ticket-required -- VOLTC-139 tracks removal of these deprecated re-export shims. */
2
- /** @deprecated Use @atlaskit/smart-card/hover */
3
2
  /**
4
3
  * @deprecated Use `import { HoverCard } from '@atlaskit/smart-card/hover'` instead.
5
4
  */
6
- export { StandaloneHoverCard as HoverCard } from './view/HoverCard/StandaloneHoverCard';
5
+ export { HoverCard } from './entry-points/hover';
7
6
 
8
- /** @deprecated Use @atlaskit/smart-card/hover/types */
9
7
  /**
10
8
  * @deprecated Use `import type { HoverCardProps } from '@atlaskit/smart-card/hover/types'` instead.
11
9
  */
@@ -31,16 +31,19 @@ const useResolve = () => {
31
31
  } = params;
32
32
  const isOptimizedBlockRequest = appearance === 'block' && fg('platform_smartlink_inline_resolve_optimization');
33
33
  const {
34
- details
34
+ details,
35
+ metadataStatus: currentMetadataStatus
35
36
  } = getState()[url] || {
36
37
  status: SmartLinkStatus.Pending,
37
38
  details: undefined
38
39
  };
39
40
  const hasData = !!(details && details.data || isEntityPresent(details));
40
- if (isReloading || !hasData || isMetadataRequest || isOptimizedBlockRequest) {
41
+ const needsOptimizedBlockData = isOptimizedBlockRequest && currentMetadataStatus !== 'resolved';
42
+ if (isReloading || !hasData || isMetadataRequest || needsOptimizedBlockData) {
41
43
  // A reduced inline response can populate the shared resolver cache before an initial
42
- // block request completes, so every optimized block request must bypass that cache.
43
- const shouldForceFetch = isReloading || isOptimizedBlockRequest;
44
+ // block request completes. Bypass that cache until full metadata has been resolved,
45
+ // then reuse the full block response for subsequent block cards with the same URL.
46
+ const shouldForceFetch = isReloading || needsOptimizedBlockData;
44
47
  const metadataStatus = appearance === 'inline' && !isMetadataRequest && fg('platform_smartlink_inline_resolve_optimization') ? 'pending' : undefined;
45
48
  return connections.client.fetchData(url, shouldForceFetch, appearance).then(response => handleResolvedLinkResponse(url, response, shouldForceFetch, isMetadataRequest, metadataStatus)).catch(error => handleResolvedLinkError(url, error, undefined, isMetadataRequest));
46
49
  } else {
@@ -78,11 +78,23 @@ const useResponse = () => {
78
78
  }
79
79
  }, [getState, setMetadataStatus, dispatch]);
80
80
  const handleResolvedLinkSuccess = useCallback((resourceUrl, response, isReloading, isMetadataRequest, metadataStatus = 'resolved') => {
81
- // Some optimized resolves intentionally leave metadata pending so hover can fetch it.
82
- // Check response status before evaluating the feature gate so non-resolved responses
83
- // do not fire a gate exposure when the gate result would be ignored.
81
+ var _getState$resourceUrl;
82
+ /**
83
+ * Metadata status scenarios:
84
+ * - Gate off, or a non-resolved response: use `resolved`, preserving legacy behavior and
85
+ * avoiding a gate exposure when the result would not affect the status.
86
+ * - Gate on with full metadata: use the provided/default `resolved` status.
87
+ * - Gate on with reduced inline metadata: use the provided `pending` status so block or
88
+ * hover rendering knows to request the full metadata later.
89
+ * - Reduced inline metadata arriving after full metadata: keep the existing `resolved`
90
+ * status so an out-of-order response cannot trigger another full request.
91
+ * - Explicit reload: allow `pending` even after full metadata, because the caller is
92
+ * intentionally replacing the existing data.
93
+ */
84
94
  const shouldUseProvidedMetadataStatus = getStatus(response) === 'resolved' && fg('platform_smartlink_inline_resolve_optimization');
85
- setMetadataStatus(resourceUrl, shouldUseProvidedMetadataStatus ? metadataStatus : 'resolved');
95
+ const shouldPreserveResolvedMetadata = shouldUseProvidedMetadataStatus && metadataStatus === 'pending' && !isReloading && ((_getState$resourceUrl = getState()[resourceUrl]) === null || _getState$resourceUrl === void 0 ? void 0 : _getState$resourceUrl.metadataStatus) === 'resolved';
96
+ const nextMetadataStatus = shouldUseProvidedMetadataStatus && !shouldPreserveResolvedMetadata ? metadataStatus : 'resolved';
97
+ setMetadataStatus(resourceUrl, nextMetadataStatus);
86
98
  // Dispatch Analytics and resolved card action - including unauthorized states.
87
99
  if (isReloading) {
88
100
  dispatch(cardAction(ACTION_RELOADING, {
@@ -93,7 +105,7 @@ const useResponse = () => {
93
105
  url: resourceUrl
94
106
  }, response, undefined, undefined, isMetadataRequest));
95
107
  }
96
- }, [setMetadataStatus, dispatch]);
108
+ }, [getState, setMetadataStatus, dispatch]);
97
109
  const handleResolvedLinkResponse = useCallback((resourceUrl, response, isReloading = false, isMetadataRequest, metadataStatus) => {
98
110
  if (!resourceUrl) {
99
111
  return;
@@ -3,7 +3,7 @@ export const ANALYTICS_CHANNEL = 'media';
3
3
  export const context = {
4
4
  componentName: 'smart-cards',
5
5
  packageName: "@atlaskit/smart-card" || '',
6
- packageVersion: "45.22.5" || ''
6
+ packageVersion: "45.22.6" || ''
7
7
  };
8
8
  export let TrackQuickActionType = /*#__PURE__*/function (TrackQuickActionType) {
9
9
  TrackQuickActionType["StatusUpdate"] = "StatusUpdate";
@@ -19,7 +19,7 @@ export const LazyIntersectionObserverCard = props => {
19
19
  ui,
20
20
  url
21
21
  } = props;
22
- const prefetch = usePrefetch(url);
22
+ const prefetch = usePrefetch(url, appearance);
23
23
  const ComponentObserver = appearance === 'inline' ? 'span' : 'div';
24
24
  const {
25
25
  onIntersecting: onSeenIntersecting,
@@ -1,7 +1,7 @@
1
1
  import React, { useCallback, useEffect, useRef, useState } from 'react';
2
2
  import { ElementName } from '../../../../../constants';
3
3
  import { noop } from '../../../../../utils/noop';
4
- import { HoverCard } from '../../../../HoverCard/HoverCard';
4
+ import { HoverCard } from '../../../../HoverCard';
5
5
  const FLEXIBLE_HOVER_CARD_CAN_OPEN_DELAY = 100;
6
6
  const HoverCardControl = ({
7
7
  children,
@@ -1,10 +1,55 @@
1
- /* eslint-disable @repo/internal/deprecations/deprecation-ticket-required -- VOLTC-139 tracks removal of these deprecated re-export shims. */
1
+ import React, { useCallback } from 'react';
2
+ import { ErrorBoundary } from 'react-error-boundary';
3
+ import { di } from 'react-magnetic-di';
4
+ import withAnalyticsEvents from '@atlaskit/analytics-next/withAnalyticsEvents';
5
+ import { useAnalyticsEvents } from '../../common/analytics/generated/use-analytics-events';
6
+ import { CardDisplay } from '../../constants';
7
+ import { failUfoExperience } from '../../state/analytics/failUfoExperience';
8
+ import { startUfoExperience } from '../../state/analytics/startUfoExperience';
9
+ import { SmartLinkModalProvider } from '../../state/modal/SmartLinkModalProvider';
10
+ import { useSmartLinkAnalyticsContext } from '../../utils/analytics/useSmartLinkAnalyticsContext';
11
+ import { HOVER_CARD_SOURCE, HoverCardComponent } from './components/HoverCardComponent';
12
+ const HoverCardWithErrorBoundary = props => {
13
+ const {
14
+ fireEvent
15
+ } = useAnalyticsEvents();
16
+ const {
17
+ url,
18
+ id,
19
+ children
20
+ } = props;
21
+ const analyticsContext = useSmartLinkAnalyticsContext({
22
+ display: CardDisplay.HoverCardPreview,
23
+ id,
24
+ source: HOVER_CARD_SOURCE,
25
+ url
26
+ });
27
+ const onError = useCallback((error, info) => {
28
+ startUfoExperience('smart-link-rendered', id || 'NULL');
29
+ failUfoExperience('smart-link-rendered', id || 'NULL');
30
+ failUfoExperience('smart-link-authenticated', id || 'NULL');
31
+ fireEvent('ui.smartLink.renderFailed', {
32
+ ...(analyticsContext === null || analyticsContext === void 0 ? void 0 : analyticsContext.attributes),
33
+ display: CardDisplay.HoverCardPreview,
34
+ id: id !== null && id !== void 0 ? id : null,
35
+ error: error,
36
+ errorInfo: info
37
+ });
38
+ }, [analyticsContext, id, fireEvent]);
39
+ return /*#__PURE__*/React.createElement(ErrorBoundary, {
40
+ fallback: children,
41
+ onError: onError
42
+ }, /*#__PURE__*/React.createElement(SmartLinkModalProvider, null, /*#__PURE__*/React.createElement(HoverCardComponent, props, children)));
43
+ };
44
+ const HoverCardWithoutAnalyticsContext = withAnalyticsEvents()(HoverCardWithErrorBoundary);
2
45
 
3
46
  /**
4
- * @deprecated Use `import { HoverCard } from '@atlaskit/smart-card/hover-card'` instead.
47
+ * A hover preview component using within smart links,
48
+ * e.g. inline card's hover preview and auth tooltip, flexible card's hover preview.
49
+ *
50
+ * This component contains additional props that smart-card internal components
51
+ * use to configure hover preview behaviour.
5
52
  */
6
- export { HoverCard } from './HoverCard';
7
- /**
8
- * @deprecated Use `import { StandaloneHoverCard } from '@atlaskit/smart-card/hover'` instead.
9
- */
10
- export { StandaloneHoverCard } from './StandaloneHoverCard';
53
+ export const HoverCard = props => {
54
+ return /*#__PURE__*/React.createElement(HoverCardWithoutAnalyticsContext, props);
55
+ };
@@ -4,7 +4,7 @@ import React from 'react';
4
4
  import { FormattedMessage } from 'react-intl';
5
5
  import ErrorIcon from '@atlaskit/icon/core/status-error';
6
6
  import { messages } from '../../../messages';
7
- import { HoverCard } from '../../HoverCard/HoverCard';
7
+ import { HoverCard } from '../../HoverCard';
8
8
  import { Frame } from '../Frame';
9
9
  import { IconAndTitleLayout } from '../IconAndTitleLayout';
10
10
  import { ActionButton } from '../common/action-button';
@@ -7,7 +7,7 @@ import { FormattedMessage } from 'react-intl';
7
7
  import LockLockedIcon from '@atlaskit/icon/core/lock-locked';
8
8
  import { Pressable } from '@atlaskit/primitives/compiled';
9
9
  import { messages } from '../../../messages';
10
- import { HoverCard } from '../../HoverCard/HoverCard';
10
+ import { HoverCard } from '../../HoverCard';
11
11
  import { Frame } from '../Frame';
12
12
  import { IconAndTitleLayout } from '../IconAndTitleLayout';
13
13
  import { ActionButton } from '../common/action-button';
@@ -1,6 +1,6 @@
1
1
  import React from 'react';
2
2
  import useInlineTailoredAction from '../../../state/hooks/use-inline-tailored-actions';
3
- import { HoverCard } from '../../HoverCard/HoverCard';
3
+ import { HoverCard } from '../../HoverCard';
4
4
  import { Frame } from '../Frame';
5
5
  import { IconAndTitleLayout } from '../IconAndTitleLayout';
6
6
  import { InlineRovoActionButton } from '../common/rovo-actions-cta';
@@ -1,7 +1,7 @@
1
1
  import React from 'react';
2
2
  import { componentWithFG } from '@atlaskit/platform-feature-flags-react/component-with-fg';
3
3
  import { fg } from '@atlaskit/platform-feature-flags/fg';
4
- import { HoverCard } from '../../HoverCard/HoverCard';
4
+ import { HoverCard } from '../../HoverCard';
5
5
  import { Frame } from '../Frame';
6
6
  import { IconAndTitleLayout } from '../IconAndTitleLayout';
7
7
  import InlineLozenge from '../common/inline-lozenge';
@@ -13,7 +13,7 @@ import { expValEquals } from '@atlaskit/tmp-editor-statsig/exp-val-equals';
13
13
  import { useAnalyticsEvents } from '../../../common/analytics/generated/use-analytics-events';
14
14
  import { messages } from '../../../messages';
15
15
  import { getCachedProviderPctMapAndRefresh } from '../../../state/services/personalization/getCachedProviderPctMapAndRefresh';
16
- import { HoverCard } from '../../HoverCard/HoverCard';
16
+ import { HoverCard } from '../../HoverCard';
17
17
  import { Frame } from '../Frame';
18
18
  import { IconAndTitleLayout } from '../IconAndTitleLayout';
19
19
  import { ActionButton } from '../common/action-button';
@@ -9,7 +9,7 @@ import LinkWarningModal from './LinkWarningModal';
9
9
  import { useLinkWarningModal } from './LinkWarningModal/hooks/use-link-warning-modal';
10
10
  const PACKAGE_DATA = {
11
11
  packageName: "@atlaskit/smart-card",
12
- packageVersion: "45.22.5",
12
+ packageVersion: "45.22.6",
13
13
  componentName: 'linkUrl'
14
14
  };
15
15
  const LinkUrl = ({
@@ -0,0 +1,13 @@
1
+ /* eslint-disable @repo/internal/deprecations/deprecation-ticket-required -- VOLTC-139 tracks removal of these deprecated re-export shims. */
2
+ import React from 'react';
3
+ import { HoverCard as HoverCardComponent } from '../view/HoverCard';
4
+ export var HoverCard = function HoverCard(props) {
5
+ return /*#__PURE__*/React.createElement(HoverCardComponent, props);
6
+ };
7
+
8
+ /**
9
+ * @deprecated Use `import { HoverCard } from '@atlaskit/smart-card/hover'` instead.
10
+ */
11
+ export var StandaloneHoverCard = function StandaloneHoverCard(props) {
12
+ return /*#__PURE__*/React.createElement(HoverCardComponent, props);
13
+ };
@@ -1,11 +1,9 @@
1
1
  /* eslint-disable @repo/internal/deprecations/deprecation-ticket-required -- VOLTC-139 tracks removal of these deprecated re-export shims. */
2
- /** @deprecated Use @atlaskit/smart-card/hover */
3
2
  /**
4
3
  * @deprecated Use `import { HoverCard } from '@atlaskit/smart-card/hover'` instead.
5
4
  */
6
- export { StandaloneHoverCard as HoverCard } from './view/HoverCard/StandaloneHoverCard';
5
+ export { HoverCard } from './entry-points/hover';
7
6
 
8
- /** @deprecated Use @atlaskit/smart-card/hover/types */
9
7
  /**
10
8
  * @deprecated Use `import type { HoverCardProps } from '@atlaskit/smart-card/hover/types'` instead.
11
9
  */
@@ -21,7 +21,7 @@ var useResolve = function useResolve() {
21
21
  handleResolvedLinkError = _useResponse.handleResolvedLinkError;
22
22
  return useCallback( /*#__PURE__*/function () {
23
23
  var _ref = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee(params) {
24
- var url, _params$isReloading, isReloading, _params$isMetadataReq, isMetadataRequest, _params$id, id, appearance, isOptimizedBlockRequest, _ref2, details, hasData, shouldForceFetch, metadataStatus;
24
+ var url, _params$isReloading, isReloading, _params$isMetadataReq, isMetadataRequest, _params$id, id, appearance, isOptimizedBlockRequest, _ref2, details, currentMetadataStatus, hasData, needsOptimizedBlockData, shouldForceFetch, metadataStatus;
25
25
  return _regeneratorRuntime.wrap(function (_context) {
26
26
  while (1) switch (_context.prev = _context.next) {
27
27
  case 0:
@@ -30,15 +30,17 @@ var useResolve = function useResolve() {
30
30
  _ref2 = getState()[url] || {
31
31
  status: SmartLinkStatus.Pending,
32
32
  details: undefined
33
- }, details = _ref2.details;
33
+ }, details = _ref2.details, currentMetadataStatus = _ref2.metadataStatus;
34
34
  hasData = !!(details && details.data || isEntityPresent(details));
35
- if (!(isReloading || !hasData || isMetadataRequest || isOptimizedBlockRequest)) {
35
+ needsOptimizedBlockData = isOptimizedBlockRequest && currentMetadataStatus !== 'resolved';
36
+ if (!(isReloading || !hasData || isMetadataRequest || needsOptimizedBlockData)) {
36
37
  _context.next = 1;
37
38
  break;
38
39
  }
39
40
  // A reduced inline response can populate the shared resolver cache before an initial
40
- // block request completes, so every optimized block request must bypass that cache.
41
- shouldForceFetch = isReloading || isOptimizedBlockRequest;
41
+ // block request completes. Bypass that cache until full metadata has been resolved,
42
+ // then reuse the full block response for subsequent block cards with the same URL.
43
+ shouldForceFetch = isReloading || needsOptimizedBlockData;
42
44
  metadataStatus = appearance === 'inline' && !isMetadataRequest && fg('platform_smartlink_inline_resolve_optimization') ? 'pending' : undefined;
43
45
  return _context.abrupt("return", connections.client.fetchData(url, shouldForceFetch, appearance).then(function (response) {
44
46
  return handleResolvedLinkResponse(url, response, shouldForceFetch, isMetadataRequest, metadataStatus);