@atlaskit/smart-card 44.9.10 → 44.9.11

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 (60) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/cjs/__tests__/vr-tests/__snapshots__/inline-card/inline-card-with-all-card-examples-in-text--default--jfp-magma-platform-lozenge-jump-fix-false.png +0 -0
  3. package/dist/cjs/__tests__/vr-tests/__snapshots__/inline-card/inline-card-with-all-card-examples-in-text--default--jfp-magma-platform-lozenge-jump-fix-true.png +0 -0
  4. package/dist/cjs/__tests__/vr-tests/__snapshots__/link-url-connect-button/linkurl-default-state--default.png +0 -0
  5. package/dist/cjs/state/hooks/use-intersection-observer/index.js +2 -1
  6. package/dist/cjs/state/hooks/use-smart-link-seen-event/index.js +66 -0
  7. package/dist/cjs/utils/analytics/SmartLinkAnalyticsContext.js +31 -8
  8. package/dist/cjs/view/CardWithUrl/card-intersection-observer/index.js +25 -20
  9. package/dist/cjs/view/CardWithUrl/component-lazy/LazyIntersectionObserverCard.js +24 -4
  10. package/dist/cjs/view/CardWithUrl/component.js +0 -30
  11. package/dist/cjs/view/InlineCard/Frame/index.js +3 -2
  12. package/dist/cjs/view/LinkUrl/HyperlinkResolver/index.js +0 -41
  13. package/dist/es2019/__tests__/vr-tests/__snapshots__/inline-card/inline-card-with-all-card-examples-in-text--default--jfp-magma-platform-lozenge-jump-fix-false.png +0 -0
  14. package/dist/es2019/__tests__/vr-tests/__snapshots__/inline-card/inline-card-with-all-card-examples-in-text--default--jfp-magma-platform-lozenge-jump-fix-true.png +0 -0
  15. package/dist/es2019/__tests__/vr-tests/__snapshots__/link-url-connect-button/linkurl-default-state--default.png +0 -0
  16. package/dist/es2019/state/hooks/use-intersection-observer/index.js +2 -1
  17. package/dist/es2019/state/hooks/use-smart-link-seen-event/index.js +60 -0
  18. package/dist/es2019/utils/analytics/SmartLinkAnalyticsContext.js +28 -6
  19. package/dist/es2019/view/CardWithUrl/card-intersection-observer/index.js +28 -11
  20. package/dist/es2019/view/CardWithUrl/component-lazy/LazyIntersectionObserverCard.js +25 -4
  21. package/dist/es2019/view/CardWithUrl/component.js +1 -31
  22. package/dist/es2019/view/InlineCard/Frame/index.js +3 -2
  23. package/dist/es2019/view/LinkUrl/HyperlinkResolver/index.js +1 -40
  24. package/dist/esm/__tests__/vr-tests/__snapshots__/inline-card/inline-card-with-all-card-examples-in-text--default--jfp-magma-platform-lozenge-jump-fix-false.png +0 -0
  25. package/dist/esm/__tests__/vr-tests/__snapshots__/inline-card/inline-card-with-all-card-examples-in-text--default--jfp-magma-platform-lozenge-jump-fix-true.png +0 -0
  26. package/dist/esm/__tests__/vr-tests/__snapshots__/link-url-connect-button/linkurl-default-state--default.png +0 -0
  27. package/dist/esm/state/hooks/use-intersection-observer/index.js +2 -1
  28. package/dist/esm/state/hooks/use-smart-link-seen-event/index.js +60 -0
  29. package/dist/esm/utils/analytics/SmartLinkAnalyticsContext.js +31 -8
  30. package/dist/esm/view/CardWithUrl/card-intersection-observer/index.js +26 -21
  31. package/dist/esm/view/CardWithUrl/component-lazy/LazyIntersectionObserverCard.js +24 -4
  32. package/dist/esm/view/CardWithUrl/component.js +1 -31
  33. package/dist/esm/view/InlineCard/Frame/index.js +3 -2
  34. package/dist/esm/view/LinkUrl/HyperlinkResolver/index.js +1 -42
  35. package/dist/types/state/hooks/use-smart-link-seen-event/index.d.ts +14 -0
  36. package/dist/types/utils/analytics/SmartLinkAnalyticsContext.d.ts +10 -0
  37. package/dist/types/view/CardWithUrl/card-intersection-observer/index.d.ts +3 -5
  38. package/dist/types/view/CardWithUrl/types.d.ts +0 -1
  39. package/dist/types-ts4.5/state/hooks/use-smart-link-seen-event/index.d.ts +14 -0
  40. package/dist/types-ts4.5/utils/analytics/SmartLinkAnalyticsContext.d.ts +10 -0
  41. package/dist/types-ts4.5/view/CardWithUrl/card-intersection-observer/index.d.ts +3 -5
  42. package/dist/types-ts4.5/view/CardWithUrl/types.d.ts +0 -1
  43. package/package.json +4 -1
  44. package/dist/cjs/__tests__/vr-tests/__snapshots__/link-url-connect-button/linkurl-default-state-without-connect-button-functionality--default.png +0 -0
  45. package/dist/cjs/__tests__/vr-tests/__snapshots__/link-url-connect-button/linkurl-resolved-state-with-feature-flag-enabled-should-show-no-connect-button---default--platform-editor-resolve-hyperlinks-killswitch-false.png +0 -0
  46. package/dist/cjs/__tests__/vr-tests/__snapshots__/link-url-connect-button/linkurl-resolved-state-with-feature-flag-enabled-should-show-no-connect-button---default--platform-editor-resolve-hyperlinks-killswitch-true.png +0 -0
  47. package/dist/cjs/__tests__/vr-tests/__snapshots__/link-url-connect-button/linkurl-unauthorized-state-with-connect-button-direct-render---always-visible---default.png +0 -0
  48. package/dist/cjs/view/LinkUrl/HyperlinkResolver/unauthorize-view.js +0 -30
  49. package/dist/es2019/__tests__/vr-tests/__snapshots__/link-url-connect-button/linkurl-default-state-without-connect-button-functionality--default.png +0 -0
  50. package/dist/es2019/__tests__/vr-tests/__snapshots__/link-url-connect-button/linkurl-resolved-state-with-feature-flag-enabled-should-show-no-connect-button---default--platform-editor-resolve-hyperlinks-killswitch-false.png +0 -0
  51. package/dist/es2019/__tests__/vr-tests/__snapshots__/link-url-connect-button/linkurl-resolved-state-with-feature-flag-enabled-should-show-no-connect-button---default--platform-editor-resolve-hyperlinks-killswitch-true.png +0 -0
  52. package/dist/es2019/__tests__/vr-tests/__snapshots__/link-url-connect-button/linkurl-unauthorized-state-with-connect-button-direct-render---always-visible---default.png +0 -0
  53. package/dist/es2019/view/LinkUrl/HyperlinkResolver/unauthorize-view.js +0 -22
  54. package/dist/esm/__tests__/vr-tests/__snapshots__/link-url-connect-button/linkurl-default-state-without-connect-button-functionality--default.png +0 -0
  55. package/dist/esm/__tests__/vr-tests/__snapshots__/link-url-connect-button/linkurl-resolved-state-with-feature-flag-enabled-should-show-no-connect-button---default--platform-editor-resolve-hyperlinks-killswitch-false.png +0 -0
  56. package/dist/esm/__tests__/vr-tests/__snapshots__/link-url-connect-button/linkurl-resolved-state-with-feature-flag-enabled-should-show-no-connect-button---default--platform-editor-resolve-hyperlinks-killswitch-true.png +0 -0
  57. package/dist/esm/__tests__/vr-tests/__snapshots__/link-url-connect-button/linkurl-unauthorized-state-with-connect-button-direct-render---always-visible---default.png +0 -0
  58. package/dist/esm/view/LinkUrl/HyperlinkResolver/unauthorize-view.js +0 -23
  59. package/dist/types/view/LinkUrl/HyperlinkResolver/unauthorize-view.d.ts +0 -10
  60. package/dist/types-ts4.5/view/LinkUrl/HyperlinkResolver/unauthorize-view.d.ts +0 -10
package/CHANGELOG.md CHANGED
@@ -1,9 +1,21 @@
1
1
  # @atlaskit/smart-card
2
2
 
3
+ ## 44.9.11
4
+
5
+ ### Patch Changes
6
+
7
+ - [`657813a2d7397`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/657813a2d7397) -
8
+ Use useRef to prevent CardSSR to re-render on intersecting into viewport
9
+
3
10
  ## 44.9.10
4
11
 
5
12
  ### Patch Changes
6
13
 
14
+ - [`ebab8f80bfc40`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/ebab8f80bfc40) -
15
+ Clean up the platform_linking_bluelink_connect_CONFLUENCE and
16
+ platform_linking_bluelink_connect_jira no ship code
17
+ - [`ebab8f80bfc40`](https://bitbucket.org/atlassian/atlassian-frontend-monorepo/commits/ebab8f80bfc40) -
18
+ NAVX-3611 Fixing the role for inline card when it's an anchor
7
19
  - Updated dependencies
8
20
 
9
21
  ## 44.9.9
@@ -5,6 +5,7 @@ Object.defineProperty(exports, "__esModule", {
5
5
  });
6
6
  exports.default = void 0;
7
7
  var _react = require("react");
8
+ var _utils = require("../../../utils");
8
9
  // This property enables the intersection observer to be run once the
9
10
  // HTML element being observed is within `X` px of the target container it is
10
11
  // being compared to. Since the default container is the `document`, we set this
@@ -33,7 +34,7 @@ var useIntersectionObserver = function useIntersectionObserver(_ref) {
33
34
  }
34
35
  }, []);
35
36
  (0, _react.useEffect)(function () {
36
- if (!ref.current) {
37
+ if (!(0, _utils.isIntersectionObserverSupported)() || !ref.current) {
37
38
  return;
38
39
  }
39
40
  var intersectionObserver = new IntersectionObserver(onIntersection, {
@@ -0,0 +1,66 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.useSmartLinkSeenEvent = useSmartLinkSeenEvent;
7
+ var _react = require("react");
8
+ var _useAnalyticsEvents2 = require("../../../common/analytics/generated/use-analytics-events");
9
+ var _SmartLinkAnalyticsContext = require("../../../utils/analytics/SmartLinkAnalyticsContext");
10
+ var _flexible = require("../../../utils/flexible");
11
+ /**
12
+ * Fires `ui.smartLink.seen` once when a smart link with status `unauthorized`
13
+ * enters the viewport. Uses refs internally so it never causes re-renders,
14
+ * which is important for SSR.
15
+ */
16
+ function useSmartLinkSeenEvent(_ref) {
17
+ var appearance = _ref.appearance,
18
+ children = _ref.children,
19
+ id = _ref.id,
20
+ ui = _ref.ui,
21
+ _ref$url = _ref.url,
22
+ url = _ref$url === void 0 ? '' : _ref$url;
23
+ var _useAnalyticsEvents = (0, _useAnalyticsEvents2.useAnalyticsEvents)(),
24
+ fireEvent = _useAnalyticsEvents.fireEvent;
25
+ var _useSmartLinkAnalytic = (0, _SmartLinkAnalyticsContext.useSmartLinkAnalyticsUtils)(),
26
+ getByUrl = _useSmartLinkAnalytic.getByUrl;
27
+ var getAnalyticsProps = (0, _react.useCallback)(function () {
28
+ var isFlexibleUi = (0, _flexible.isFlexibleUiCard)(children, ui);
29
+ var display = isFlexibleUi ? 'flexible' : appearance;
30
+ return {
31
+ display: display,
32
+ id: id
33
+ };
34
+ }, [appearance, children, id, ui]);
35
+ var statusRef = (0, _react.useRef)();
36
+ var analyticsPropsRef = (0, _react.useRef)(null);
37
+ var hasIntersectedRef = (0, _react.useRef)(false);
38
+ var hasFiredSeenRef = (0, _react.useRef)(false);
39
+ (0, _react.useEffect)(function () {
40
+ analyticsPropsRef.current = getAnalyticsProps();
41
+ }, [getAnalyticsProps]);
42
+ var maybeFireSeenEvent = (0, _react.useCallback)(function () {
43
+ if (!hasFiredSeenRef.current && hasIntersectedRef.current && statusRef.current === 'unauthorized') {
44
+ var payload = getByUrl(url, analyticsPropsRef.current);
45
+ fireEvent('ui.smartLink.seen', payload === null || payload === void 0 ? void 0 : payload.attributes);
46
+ hasFiredSeenRef.current = true;
47
+ }
48
+ }, [fireEvent, getByUrl, url]);
49
+ var onIntersecting = (0, _react.useCallback)(function () {
50
+ if (hasIntersectedRef.current) {
51
+ return;
52
+ }
53
+ hasIntersectedRef.current = true;
54
+ maybeFireSeenEvent();
55
+ }, [maybeFireSeenEvent]);
56
+ var onStatusSettled = (0, _react.useCallback)(function (status) {
57
+ statusRef.current = status;
58
+ maybeFireSeenEvent();
59
+ }, [maybeFireSeenEvent]);
60
+ return (0, _react.useMemo)(function () {
61
+ return {
62
+ onIntersecting: onIntersecting,
63
+ onStatusSettled: onStatusSettled
64
+ };
65
+ }, [onIntersecting, onStatusSettled]);
66
+ }
@@ -5,11 +5,10 @@ var _typeof = require("@babel/runtime/helpers/typeof");
5
5
  Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
- exports.useSmartLinkAnalyticsContext = exports.SmartLinkAnalyticsContext = void 0;
8
+ exports.useSmartLinkAnalyticsUtils = exports.useSmartLinkAnalyticsContext = exports.SmartLinkAnalyticsContext = void 0;
9
9
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
10
10
  var _react = _interopRequireWildcard(require("react"));
11
11
  var _analyticsNext = require("@atlaskit/analytics-next");
12
- var _featureGateJsClient = _interopRequireDefault(require("@atlaskit/feature-gate-js-client"));
13
12
  var _resolvedAttributes = require("@atlaskit/link-analytics/resolved-attributes");
14
13
  var _linkProvider = require("@atlaskit/link-provider");
15
14
  var _linkingCommon = require("@atlaskit/linking-common");
@@ -34,12 +33,9 @@ var getSmartLinkAnalyticsContext = function getSmartLinkAnalyticsContext(_ref) {
34
33
  status = _ref.status,
35
34
  url = _ref.url,
36
35
  error = _ref.error;
37
- var isHyperlinkConnectExperimentEnabled = _featureGateJsClient.default.getExperimentValue('platform_linking_bluelink_connect_confluence', 'isEnabled', false) || _featureGateJsClient.default.getExperimentValue('platform_linking_bluelink_connect_jira', 'isEnabled', false);
38
- var resolvedAttributes = isHyperlinkConnectExperimentEnabled ? getExtendedResolvedAttributes({
36
+ var resolvedAttributes = getExtendedResolvedAttributes({
39
37
  url: url,
40
38
  displayCategory: display === 'url' ? 'link' : 'smartLink'
41
- }, response, status, error) : getExtendedResolvedAttributes({
42
- url: url
43
39
  }, response, status, error);
44
40
  return {
45
41
  source: source,
@@ -53,13 +49,40 @@ var getSmartLinkAnalyticsContext = function getSmartLinkAnalyticsContext(_ref) {
53
49
  * Provides an analytics context data to supply attributes to events based on a URL
54
50
  * and the link state in the store
55
51
  */
52
+ var useSmartLinkAnalyticsUtils = exports.useSmartLinkAnalyticsUtils = function useSmartLinkAnalyticsUtils() {
53
+ var _useSmartLinkContext = (0, _linkProvider.useSmartLinkContext)(),
54
+ store = _useSmartLinkContext.store;
55
+ var getByUrl = (0, _react.useCallback)(function (url, props) {
56
+ var state = store ? (0, _linkingCommon.getUrl)(store, url) : undefined;
57
+ return getSmartLinkAnalyticsContext({
58
+ display: props === null || props === void 0 ? void 0 : props.display,
59
+ id: props === null || props === void 0 ? void 0 : props.id,
60
+ response: state === null || state === void 0 ? void 0 : state.details,
61
+ source: props === null || props === void 0 ? void 0 : props.source,
62
+ status: state === null || state === void 0 ? void 0 : state.status,
63
+ url: url,
64
+ error: state === null || state === void 0 ? void 0 : state.error
65
+ });
66
+ }, [store]);
67
+ return (0, _react.useMemo)(function () {
68
+ return {
69
+ getByUrl: getByUrl
70
+ };
71
+ }, [getByUrl]);
72
+ };
73
+
74
+ /**
75
+ * Provides an analytics context data to supply attributes to events based on a URL
76
+ * and the link state in the store
77
+ * @deprecated Use useSmartLinkAnalyticsUtils instead
78
+ */
56
79
  var useSmartLinkAnalyticsContext = exports.useSmartLinkAnalyticsContext = function useSmartLinkAnalyticsContext(_ref2) {
57
80
  var display = _ref2.display,
58
81
  id = _ref2.id,
59
82
  source = _ref2.source,
60
83
  url = _ref2.url;
61
- var _useSmartLinkContext = (0, _linkProvider.useSmartLinkContext)(),
62
- store = _useSmartLinkContext.store;
84
+ var _useSmartLinkContext2 = (0, _linkProvider.useSmartLinkContext)(),
85
+ store = _useSmartLinkContext2.store;
63
86
  var state = store ? (0, _linkingCommon.getUrl)(store, url) : undefined;
64
87
  return (0, _react.useMemo)(function () {
65
88
  return getSmartLinkAnalyticsContext({
@@ -7,22 +7,36 @@ Object.defineProperty(exports, "__esModule", {
7
7
  });
8
8
  exports.default = void 0;
9
9
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
10
- var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
11
10
  var _react = _interopRequireWildcard(require("react"));
12
11
  var _useIntersectionObserver = _interopRequireDefault(require("../../../state/hooks/use-intersection-observer"));
13
- var _utils = require("../../../utils");
12
+ var _useSmartLinkSeenEvent = require("../../../state/hooks/use-smart-link-seen-event");
14
13
  var _cardLoaderWrapper = _interopRequireDefault(require("../card-loader-wrapper"));
15
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); }
16
15
  var withCardIntersectionObserver = function withCardIntersectionObserver(Component) {
17
16
  return function (props) {
18
17
  // TODO: NAVX-4682: Add feature parity to LazyIntersectionObserverCard for no lazy loading
19
- var _useState = (0, _react.useState)(false),
20
- _useState2 = (0, _slicedToArray2.default)(_useState, 2),
21
- isIntersected = _useState2[0],
22
- setIsIntersected = _useState2[1];
23
- var onIntersecting = (0, _react.useCallback)(function () {
24
- setIsIntersected(true);
25
- }, []);
18
+ var appearance = props.appearance,
19
+ children = props.children,
20
+ id = props.id,
21
+ onErrorCallback = props.onError,
22
+ ui = props.ui,
23
+ _props$url = props.url,
24
+ url = _props$url === void 0 ? '' : _props$url;
25
+ var _useSmartLinkSeenEven = (0, _useSmartLinkSeenEvent.useSmartLinkSeenEvent)({
26
+ appearance: appearance,
27
+ children: children,
28
+ id: id,
29
+ ui: ui,
30
+ url: url
31
+ }),
32
+ onIntersecting = _useSmartLinkSeenEven.onIntersecting,
33
+ onStatusSettled = _useSmartLinkSeenEven.onStatusSettled;
34
+ var onError = (0, _react.useCallback)(function (data) {
35
+ if (data !== null && data !== void 0 && data.status) {
36
+ onStatusSettled(data.status);
37
+ }
38
+ onErrorCallback === null || onErrorCallback === void 0 || onErrorCallback(data);
39
+ }, [onStatusSettled, onErrorCallback]);
26
40
  var ref = (0, _useIntersectionObserver.default)({
27
41
  onIntersecting: onIntersecting
28
42
  });
@@ -30,17 +44,8 @@ var withCardIntersectionObserver = function withCardIntersectionObserver(Compone
30
44
  appearance: props.appearance,
31
45
  ref: ref
32
46
  }, /*#__PURE__*/_react.default.createElement(Component, (0, _extends2.default)({}, props, {
33
- isIntersected: isIntersected
47
+ onError: onError
34
48
  })));
35
49
  };
36
50
  };
37
- var withCardIntersectionObserverFallback = function withCardIntersectionObserverFallback(Component) {
38
- return function (props) {
39
- return /*#__PURE__*/_react.default.createElement(_cardLoaderWrapper.default, {
40
- appearance: props.appearance
41
- }, /*#__PURE__*/_react.default.createElement(Component, props));
42
- };
43
- };
44
- var _default = exports.default = function _default(Component) {
45
- return (0, _utils.isIntersectionObserverSupported)() ? withCardIntersectionObserver(Component) : withCardIntersectionObserverFallback(Component);
46
- };
51
+ var _default = exports.default = withCardIntersectionObserver;
@@ -13,6 +13,7 @@ var _platformFeatureFlagsReact = require("@atlaskit/platform-feature-flags-react
13
13
  var _state = require("../../../state");
14
14
  var _ufoExperiences = require("../../../state/analytics/ufoExperiences");
15
15
  var _useIntersectionObserver = _interopRequireDefault(require("../../../state/hooks/use-intersection-observer"));
16
+ var _useSmartLinkSeenEvent = require("../../../state/hooks/use-smart-link-seen-event");
16
17
  var _shouldSample = require("../../../utils/shouldSample");
17
18
  var _cardLoaderWrapper = _interopRequireDefault(require("../card-loader-wrapper"));
18
19
  var _component = require("../component");
@@ -82,25 +83,44 @@ var LazyIntersectionObserverCardNew = function LazyIntersectionObserverCardNew(p
82
83
  _useState8 = (0, _slicedToArray2.default)(_useState7, 1),
83
84
  shouldSendRenderedUFOEvent = _useState8[0];
84
85
  var appearance = props.appearance,
85
- url = props.url,
86
- id = props.id;
86
+ children = props.children,
87
+ id = props.id,
88
+ onErrorCallback = props.onError,
89
+ ui = props.ui,
90
+ url = props.url;
87
91
  var prefetch = (0, _state.usePrefetch)(url);
88
92
  var ComponentObserver = appearance === 'inline' ? 'span' : 'div';
93
+ var _useSmartLinkSeenEven = (0, _useSmartLinkSeenEvent.useSmartLinkSeenEvent)({
94
+ appearance: appearance,
95
+ children: children,
96
+ id: id,
97
+ ui: ui,
98
+ url: url
99
+ }),
100
+ onSeenIntersecting = _useSmartLinkSeenEven.onIntersecting,
101
+ onStatusSettled = _useSmartLinkSeenEven.onStatusSettled;
102
+ var onError = (0, _react.useCallback)(function (data) {
103
+ if (data !== null && data !== void 0 && data.status) {
104
+ onStatusSettled(data.status);
105
+ }
106
+ onErrorCallback === null || onErrorCallback === void 0 || onErrorCallback(data);
107
+ }, [onStatusSettled, onErrorCallback]);
89
108
  var onIntersection = (0, _react.useCallback)(function (isIntersecting) {
90
109
  if (isIntersecting) {
91
110
  if (shouldSendRenderedUFOEvent) {
92
111
  (0, _ufoExperiences.startUfoExperience)('smart-link-rendered', id);
93
112
  }
113
+ onSeenIntersecting();
94
114
  setIsIntersected(true);
95
115
  } else {
96
116
  prefetch();
97
117
  }
98
- }, [id, prefetch, shouldSendRenderedUFOEvent]);
118
+ }, [id, onSeenIntersecting, prefetch, shouldSendRenderedUFOEvent]);
99
119
  var ref = (0, _useIntersectionObserver.default)({
100
120
  onIntersection: onIntersection
101
121
  });
102
122
  var content = isIntersected ? /*#__PURE__*/_react.default.createElement(_component.CardWithUrlContent, (0, _extends2.default)({}, props, {
103
- isIntersected: true
123
+ onError: onError
104
124
  })) : /*#__PURE__*/_react.default.createElement(ComponentObserver, {
105
125
  ref: ref
106
126
  }, /*#__PURE__*/_react.default.createElement(_LoadingCardLink.LoadingCardLink, props));
@@ -43,7 +43,6 @@ function Component(_ref) {
43
43
  url = _ref.url,
44
44
  isSelected = _ref.isSelected,
45
45
  isHovered = _ref.isHovered,
46
- isIntersected = _ref.isIntersected,
47
46
  frameStyle = _ref.frameStyle,
48
47
  platform = _ref.platform,
49
48
  onClick = _ref.onClick,
@@ -71,7 +70,6 @@ function Component(_ref) {
71
70
  createAnalyticsEvent = _useAnalyticsEventsNe.createAnalyticsEvent;
72
71
  var _useAnalyticsEvents = (0, _useAnalyticsEvents3.useAnalyticsEvents)(),
73
72
  fireEvent = _useAnalyticsEvents.fireEvent;
74
- var hasFiredSeenRef = (0, _react.useRef)(false);
75
73
  var isFlexibleUi = (0, _react.useMemo)(function () {
76
74
  return (0, _flexible.isFlexibleUiCard)(children, ui);
77
75
  }, [children, ui]);
@@ -229,19 +227,6 @@ function Component(_ref) {
229
227
  }));
230
228
  }
231
229
  }, [appearance, extensionKey, fireEvent, id, isFlexibleUi, rovoActionsCtaShown, state.status]);
232
-
233
- // Fire smartLink seen event once on a successful render card is in the viewport
234
- (0, _react.useEffect)(function () {
235
- if ((0, _platformFeatureFlags.fg)('platform_sl_event_ui_seen')) {
236
- if (state.status !== 'unauthorized') return;
237
- if (isIntersected && !hasFiredSeenRef.current) {
238
- fireEvent('ui.smartLink.seen', {
239
- display: appearance
240
- });
241
- hasFiredSeenRef.current = true;
242
- }
243
- }
244
- }, [state.status, isIntersected, fireEvent, appearance]);
245
230
  var onIframeDwell = (0, _react.useCallback)(function (dwellTime, dwellPercentVisible) {
246
231
  fireEvent('ui.smartLinkIframe.dwelled', {
247
232
  id: id,
@@ -364,7 +349,6 @@ function ComponentUpdated(_ref2) {
364
349
  url = _ref2.url,
365
350
  isSelected = _ref2.isSelected,
366
351
  isHovered = _ref2.isHovered,
367
- isIntersected = _ref2.isIntersected,
368
352
  frameStyle = _ref2.frameStyle,
369
353
  platform = _ref2.platform,
370
354
  onClick = _ref2.onClick,
@@ -392,7 +376,6 @@ function ComponentUpdated(_ref2) {
392
376
  createAnalyticsEvent = _useAnalyticsEventsNe2.createAnalyticsEvent;
393
377
  var _useAnalyticsEvents2 = (0, _useAnalyticsEvents3.useAnalyticsEvents)(),
394
378
  fireEvent = _useAnalyticsEvents2.fireEvent;
395
- var hasFiredSeenRef = (0, _react.useRef)(false);
396
379
  var isFlexibleUi = (0, _react.useMemo)(function () {
397
380
  return (0, _flexible.isFlexibleUiCard)(children, ui);
398
381
  }, [children, ui]);
@@ -550,19 +533,6 @@ function ComponentUpdated(_ref2) {
550
533
  }));
551
534
  }
552
535
  }, [appearance, extensionKey, fireEvent, id, isFlexibleUi, rovoActionsCtaShown, state.status]);
553
-
554
- // Fire smartLink seen event once on a successful render card is in the viewport
555
- (0, _react.useEffect)(function () {
556
- if ((0, _platformFeatureFlags.fg)('platform_sl_event_ui_seen')) {
557
- if (state.status !== 'unauthorized') return;
558
- if (isIntersected && !hasFiredSeenRef.current) {
559
- fireEvent('ui.smartLink.seen', {
560
- display: appearance
561
- });
562
- hasFiredSeenRef.current = true;
563
- }
564
- }
565
- }, [state.status, isIntersected, fireEvent, appearance]);
566
536
  var onIframeDwell = (0, _react.useCallback)(function (dwellTime, dwellPercentVisible) {
567
537
  fireEvent('ui.smartLinkIframe.dwelled', {
568
538
  id: id,
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  });
7
7
  exports.Frame = void 0;
8
8
  var _react = _interopRequireWildcard(require("react"));
9
+ var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
9
10
  var _useLinkClicked = require("../../../state/analytics/useLinkClicked");
10
11
  var _styled = require("./styled");
11
12
  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); }
@@ -48,8 +49,8 @@ var Frame = exports.Frame = /*#__PURE__*/(0, _react.forwardRef)(function (props,
48
49
  withoutBackground: withoutBackground,
49
50
  isSelected: isSelected,
50
51
  isInteractive: isInteractive,
51
- tabIndex: isInteractive ? 0 : undefined,
52
- role: isInteractive ? 'button' : undefined,
52
+ tabIndex: isInteractive && ((0, _platformFeatureFlags.fg)('navx-3611-inline-card-a11y-role-fix') ? !link : true) ? 0 : undefined,
53
+ role: isInteractive && ((0, _platformFeatureFlags.fg)('navx-3611-inline-card-a11y-role-fix') ? !link : true) ? 'button' : undefined,
53
54
  onClick: handleClick,
54
55
  onMouseDown: handleMouseDown,
55
56
  onKeyPress: handleKeyPress,
@@ -11,8 +11,6 @@ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/h
11
11
  var _react = _interopRequireWildcard(require("react"));
12
12
  var _reactErrorBoundary = require("react-error-boundary");
13
13
  var _reactIntl = require("react-intl");
14
- var _featureGateJsClient = _interopRequireDefault(require("@atlaskit/feature-gate-js-client"));
15
- var _linkExtractors = require("@atlaskit/link-extractors");
16
14
  var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
17
15
  var _helpers = require("../../../state/helpers");
18
16
  var _useResolveHyperlink2 = _interopRequireDefault(require("../../../state/hooks/use-resolve-hyperlink"));
@@ -21,7 +19,6 @@ var _SmartLinkAnalyticsContext = require("../../../utils/analytics/SmartLinkAnal
21
19
  var _intlProvider = _interopRequireDefault(require("../../common/intl-provider"));
22
20
  var _useSmartLinkEvents = require("../../SmartLinkEvents/useSmartLinkEvents");
23
21
  var _Hyperlink = _interopRequireDefault(require("../Hyperlink"));
24
- var _unauthorizeView = _interopRequireDefault(require("./unauthorize-view"));
25
22
  var _excluded = ["onClick"];
26
23
  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); }
27
24
  var HyperlinkFallbackComponent = function HyperlinkFallbackComponent() {
@@ -42,9 +39,7 @@ var HyperlinkWithSmartLinkResolverInner = function HyperlinkWithSmartLinkResolve
42
39
  var _useResolveHyperlink = (0, _useResolveHyperlink2.default)({
43
40
  href: props.href || ''
44
41
  }),
45
- actions = _useResolveHyperlink.actions,
46
42
  state = _useResolveHyperlink.state;
47
- var services = (0, _helpers.getServices)(state === null || state === void 0 ? void 0 : state.details);
48
43
  var thirdPartyARI = (0, _helpers.getThirdPartyARI)(state === null || state === void 0 ? void 0 : state.details);
49
44
  var firstPartyIdentifier = (0, _helpers.getFirstPartyIdentifier)();
50
45
  var fire3PClickEvent = (0, _platformFeatureFlags.fg)('platform_smartlink_3pclick_analytics') ?
@@ -59,42 +54,6 @@ var HyperlinkWithSmartLinkResolverInner = function HyperlinkWithSmartLinkResolve
59
54
  }
60
55
  onClickCallback === null || onClickCallback === void 0 || onClickCallback(e);
61
56
  }, [onClickCallback, fire3PClickEvent, state === null || state === void 0 ? void 0 : state.status]);
62
- var onAuthorize = (0, _react.useCallback)(function () {
63
- return actions.authorize('url');
64
- }, [actions]);
65
- var shouldRenderConnectBtn = function shouldRenderConnectBtn() {
66
- if (!props.children || !Array.isArray(props.children) || props.children.length === 0) {
67
- return false;
68
- }
69
- var firstChild = props.children[0];
70
- try {
71
- var _firstChild$props;
72
- // Check if first child has a string matching href
73
- if (typeof firstChild === 'string') {
74
- return props.href === firstChild;
75
- }
76
-
77
- // Check if first child has another child object containing matching href. This aligns with the behavior of the TextWrapper component used by editor to render link nodes
78
- if (firstChild !== null && firstChild !== void 0 && (_firstChild$props = firstChild.props) !== null && _firstChild$props !== void 0 && _firstChild$props.children && typeof firstChild.props.children === 'string') {
79
- return props.href === firstChild.props.children;
80
- }
81
- } catch (_) {
82
- return false;
83
- }
84
- };
85
- if ((state === null || state === void 0 ? void 0 : state.status) === 'unauthorized' && shouldRenderConnectBtn() && (
86
- // eslint-disable-next-line @atlaskit/platform/use-recommended-utils -- Statsig migration pending for Bluelink connect experiments
87
- _featureGateJsClient.default.getExperimentValue('platform_linking_bluelink_connect_confluence', 'isEnabled', false) ||
88
- // eslint-disable-next-line @atlaskit/platform/use-recommended-utils -- Statsig migration pending for Bluelink connect experiments
89
- _featureGateJsClient.default.getExperimentValue('platform_linking_bluelink_connect_jira', 'isEnabled', false))) {
90
- var provider = (0, _linkExtractors.extractSmartLinkProvider)(state === null || state === void 0 ? void 0 : state.details);
91
- return /*#__PURE__*/_react.default.createElement(_unauthorizeView.default, (0, _extends2.default)({}, props, {
92
- onAuthorize: services !== null && services !== void 0 && services.length ? onAuthorize : undefined,
93
- onClick: onClick,
94
- showConnectBtn: (services === null || services === void 0 ? void 0 : services.length) > 0,
95
- provider: provider
96
- }));
97
- }
98
57
  return /*#__PURE__*/_react.default.createElement(_Hyperlink.default, (0, _extends2.default)({}, props, {
99
58
  onClick: onClick
100
59
  }));
@@ -1,4 +1,5 @@
1
1
  import { useCallback, useEffect, useRef } from 'react';
2
+ import { isIntersectionObserverSupported } from '../../../utils';
2
3
 
3
4
  // This property enables the intersection observer to be run once the
4
5
  // HTML element being observed is within `X` px of the target container it is
@@ -27,7 +28,7 @@ const useIntersectionObserver = ({
27
28
  }
28
29
  }, []);
29
30
  useEffect(() => {
30
- if (!ref.current) {
31
+ if (!isIntersectionObserverSupported() || !ref.current) {
31
32
  return;
32
33
  }
33
34
  const intersectionObserver = new IntersectionObserver(onIntersection, {
@@ -0,0 +1,60 @@
1
+ import { useCallback, useEffect, useMemo, useRef } from 'react';
2
+ import { useAnalyticsEvents } from '../../../common/analytics/generated/use-analytics-events';
3
+ import { useSmartLinkAnalyticsUtils } from '../../../utils/analytics/SmartLinkAnalyticsContext';
4
+ import { isFlexibleUiCard } from '../../../utils/flexible';
5
+ /**
6
+ * Fires `ui.smartLink.seen` once when a smart link with status `unauthorized`
7
+ * enters the viewport. Uses refs internally so it never causes re-renders,
8
+ * which is important for SSR.
9
+ */
10
+ export function useSmartLinkSeenEvent({
11
+ appearance,
12
+ children,
13
+ id,
14
+ ui,
15
+ url = ''
16
+ }) {
17
+ const {
18
+ fireEvent
19
+ } = useAnalyticsEvents();
20
+ const {
21
+ getByUrl
22
+ } = useSmartLinkAnalyticsUtils();
23
+ const getAnalyticsProps = useCallback(() => {
24
+ const isFlexibleUi = isFlexibleUiCard(children, ui);
25
+ const display = isFlexibleUi ? 'flexible' : appearance;
26
+ return {
27
+ display,
28
+ id
29
+ };
30
+ }, [appearance, children, id, ui]);
31
+ const statusRef = useRef();
32
+ const analyticsPropsRef = useRef(null);
33
+ const hasIntersectedRef = useRef(false);
34
+ const hasFiredSeenRef = useRef(false);
35
+ useEffect(() => {
36
+ analyticsPropsRef.current = getAnalyticsProps();
37
+ }, [getAnalyticsProps]);
38
+ const maybeFireSeenEvent = useCallback(() => {
39
+ if (!hasFiredSeenRef.current && hasIntersectedRef.current && statusRef.current === 'unauthorized') {
40
+ const payload = getByUrl(url, analyticsPropsRef.current);
41
+ fireEvent('ui.smartLink.seen', payload === null || payload === void 0 ? void 0 : payload.attributes);
42
+ hasFiredSeenRef.current = true;
43
+ }
44
+ }, [fireEvent, getByUrl, url]);
45
+ const onIntersecting = useCallback(() => {
46
+ if (hasIntersectedRef.current) {
47
+ return;
48
+ }
49
+ hasIntersectedRef.current = true;
50
+ maybeFireSeenEvent();
51
+ }, [maybeFireSeenEvent]);
52
+ const onStatusSettled = useCallback(status => {
53
+ statusRef.current = status;
54
+ maybeFireSeenEvent();
55
+ }, [maybeFireSeenEvent]);
56
+ return useMemo(() => ({
57
+ onIntersecting,
58
+ onStatusSettled
59
+ }), [onIntersecting, onStatusSettled]);
60
+ }
@@ -1,6 +1,5 @@
1
- import React, { useMemo } from 'react';
1
+ import React, { useCallback, useMemo } from 'react';
2
2
  import { AnalyticsContext } from '@atlaskit/analytics-next';
3
- import FeatureGates from '@atlaskit/feature-gate-js-client';
4
3
  import { getResolvedAttributes } from '@atlaskit/link-analytics/resolved-attributes';
5
4
  import { useSmartLinkContext } from '@atlaskit/link-provider';
6
5
  import { getUrl } from '@atlaskit/linking-common';
@@ -24,12 +23,9 @@ const getSmartLinkAnalyticsContext = ({
24
23
  url,
25
24
  error
26
25
  }) => {
27
- const isHyperlinkConnectExperimentEnabled = FeatureGates.getExperimentValue('platform_linking_bluelink_connect_confluence', 'isEnabled', false) || FeatureGates.getExperimentValue('platform_linking_bluelink_connect_jira', 'isEnabled', false);
28
- const resolvedAttributes = isHyperlinkConnectExperimentEnabled ? getExtendedResolvedAttributes({
26
+ const resolvedAttributes = getExtendedResolvedAttributes({
29
27
  url,
30
28
  displayCategory: display === 'url' ? 'link' : 'smartLink'
31
- }, response, status, error) : getExtendedResolvedAttributes({
32
- url
33
29
  }, response, status, error);
34
30
  return {
35
31
  source,
@@ -45,6 +41,32 @@ const getSmartLinkAnalyticsContext = ({
45
41
  * Provides an analytics context data to supply attributes to events based on a URL
46
42
  * and the link state in the store
47
43
  */
44
+ export const useSmartLinkAnalyticsUtils = () => {
45
+ const {
46
+ store
47
+ } = useSmartLinkContext();
48
+ const getByUrl = useCallback((url, props) => {
49
+ const state = store ? getUrl(store, url) : undefined;
50
+ return getSmartLinkAnalyticsContext({
51
+ display: props === null || props === void 0 ? void 0 : props.display,
52
+ id: props === null || props === void 0 ? void 0 : props.id,
53
+ response: state === null || state === void 0 ? void 0 : state.details,
54
+ source: props === null || props === void 0 ? void 0 : props.source,
55
+ status: state === null || state === void 0 ? void 0 : state.status,
56
+ url,
57
+ error: state === null || state === void 0 ? void 0 : state.error
58
+ });
59
+ }, [store]);
60
+ return useMemo(() => ({
61
+ getByUrl
62
+ }), [getByUrl]);
63
+ };
64
+
65
+ /**
66
+ * Provides an analytics context data to supply attributes to events based on a URL
67
+ * and the link state in the store
68
+ * @deprecated Use useSmartLinkAnalyticsUtils instead
69
+ */
48
70
  export const useSmartLinkAnalyticsContext = ({
49
71
  display,
50
72
  id,