@atlaskit/smart-card 26.41.3 → 26.42.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 (46) hide show
  1. package/CHANGELOG.md +6 -0
  2. package/dist/cjs/utils/analytics/analytics.js +1 -1
  3. package/dist/cjs/view/FlexibleCard/components/blocks/related-urls-block/analytics.js +30 -0
  4. package/dist/cjs/view/FlexibleCard/components/blocks/related-urls-block/index.js +19 -8
  5. package/dist/cjs/view/FlexibleCard/components/blocks/related-urls-block/resolved/related-url-list/index.js +11 -16
  6. package/dist/cjs/view/FlexibleCard/components/blocks/related-urls-block/resolved/related-url-list/related-url-item/index.js +9 -1
  7. package/dist/cjs/view/FlexibleCard/components/blocks/related-urls-block/resolved/related-url-list/resolved-result-stack/analytics.js +51 -0
  8. package/dist/cjs/view/FlexibleCard/components/blocks/related-urls-block/resolved/related-url-list/resolved-result-stack/index.js +54 -0
  9. package/dist/cjs/view/FlexibleCard/components/blocks/related-urls-block/resolved/related-url-list/resolved-result-stack/types.js +5 -0
  10. package/dist/cjs/view/FlexibleCard/components/blocks/related-urls-block/types.js +5 -0
  11. package/dist/cjs/view/LinkUrl/index.js +1 -1
  12. package/dist/es2019/utils/analytics/analytics.js +1 -1
  13. package/dist/es2019/view/FlexibleCard/components/blocks/related-urls-block/analytics.js +19 -0
  14. package/dist/es2019/view/FlexibleCard/components/blocks/related-urls-block/index.js +14 -1
  15. package/dist/es2019/view/FlexibleCard/components/blocks/related-urls-block/resolved/related-url-list/index.js +12 -15
  16. package/dist/es2019/view/FlexibleCard/components/blocks/related-urls-block/resolved/related-url-list/related-url-item/index.js +11 -2
  17. package/dist/es2019/view/FlexibleCard/components/blocks/related-urls-block/resolved/related-url-list/resolved-result-stack/analytics.js +42 -0
  18. package/dist/es2019/view/FlexibleCard/components/blocks/related-urls-block/resolved/related-url-list/resolved-result-stack/index.js +44 -0
  19. package/dist/es2019/view/FlexibleCard/components/blocks/related-urls-block/resolved/related-url-list/resolved-result-stack/types.js +1 -0
  20. package/dist/es2019/view/FlexibleCard/components/blocks/related-urls-block/types.js +1 -0
  21. package/dist/es2019/view/LinkUrl/index.js +1 -1
  22. package/dist/esm/utils/analytics/analytics.js +1 -1
  23. package/dist/esm/view/FlexibleCard/components/blocks/related-urls-block/analytics.js +23 -0
  24. package/dist/esm/view/FlexibleCard/components/blocks/related-urls-block/index.js +19 -8
  25. package/dist/esm/view/FlexibleCard/components/blocks/related-urls-block/resolved/related-url-list/index.js +12 -17
  26. package/dist/esm/view/FlexibleCard/components/blocks/related-urls-block/resolved/related-url-list/related-url-item/index.js +10 -2
  27. package/dist/esm/view/FlexibleCard/components/blocks/related-urls-block/resolved/related-url-list/resolved-result-stack/analytics.js +44 -0
  28. package/dist/esm/view/FlexibleCard/components/blocks/related-urls-block/resolved/related-url-list/resolved-result-stack/index.js +44 -0
  29. package/dist/esm/view/FlexibleCard/components/blocks/related-urls-block/resolved/related-url-list/resolved-result-stack/types.js +1 -0
  30. package/dist/esm/view/FlexibleCard/components/blocks/related-urls-block/types.js +1 -0
  31. package/dist/esm/view/LinkUrl/index.js +1 -1
  32. package/dist/types/utils/types.d.ts +2 -2
  33. package/dist/types/view/FlexibleCard/components/blocks/related-urls-block/analytics.d.ts +3 -0
  34. package/dist/types/view/FlexibleCard/components/blocks/related-urls-block/resolved/related-url-list/resolved-result-stack/analytics.d.ts +11 -0
  35. package/dist/types/view/FlexibleCard/components/blocks/related-urls-block/resolved/related-url-list/resolved-result-stack/index.d.ts +4 -0
  36. package/dist/types/view/FlexibleCard/components/blocks/related-urls-block/resolved/related-url-list/resolved-result-stack/types.d.ts +10 -0
  37. package/dist/types/view/FlexibleCard/components/blocks/related-urls-block/types.d.ts +3 -0
  38. package/dist/types-ts4.5/utils/types.d.ts +2 -2
  39. package/dist/types-ts4.5/view/FlexibleCard/components/blocks/related-urls-block/analytics.d.ts +3 -0
  40. package/dist/types-ts4.5/view/FlexibleCard/components/blocks/related-urls-block/resolved/related-url-list/resolved-result-stack/analytics.d.ts +11 -0
  41. package/dist/types-ts4.5/view/FlexibleCard/components/blocks/related-urls-block/resolved/related-url-list/resolved-result-stack/index.d.ts +4 -0
  42. package/dist/types-ts4.5/view/FlexibleCard/components/blocks/related-urls-block/resolved/related-url-list/resolved-result-stack/types.d.ts +10 -0
  43. package/dist/types-ts4.5/view/FlexibleCard/components/blocks/related-urls-block/types.d.ts +3 -0
  44. package/package.json +2 -2
  45. package/report.api.md +2 -0
  46. package/tmp/api-report-tmp.d.ts +2 -2
package/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @atlaskit/smart-card
2
2
 
3
+ ## 26.42.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [#42696](https://bitbucket.org/atlassian/atlassian-frontend/pull-requests/42696) [`6191f76a929`](https://bitbucket.org/atlassian/atlassian-frontend/commits/6191f76a929) - Adds analytics for related links
8
+
3
9
  ## 26.41.3
4
10
 
5
11
  ### Patch Changes
@@ -22,7 +22,7 @@ var ANALYTICS_CHANNEL = exports.ANALYTICS_CHANNEL = 'media';
22
22
  var context = exports.context = {
23
23
  componentName: 'smart-cards',
24
24
  packageName: "@atlaskit/smart-card",
25
- packageVersion: "26.41.3"
25
+ packageVersion: "26.42.0"
26
26
  };
27
27
  var TrackQuickActionType = exports.TrackQuickActionType = /*#__PURE__*/function (TrackQuickActionType) {
28
28
  TrackQuickActionType["StatusUpdate"] = "StatusUpdate";
@@ -0,0 +1,30 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.fireRelatedLinksLoadedEvent = void 0;
8
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
9
+ var _analytics = require("../../../../../utils/analytics");
10
+ 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; }
11
+ 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; }
12
+ var createTrackRelatedLinksLoadedEventPayload = function createTrackRelatedLinksLoadedEventPayload(_ref) {
13
+ var relatedLinksCount = _ref.relatedLinksCount;
14
+ return {
15
+ action: 'loaded',
16
+ actionSubject: 'relatedLinks',
17
+ eventType: 'track',
18
+ attributes: {
19
+ relatedLinksCount: relatedLinksCount
20
+ }
21
+ };
22
+ };
23
+ var fireRelatedLinksLoadedEvent = exports.fireRelatedLinksLoadedEvent = function fireRelatedLinksLoadedEvent(createAnalyticsEvent) {
24
+ return function (attributes) {
25
+ var payload = createTrackRelatedLinksLoadedEventPayload(attributes);
26
+ if (payload) {
27
+ createAnalyticsEvent(_objectSpread({}, payload)).fire(_analytics.ANALYTICS_CHANNEL);
28
+ }
29
+ };
30
+ };
@@ -15,10 +15,12 @@ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/h
15
15
  var _react = _interopRequireWildcard(require("react"));
16
16
  var _reactMagneticDi = require("react-magnetic-di");
17
17
  var _react2 = require("@emotion/react");
18
+ var _analyticsNext = require("@atlaskit/analytics-next");
18
19
  var _useRelatedUrls = _interopRequireDefault(require("../../../../../state/hooks/use-related-urls"));
19
20
  var _errored = require("./errored");
20
21
  var _resolved = require("./resolved");
21
22
  var _resolving = require("./resolving");
23
+ var _analytics = require("./analytics");
22
24
  var _templateObject;
23
25
  var _excluded = ["testId", "url", "renderers"];
24
26
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
@@ -32,6 +34,8 @@ var RelatedUrlsBlock = function RelatedUrlsBlock(_ref) {
32
34
  url = _ref.url,
33
35
  renderers = _ref.renderers,
34
36
  blockProps = (0, _objectWithoutProperties2.default)(_ref, _excluded);
37
+ var _useAnalyticsEvents = (0, _analyticsNext.useAnalyticsEvents)(),
38
+ createAnalyticsEvent = _useAnalyticsEvents.createAnalyticsEvent;
35
39
  var _useState = (0, _react.useState)(true),
36
40
  _useState2 = (0, _slicedToArray2.default)(_useState, 2),
37
41
  loadingRelatedUrls = _useState2[0],
@@ -48,7 +52,7 @@ var RelatedUrlsBlock = function RelatedUrlsBlock(_ref) {
48
52
  (0, _react.useEffect)(function () {
49
53
  var fetchRelatedUrls = /*#__PURE__*/function () {
50
54
  var _ref2 = (0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee() {
51
- var relUrls;
55
+ var _relUrls$resolvedResu, _relUrls$resolvedResu2, relUrls;
52
56
  return _regenerator.default.wrap(function _callee$(_context) {
53
57
  while (1) switch (_context.prev = _context.next) {
54
58
  case 0:
@@ -58,26 +62,33 @@ var RelatedUrlsBlock = function RelatedUrlsBlock(_ref) {
58
62
  case 3:
59
63
  relUrls = _context.sent;
60
64
  setRelatedUrls(relUrls);
61
- _context.next = 10;
65
+
66
+ /**
67
+ * Fire TrackRelatedLinksLoadedEvent
68
+ */
69
+ (0, _analytics.fireRelatedLinksLoadedEvent)(createAnalyticsEvent)({
70
+ relatedLinksCount: (_relUrls$resolvedResu = (_relUrls$resolvedResu2 = relUrls.resolvedResults) === null || _relUrls$resolvedResu2 === void 0 ? void 0 : _relUrls$resolvedResu2.length) !== null && _relUrls$resolvedResu !== void 0 ? _relUrls$resolvedResu : 0
71
+ });
72
+ _context.next = 11;
62
73
  break;
63
- case 7:
64
- _context.prev = 7;
74
+ case 8:
75
+ _context.prev = 8;
65
76
  _context.t0 = _context["catch"](0);
66
77
  setErr(_context.t0);
67
- case 10:
68
- setLoadingRelatedUrls(false);
69
78
  case 11:
79
+ setLoadingRelatedUrls(false);
80
+ case 12:
70
81
  case "end":
71
82
  return _context.stop();
72
83
  }
73
- }, _callee, null, [[0, 7]]);
84
+ }, _callee, null, [[0, 8]]);
74
85
  }));
75
86
  return function fetchRelatedUrls() {
76
87
  return _ref2.apply(this, arguments);
77
88
  };
78
89
  }();
79
90
  fetchRelatedUrls();
80
- }, [getRelatedUrls, url]);
91
+ }, [createAnalyticsEvent, getRelatedUrls, url]);
81
92
  if (loadingRelatedUrls) {
82
93
  return /*#__PURE__*/_react.default.createElement(_resolving.RelatedUrlsBlockResolvingView, (0, _extends2.default)({
83
94
  testId: "".concat(testId, "-resolving-view")
@@ -17,7 +17,7 @@ var _react2 = require("@emotion/react");
17
17
  var _messages = require("../../../../../../../messages");
18
18
  var _utils = require("../../../../../components/utils");
19
19
  var _text = _interopRequireDefault(require("../../../../elements/text"));
20
- var _relatedUrlItem = _interopRequireDefault(require("./related-url-item"));
20
+ var _resolvedResultStack = _interopRequireDefault(require("./resolved-result-stack"));
21
21
  var _templateObject;
22
22
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
23
23
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
@@ -36,19 +36,6 @@ var RelatedUrlList = function RelatedUrlList(_ref) {
36
36
  }, [isOpen]);
37
37
  var ChevronComponent = isOpen ? _chevronUp.default : _chevronDown.default;
38
38
  var intl = (0, _reactIntlNext.useIntl)();
39
- var resolvedResultsStack = (0, _react.useMemo)(function () {
40
- return /*#__PURE__*/_react.default.createElement(_primitives.Stack, {
41
- space: "space.050",
42
- testId: "".concat(testId, "-items-wrapper")
43
- }, resolvedResults.map(function (resolvedResults, idx) {
44
- return /*#__PURE__*/_react.default.createElement(_relatedUrlItem.default, {
45
- testId: "".concat(testId, "-item"),
46
- key: idx,
47
- results: resolvedResults,
48
- renderers: renderers
49
- });
50
- }));
51
- }, [renderers, resolvedResults, testId]);
52
39
  return resolvedResults.length > 0 ? /*#__PURE__*/_react.default.createElement(_primitives.Stack, {
53
40
  testId: testId,
54
41
  xcss: (0, _primitives.xcss)({
@@ -56,7 +43,11 @@ var RelatedUrlList = function RelatedUrlList(_ref) {
56
43
  })
57
44
  }, /*#__PURE__*/_react.default.createElement(_primitives.Box, {
58
45
  onClick: chevronClickHandler,
59
- testId: "".concat(testId, "-expand-title")
46
+ testId: "".concat(testId, "-expand-title"),
47
+ as: "button",
48
+ backgroundColor: "color.background.neutral.subtle",
49
+ "aria-expanded": !!isOpen,
50
+ padding: "space.0"
60
51
  }, /*#__PURE__*/_react.default.createElement(_primitives.Inline, {
61
52
  alignBlock: "center",
62
53
  spread: "space-between"
@@ -68,7 +59,11 @@ var RelatedUrlList = function RelatedUrlList(_ref) {
68
59
  }), /*#__PURE__*/_react.default.createElement(ChevronComponent, {
69
60
  label: (0, _utils.getFormattedMessageAsString)(intl, title),
70
61
  size: 'medium'
71
- }))), isOpen && resolvedResultsStack) : /*#__PURE__*/_react.default.createElement(_text.default, {
62
+ }))), isOpen && /*#__PURE__*/_react.default.createElement(_resolvedResultStack.default, {
63
+ resolvedResults: resolvedResults,
64
+ testId: testId,
65
+ renderers: renderers
66
+ })) : /*#__PURE__*/_react.default.createElement(_text.default, {
72
67
  testId: testId,
73
68
  message: {
74
69
  descriptor: _messages.messages.related_work_items_not_found
@@ -9,22 +9,29 @@ exports.default = void 0;
9
9
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
10
10
  var _react = _interopRequireWildcard(require("react"));
11
11
  var _primitives = require("@atlaskit/primitives");
12
+ var _analyticsNext = require("@atlaskit/analytics-next");
12
13
  var _constants = require("../../../../../../../../constants");
13
14
  var _flexible = _interopRequireDefault(require("../../../../../../../../extractors/flexible"));
14
15
  var _icon = _interopRequireDefault(require("../../../../../elements/icon"));
15
16
  var _link = _interopRequireDefault(require("../../../../../elements/link"));
17
+ var _click = require("../../../../../../../../utils/analytics/click");
16
18
  function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
17
19
  function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
18
20
  var RelatedUrlItem = function RelatedUrlItem(_ref) {
19
21
  var results = _ref.results,
20
22
  renderers = _ref.renderers,
21
23
  testId = _ref.testId;
24
+ var _useAnalyticsEvents = (0, _analyticsNext.useAnalyticsEvents)(),
25
+ createAnalyticsEvent = _useAnalyticsEvents.createAnalyticsEvent;
22
26
  var flexibleDataContext = (0, _react.useMemo)(function () {
23
27
  return (0, _flexible.default)({
24
28
  response: results,
25
29
  renderers: renderers
26
30
  });
27
31
  }, [renderers, results]);
32
+ var onClick = (0, _react.useCallback)(function (event) {
33
+ (0, _click.fireLinkClickedEvent)(createAnalyticsEvent)(event);
34
+ }, [createAnalyticsEvent]);
28
35
  return /*#__PURE__*/_react.default.createElement(_primitives.Inline, {
29
36
  alignBlock: "center",
30
37
  space: "space.050",
@@ -37,7 +44,8 @@ var RelatedUrlItem = function RelatedUrlItem(_ref) {
37
44
  text: flexibleDataContext === null || flexibleDataContext === void 0 ? void 0 : flexibleDataContext.title,
38
45
  url: flexibleDataContext === null || flexibleDataContext === void 0 ? void 0 : flexibleDataContext.url,
39
46
  size: _constants.SmartLinkSize.Small,
40
- maxLines: 1
47
+ maxLines: 1,
48
+ onClick: onClick
41
49
  }));
42
50
  };
43
51
  var _default = exports.default = RelatedUrlItem;
@@ -0,0 +1,51 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ Object.defineProperty(exports, "__esModule", {
5
+ value: true
6
+ });
7
+ exports.fireRelatedLinksViewedEvent = exports.RelatedUrlItemAnalyticsContext = void 0;
8
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
9
+ var _react = _interopRequireDefault(require("react"));
10
+ var _analyticsNext = require("@atlaskit/analytics-next");
11
+ var _resolvedAttributes = require("@atlaskit/link-analytics/resolved-attributes");
12
+ var _analytics = require("../../../../../../../../utils/analytics");
13
+ 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; }
14
+ 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; }
15
+ var createUiRelatedLinksViewedEventPayload = function createUiRelatedLinksViewedEventPayload(_ref) {
16
+ var relatedLinksCount = _ref.relatedLinksCount;
17
+ return {
18
+ action: 'viewed',
19
+ actionSubject: 'relatedLinks',
20
+ eventType: 'ui',
21
+ attributes: {
22
+ relatedLinksCount: relatedLinksCount
23
+ }
24
+ };
25
+ };
26
+ var fireRelatedLinksViewedEvent = exports.fireRelatedLinksViewedEvent = function fireRelatedLinksViewedEvent(createAnalyticsEvent) {
27
+ return function (attributes) {
28
+ var payload = createUiRelatedLinksViewedEventPayload(attributes);
29
+ if (payload) {
30
+ createAnalyticsEvent(_objectSpread({}, payload)).fire(_analytics.ANALYTICS_CHANNEL);
31
+ }
32
+ };
33
+ };
34
+ var RelatedUrlItemAnalyticsContext = exports.RelatedUrlItemAnalyticsContext = function RelatedUrlItemAnalyticsContext(props) {
35
+ var children = props.children,
36
+ details = props.details;
37
+
38
+ /**
39
+ * We don't really need the `url` to get the attributes here so set
40
+ * it to an empty string to just make typescript happy
41
+ */
42
+ var attributes = (0, _resolvedAttributes.getResolvedAttributes)({
43
+ url: ''
44
+ }, details);
45
+ return /*#__PURE__*/_react.default.createElement(_analyticsNext.AnalyticsContext, {
46
+ data: {
47
+ attributes: attributes,
48
+ component: 'relatedLink'
49
+ }
50
+ }, children);
51
+ };
@@ -0,0 +1,54 @@
1
+ "use strict";
2
+
3
+ var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
+ var _typeof = require("@babel/runtime/helpers/typeof");
5
+ Object.defineProperty(exports, "__esModule", {
6
+ value: true
7
+ });
8
+ exports.default = void 0;
9
+ var _react = _interopRequireWildcard(require("react"));
10
+ var _primitives = require("@atlaskit/primitives");
11
+ var _analyticsNext = require("@atlaskit/analytics-next");
12
+ var _relatedUrlItem = _interopRequireDefault(require("../related-url-item"));
13
+ var _analytics = require("./analytics");
14
+ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); }
15
+ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || _typeof(obj) !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; }
16
+ var ResolvedResultsStack = function ResolvedResultsStack(_ref) {
17
+ var resolvedResults = _ref.resolvedResults,
18
+ testId = _ref.testId,
19
+ renderers = _ref.renderers;
20
+ var _useAnalyticsEvents = (0, _analyticsNext.useAnalyticsEvents)(),
21
+ createAnalyticsEvent = _useAnalyticsEvents.createAnalyticsEvent;
22
+ (0, _react.useEffect)(function () {
23
+ // This event will fire each time the component is loaded
24
+ (0, _analytics.fireRelatedLinksViewedEvent)(createAnalyticsEvent)({
25
+ relatedLinksCount: resolvedResults.length
26
+ });
27
+ }, [resolvedResults.length, createAnalyticsEvent]);
28
+ return /*#__PURE__*/_react.default.createElement(_primitives.Stack, {
29
+ space: "space.050",
30
+ testId: "".concat(testId, "-items-wrapper"),
31
+ as: "ul",
32
+ xcss: (0, _primitives.xcss)({
33
+ paddingLeft: '0px',
34
+ marginTop: '0px'
35
+ })
36
+ }, resolvedResults.map(function (resolvedResults, idx) {
37
+ return /*#__PURE__*/_react.default.createElement(_analytics.RelatedUrlItemAnalyticsContext, {
38
+ details: resolvedResults,
39
+ key: idx
40
+ }, /*#__PURE__*/_react.default.createElement(_relatedUrlItem.default, {
41
+ testId: "".concat(testId, "-item"),
42
+ results: resolvedResults,
43
+ renderers: renderers
44
+ }));
45
+ }));
46
+ };
47
+ var ResolvedResultsStackWithAnalytics = function ResolvedResultsStackWithAnalytics(props) {
48
+ return /*#__PURE__*/_react.default.createElement(_analyticsNext.AnalyticsContext, {
49
+ data: {
50
+ component: 'relatedLinksSection'
51
+ }
52
+ }, /*#__PURE__*/_react.default.createElement(ResolvedResultsStack, props));
53
+ };
54
+ var _default = exports.default = ResolvedResultsStackWithAnalytics;
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
@@ -18,7 +18,7 @@ var _excluded = ["href", "children", "checkSafety", "onClick", "testId"],
18
18
  _excluded2 = ["isLinkSafe", "showSafetyWarningModal"];
19
19
  var PACKAGE_DATA = {
20
20
  packageName: "@atlaskit/smart-card",
21
- packageVersion: "26.41.3",
21
+ packageVersion: "26.42.0",
22
22
  componentName: 'linkUrl'
23
23
  };
24
24
  var Link = (0, _click.withLinkClickedEvent)('a');
@@ -4,7 +4,7 @@ export const ANALYTICS_CHANNEL = 'media';
4
4
  export const context = {
5
5
  componentName: 'smart-cards',
6
6
  packageName: "@atlaskit/smart-card",
7
- packageVersion: "26.41.3"
7
+ packageVersion: "26.42.0"
8
8
  };
9
9
  export let TrackQuickActionType = /*#__PURE__*/function (TrackQuickActionType) {
10
10
  TrackQuickActionType["StatusUpdate"] = "StatusUpdate";
@@ -0,0 +1,19 @@
1
+ import { ANALYTICS_CHANNEL } from '../../../../../utils/analytics';
2
+ const createTrackRelatedLinksLoadedEventPayload = ({
3
+ relatedLinksCount
4
+ }) => ({
5
+ action: 'loaded',
6
+ actionSubject: 'relatedLinks',
7
+ eventType: 'track',
8
+ attributes: {
9
+ relatedLinksCount
10
+ }
11
+ });
12
+ export const fireRelatedLinksLoadedEvent = createAnalyticsEvent => attributes => {
13
+ const payload = createTrackRelatedLinksLoadedEventPayload(attributes);
14
+ if (payload) {
15
+ createAnalyticsEvent({
16
+ ...payload
17
+ }).fire(ANALYTICS_CHANNEL);
18
+ }
19
+ };
@@ -2,10 +2,12 @@ import _extends from "@babel/runtime/helpers/extends";
2
2
  import React, { useEffect, useState } from 'react';
3
3
  import { di } from 'react-magnetic-di';
4
4
  import { css } from '@emotion/react';
5
+ import { useAnalyticsEvents } from '@atlaskit/analytics-next';
5
6
  import useRelatedUrls from '../../../../../state/hooks/use-related-urls';
6
7
  import { RelatedUrlsBlockErroredView } from './errored';
7
8
  import { RelatedUrlsResolvedView } from './resolved';
8
9
  import { RelatedUrlsBlockResolvingView } from './resolving';
10
+ import { fireRelatedLinksLoadedEvent } from './analytics';
9
11
  /**
10
12
  * Represents a block to display related resources of a url
11
13
  */
@@ -15,6 +17,9 @@ const RelatedUrlsBlock = ({
15
17
  renderers,
16
18
  ...blockProps
17
19
  }) => {
20
+ const {
21
+ createAnalyticsEvent
22
+ } = useAnalyticsEvents();
18
23
  const [loadingRelatedUrls, setLoadingRelatedUrls] = useState(true);
19
24
  const [err, setErr] = useState();
20
25
  const [relatedUrls, setRelatedUrls] = useState();
@@ -22,15 +27,23 @@ const RelatedUrlsBlock = ({
22
27
  useEffect(() => {
23
28
  const fetchRelatedUrls = async () => {
24
29
  try {
30
+ var _relUrls$resolvedResu, _relUrls$resolvedResu2;
25
31
  const relUrls = await getRelatedUrls(url);
26
32
  setRelatedUrls(relUrls);
33
+
34
+ /**
35
+ * Fire TrackRelatedLinksLoadedEvent
36
+ */
37
+ fireRelatedLinksLoadedEvent(createAnalyticsEvent)({
38
+ relatedLinksCount: (_relUrls$resolvedResu = (_relUrls$resolvedResu2 = relUrls.resolvedResults) === null || _relUrls$resolvedResu2 === void 0 ? void 0 : _relUrls$resolvedResu2.length) !== null && _relUrls$resolvedResu !== void 0 ? _relUrls$resolvedResu : 0
39
+ });
27
40
  } catch (error) {
28
41
  setErr(error);
29
42
  }
30
43
  setLoadingRelatedUrls(false);
31
44
  };
32
45
  fetchRelatedUrls();
33
- }, [getRelatedUrls, url]);
46
+ }, [createAnalyticsEvent, getRelatedUrls, url]);
34
47
  if (loadingRelatedUrls) {
35
48
  return /*#__PURE__*/React.createElement(RelatedUrlsBlockResolvingView, _extends({
36
49
  testId: `${testId}-resolving-view`
@@ -1,4 +1,4 @@
1
- import React, { useCallback, useMemo, useState } from 'react';
1
+ import React, { useCallback, useState } from 'react';
2
2
  import { useIntl } from 'react-intl-next';
3
3
  import ChevronDownIcon from '@atlaskit/icon/glyph/chevron-down';
4
4
  import ChevronUpIcon from '@atlaskit/icon/glyph/chevron-up';
@@ -7,7 +7,7 @@ import { css } from '@emotion/react';
7
7
  import { messages } from '../../../../../../../messages';
8
8
  import { getFormattedMessageAsString } from '../../../../../components/utils';
9
9
  import Text from '../../../../elements/text';
10
- import RelatedUrlItem from './related-url-item';
10
+ import ResolvedResultsStack from './resolved-result-stack';
11
11
  const RelatedUrlList = ({
12
12
  resolvedResults,
13
13
  title,
@@ -19,17 +19,6 @@ const RelatedUrlList = ({
19
19
  const chevronClickHandler = useCallback(() => setIsOpen(!isOpen), [isOpen]);
20
20
  const ChevronComponent = isOpen ? ChevronUpIcon : ChevronDownIcon;
21
21
  const intl = useIntl();
22
- const resolvedResultsStack = useMemo(() => {
23
- return /*#__PURE__*/React.createElement(Stack, {
24
- space: "space.050",
25
- testId: `${testId}-items-wrapper`
26
- }, resolvedResults.map((resolvedResults, idx) => /*#__PURE__*/React.createElement(RelatedUrlItem, {
27
- testId: `${testId}-item`,
28
- key: idx,
29
- results: resolvedResults,
30
- renderers: renderers
31
- })));
32
- }, [renderers, resolvedResults, testId]);
33
22
  return resolvedResults.length > 0 ? /*#__PURE__*/React.createElement(Stack, {
34
23
  testId: testId,
35
24
  xcss: xcss({
@@ -37,7 +26,11 @@ const RelatedUrlList = ({
37
26
  })
38
27
  }, /*#__PURE__*/React.createElement(Box, {
39
28
  onClick: chevronClickHandler,
40
- testId: `${testId}-expand-title`
29
+ testId: `${testId}-expand-title`,
30
+ as: "button",
31
+ backgroundColor: "color.background.neutral.subtle",
32
+ "aria-expanded": !!isOpen,
33
+ padding: "space.0"
41
34
  }, /*#__PURE__*/React.createElement(Inline, {
42
35
  alignBlock: "center",
43
36
  spread: "space-between"
@@ -51,7 +44,11 @@ const RelatedUrlList = ({
51
44
  }), /*#__PURE__*/React.createElement(ChevronComponent, {
52
45
  label: getFormattedMessageAsString(intl, title),
53
46
  size: 'medium'
54
- }))), isOpen && resolvedResultsStack) : /*#__PURE__*/React.createElement(Text, {
47
+ }))), isOpen && /*#__PURE__*/React.createElement(ResolvedResultsStack, {
48
+ resolvedResults: resolvedResults,
49
+ testId: testId,
50
+ renderers: renderers
51
+ })) : /*#__PURE__*/React.createElement(Text, {
55
52
  testId: testId,
56
53
  message: {
57
54
  descriptor: messages.related_work_items_not_found
@@ -1,19 +1,27 @@
1
1
  import _extends from "@babel/runtime/helpers/extends";
2
- import React, { useMemo } from 'react';
2
+ import React, { useCallback, useMemo } from 'react';
3
3
  import { Inline } from '@atlaskit/primitives';
4
+ import { useAnalyticsEvents } from '@atlaskit/analytics-next';
4
5
  import { SmartLinkSize } from '../../../../../../../../constants';
5
6
  import extractFlexibleUiContext from '../../../../../../../../extractors/flexible';
6
7
  import Icon from '../../../../../elements/icon';
7
8
  import Link from '../../../../../elements/link';
9
+ import { fireLinkClickedEvent } from '../../../../../../../../utils/analytics/click';
8
10
  const RelatedUrlItem = ({
9
11
  results,
10
12
  renderers,
11
13
  testId
12
14
  }) => {
15
+ const {
16
+ createAnalyticsEvent
17
+ } = useAnalyticsEvents();
13
18
  const flexibleDataContext = useMemo(() => extractFlexibleUiContext({
14
19
  response: results,
15
20
  renderers
16
21
  }), [renderers, results]);
22
+ const onClick = useCallback(event => {
23
+ fireLinkClickedEvent(createAnalyticsEvent)(event);
24
+ }, [createAnalyticsEvent]);
17
25
  return /*#__PURE__*/React.createElement(Inline, {
18
26
  alignBlock: "center",
19
27
  space: "space.050",
@@ -26,7 +34,8 @@ const RelatedUrlItem = ({
26
34
  text: flexibleDataContext === null || flexibleDataContext === void 0 ? void 0 : flexibleDataContext.title,
27
35
  url: flexibleDataContext === null || flexibleDataContext === void 0 ? void 0 : flexibleDataContext.url,
28
36
  size: SmartLinkSize.Small,
29
- maxLines: 1
37
+ maxLines: 1,
38
+ onClick: onClick
30
39
  }));
31
40
  };
32
41
  export default RelatedUrlItem;
@@ -0,0 +1,42 @@
1
+ import React from 'react';
2
+ import { AnalyticsContext } from '@atlaskit/analytics-next';
3
+ import { getResolvedAttributes } from '@atlaskit/link-analytics/resolved-attributes';
4
+ import { ANALYTICS_CHANNEL } from '../../../../../../../../utils/analytics';
5
+ const createUiRelatedLinksViewedEventPayload = ({
6
+ relatedLinksCount
7
+ }) => ({
8
+ action: 'viewed',
9
+ actionSubject: 'relatedLinks',
10
+ eventType: 'ui',
11
+ attributes: {
12
+ relatedLinksCount
13
+ }
14
+ });
15
+ export const fireRelatedLinksViewedEvent = createAnalyticsEvent => attributes => {
16
+ const payload = createUiRelatedLinksViewedEventPayload(attributes);
17
+ if (payload) {
18
+ createAnalyticsEvent({
19
+ ...payload
20
+ }).fire(ANALYTICS_CHANNEL);
21
+ }
22
+ };
23
+ export const RelatedUrlItemAnalyticsContext = props => {
24
+ const {
25
+ children,
26
+ details
27
+ } = props;
28
+
29
+ /**
30
+ * We don't really need the `url` to get the attributes here so set
31
+ * it to an empty string to just make typescript happy
32
+ */
33
+ const attributes = getResolvedAttributes({
34
+ url: ''
35
+ }, details);
36
+ return /*#__PURE__*/React.createElement(AnalyticsContext, {
37
+ data: {
38
+ attributes,
39
+ component: 'relatedLink'
40
+ }
41
+ }, children);
42
+ };
@@ -0,0 +1,44 @@
1
+ import React, { useEffect } from 'react';
2
+ import { Stack, xcss } from '@atlaskit/primitives';
3
+ import { AnalyticsContext, useAnalyticsEvents } from '@atlaskit/analytics-next';
4
+ import RelatedUrlItem from '../related-url-item';
5
+ import { RelatedUrlItemAnalyticsContext, fireRelatedLinksViewedEvent } from './analytics';
6
+ const ResolvedResultsStack = ({
7
+ resolvedResults,
8
+ testId,
9
+ renderers
10
+ }) => {
11
+ const {
12
+ createAnalyticsEvent
13
+ } = useAnalyticsEvents();
14
+ useEffect(() => {
15
+ // This event will fire each time the component is loaded
16
+ fireRelatedLinksViewedEvent(createAnalyticsEvent)({
17
+ relatedLinksCount: resolvedResults.length
18
+ });
19
+ }, [resolvedResults.length, createAnalyticsEvent]);
20
+ return /*#__PURE__*/React.createElement(Stack, {
21
+ space: "space.050",
22
+ testId: `${testId}-items-wrapper`,
23
+ as: "ul",
24
+ xcss: xcss({
25
+ paddingLeft: '0px',
26
+ marginTop: '0px'
27
+ })
28
+ }, resolvedResults.map((resolvedResults, idx) => /*#__PURE__*/React.createElement(RelatedUrlItemAnalyticsContext, {
29
+ details: resolvedResults,
30
+ key: idx
31
+ }, /*#__PURE__*/React.createElement(RelatedUrlItem, {
32
+ testId: `${testId}-item`,
33
+ results: resolvedResults,
34
+ renderers: renderers
35
+ }))));
36
+ };
37
+ const ResolvedResultsStackWithAnalytics = props => {
38
+ return /*#__PURE__*/React.createElement(AnalyticsContext, {
39
+ data: {
40
+ component: 'relatedLinksSection'
41
+ }
42
+ }, /*#__PURE__*/React.createElement(ResolvedResultsStack, props));
43
+ };
44
+ export default ResolvedResultsStackWithAnalytics;
@@ -8,7 +8,7 @@ import LinkWarningModal from './LinkWarningModal';
8
8
  import { getBooleanFF } from '@atlaskit/platform-feature-flags';
9
9
  const PACKAGE_DATA = {
10
10
  packageName: "@atlaskit/smart-card",
11
- packageVersion: "26.41.3",
11
+ packageVersion: "26.42.0",
12
12
  componentName: 'linkUrl'
13
13
  };
14
14
  const Link = withLinkClickedEvent('a');
@@ -15,7 +15,7 @@ export var ANALYTICS_CHANNEL = 'media';
15
15
  export var context = {
16
16
  componentName: 'smart-cards',
17
17
  packageName: "@atlaskit/smart-card",
18
- packageVersion: "26.41.3"
18
+ packageVersion: "26.42.0"
19
19
  };
20
20
  export var TrackQuickActionType = /*#__PURE__*/function (TrackQuickActionType) {
21
21
  TrackQuickActionType["StatusUpdate"] = "StatusUpdate";
@@ -0,0 +1,23 @@
1
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
+ 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; }
3
+ 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) { _defineProperty(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; }
4
+ import { ANALYTICS_CHANNEL } from '../../../../../utils/analytics';
5
+ var createTrackRelatedLinksLoadedEventPayload = function createTrackRelatedLinksLoadedEventPayload(_ref) {
6
+ var relatedLinksCount = _ref.relatedLinksCount;
7
+ return {
8
+ action: 'loaded',
9
+ actionSubject: 'relatedLinks',
10
+ eventType: 'track',
11
+ attributes: {
12
+ relatedLinksCount: relatedLinksCount
13
+ }
14
+ };
15
+ };
16
+ export var fireRelatedLinksLoadedEvent = function fireRelatedLinksLoadedEvent(createAnalyticsEvent) {
17
+ return function (attributes) {
18
+ var payload = createTrackRelatedLinksLoadedEventPayload(attributes);
19
+ if (payload) {
20
+ createAnalyticsEvent(_objectSpread({}, payload)).fire(ANALYTICS_CHANNEL);
21
+ }
22
+ };
23
+ };
@@ -9,10 +9,12 @@ import _regeneratorRuntime from "@babel/runtime/regenerator";
9
9
  import React, { useEffect, useState } from 'react';
10
10
  import { di } from 'react-magnetic-di';
11
11
  import { css } from '@emotion/react';
12
+ import { useAnalyticsEvents } from '@atlaskit/analytics-next';
12
13
  import useRelatedUrls from '../../../../../state/hooks/use-related-urls';
13
14
  import { RelatedUrlsBlockErroredView } from './errored';
14
15
  import { RelatedUrlsResolvedView } from './resolved';
15
16
  import { RelatedUrlsBlockResolvingView } from './resolving';
17
+ import { fireRelatedLinksLoadedEvent } from './analytics';
16
18
  /**
17
19
  * Represents a block to display related resources of a url
18
20
  */
@@ -22,6 +24,8 @@ var RelatedUrlsBlock = function RelatedUrlsBlock(_ref) {
22
24
  url = _ref.url,
23
25
  renderers = _ref.renderers,
24
26
  blockProps = _objectWithoutProperties(_ref, _excluded);
27
+ var _useAnalyticsEvents = useAnalyticsEvents(),
28
+ createAnalyticsEvent = _useAnalyticsEvents.createAnalyticsEvent;
25
29
  var _useState = useState(true),
26
30
  _useState2 = _slicedToArray(_useState, 2),
27
31
  loadingRelatedUrls = _useState2[0],
@@ -38,7 +42,7 @@ var RelatedUrlsBlock = function RelatedUrlsBlock(_ref) {
38
42
  useEffect(function () {
39
43
  var fetchRelatedUrls = /*#__PURE__*/function () {
40
44
  var _ref2 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee() {
41
- var relUrls;
45
+ var _relUrls$resolvedResu, _relUrls$resolvedResu2, relUrls;
42
46
  return _regeneratorRuntime.wrap(function _callee$(_context) {
43
47
  while (1) switch (_context.prev = _context.next) {
44
48
  case 0:
@@ -48,26 +52,33 @@ var RelatedUrlsBlock = function RelatedUrlsBlock(_ref) {
48
52
  case 3:
49
53
  relUrls = _context.sent;
50
54
  setRelatedUrls(relUrls);
51
- _context.next = 10;
55
+
56
+ /**
57
+ * Fire TrackRelatedLinksLoadedEvent
58
+ */
59
+ fireRelatedLinksLoadedEvent(createAnalyticsEvent)({
60
+ relatedLinksCount: (_relUrls$resolvedResu = (_relUrls$resolvedResu2 = relUrls.resolvedResults) === null || _relUrls$resolvedResu2 === void 0 ? void 0 : _relUrls$resolvedResu2.length) !== null && _relUrls$resolvedResu !== void 0 ? _relUrls$resolvedResu : 0
61
+ });
62
+ _context.next = 11;
52
63
  break;
53
- case 7:
54
- _context.prev = 7;
64
+ case 8:
65
+ _context.prev = 8;
55
66
  _context.t0 = _context["catch"](0);
56
67
  setErr(_context.t0);
57
- case 10:
58
- setLoadingRelatedUrls(false);
59
68
  case 11:
69
+ setLoadingRelatedUrls(false);
70
+ case 12:
60
71
  case "end":
61
72
  return _context.stop();
62
73
  }
63
- }, _callee, null, [[0, 7]]);
74
+ }, _callee, null, [[0, 8]]);
64
75
  }));
65
76
  return function fetchRelatedUrls() {
66
77
  return _ref2.apply(this, arguments);
67
78
  };
68
79
  }();
69
80
  fetchRelatedUrls();
70
- }, [getRelatedUrls, url]);
81
+ }, [createAnalyticsEvent, getRelatedUrls, url]);
71
82
  if (loadingRelatedUrls) {
72
83
  return /*#__PURE__*/React.createElement(RelatedUrlsBlockResolvingView, _extends({
73
84
  testId: "".concat(testId, "-resolving-view")
@@ -1,7 +1,7 @@
1
1
  import _taggedTemplateLiteral from "@babel/runtime/helpers/taggedTemplateLiteral";
2
2
  import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
3
3
  var _templateObject;
4
- import React, { useCallback, useMemo, useState } from 'react';
4
+ import React, { useCallback, useState } from 'react';
5
5
  import { useIntl } from 'react-intl-next';
6
6
  import ChevronDownIcon from '@atlaskit/icon/glyph/chevron-down';
7
7
  import ChevronUpIcon from '@atlaskit/icon/glyph/chevron-up';
@@ -10,7 +10,7 @@ import { css } from '@emotion/react';
10
10
  import { messages } from '../../../../../../../messages';
11
11
  import { getFormattedMessageAsString } from '../../../../../components/utils';
12
12
  import Text from '../../../../elements/text';
13
- import RelatedUrlItem from './related-url-item';
13
+ import ResolvedResultsStack from './resolved-result-stack';
14
14
  var RelatedUrlList = function RelatedUrlList(_ref) {
15
15
  var resolvedResults = _ref.resolvedResults,
16
16
  title = _ref.title,
@@ -26,19 +26,6 @@ var RelatedUrlList = function RelatedUrlList(_ref) {
26
26
  }, [isOpen]);
27
27
  var ChevronComponent = isOpen ? ChevronUpIcon : ChevronDownIcon;
28
28
  var intl = useIntl();
29
- var resolvedResultsStack = useMemo(function () {
30
- return /*#__PURE__*/React.createElement(Stack, {
31
- space: "space.050",
32
- testId: "".concat(testId, "-items-wrapper")
33
- }, resolvedResults.map(function (resolvedResults, idx) {
34
- return /*#__PURE__*/React.createElement(RelatedUrlItem, {
35
- testId: "".concat(testId, "-item"),
36
- key: idx,
37
- results: resolvedResults,
38
- renderers: renderers
39
- });
40
- }));
41
- }, [renderers, resolvedResults, testId]);
42
29
  return resolvedResults.length > 0 ? /*#__PURE__*/React.createElement(Stack, {
43
30
  testId: testId,
44
31
  xcss: xcss({
@@ -46,7 +33,11 @@ var RelatedUrlList = function RelatedUrlList(_ref) {
46
33
  })
47
34
  }, /*#__PURE__*/React.createElement(Box, {
48
35
  onClick: chevronClickHandler,
49
- testId: "".concat(testId, "-expand-title")
36
+ testId: "".concat(testId, "-expand-title"),
37
+ as: "button",
38
+ backgroundColor: "color.background.neutral.subtle",
39
+ "aria-expanded": !!isOpen,
40
+ padding: "space.0"
50
41
  }, /*#__PURE__*/React.createElement(Inline, {
51
42
  alignBlock: "center",
52
43
  spread: "space-between"
@@ -58,7 +49,11 @@ var RelatedUrlList = function RelatedUrlList(_ref) {
58
49
  }), /*#__PURE__*/React.createElement(ChevronComponent, {
59
50
  label: getFormattedMessageAsString(intl, title),
60
51
  size: 'medium'
61
- }))), isOpen && resolvedResultsStack) : /*#__PURE__*/React.createElement(Text, {
52
+ }))), isOpen && /*#__PURE__*/React.createElement(ResolvedResultsStack, {
53
+ resolvedResults: resolvedResults,
54
+ testId: testId,
55
+ renderers: renderers
56
+ })) : /*#__PURE__*/React.createElement(Text, {
62
57
  testId: testId,
63
58
  message: {
64
59
  descriptor: messages.related_work_items_not_found
@@ -1,20 +1,27 @@
1
1
  import _extends from "@babel/runtime/helpers/extends";
2
- import React, { useMemo } from 'react';
2
+ import React, { useCallback, useMemo } from 'react';
3
3
  import { Inline } from '@atlaskit/primitives';
4
+ import { useAnalyticsEvents } from '@atlaskit/analytics-next';
4
5
  import { SmartLinkSize } from '../../../../../../../../constants';
5
6
  import extractFlexibleUiContext from '../../../../../../../../extractors/flexible';
6
7
  import Icon from '../../../../../elements/icon';
7
8
  import Link from '../../../../../elements/link';
9
+ import { fireLinkClickedEvent } from '../../../../../../../../utils/analytics/click';
8
10
  var RelatedUrlItem = function RelatedUrlItem(_ref) {
9
11
  var results = _ref.results,
10
12
  renderers = _ref.renderers,
11
13
  testId = _ref.testId;
14
+ var _useAnalyticsEvents = useAnalyticsEvents(),
15
+ createAnalyticsEvent = _useAnalyticsEvents.createAnalyticsEvent;
12
16
  var flexibleDataContext = useMemo(function () {
13
17
  return extractFlexibleUiContext({
14
18
  response: results,
15
19
  renderers: renderers
16
20
  });
17
21
  }, [renderers, results]);
22
+ var onClick = useCallback(function (event) {
23
+ fireLinkClickedEvent(createAnalyticsEvent)(event);
24
+ }, [createAnalyticsEvent]);
18
25
  return /*#__PURE__*/React.createElement(Inline, {
19
26
  alignBlock: "center",
20
27
  space: "space.050",
@@ -27,7 +34,8 @@ var RelatedUrlItem = function RelatedUrlItem(_ref) {
27
34
  text: flexibleDataContext === null || flexibleDataContext === void 0 ? void 0 : flexibleDataContext.title,
28
35
  url: flexibleDataContext === null || flexibleDataContext === void 0 ? void 0 : flexibleDataContext.url,
29
36
  size: SmartLinkSize.Small,
30
- maxLines: 1
37
+ maxLines: 1,
38
+ onClick: onClick
31
39
  }));
32
40
  };
33
41
  export default RelatedUrlItem;
@@ -0,0 +1,44 @@
1
+ import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
+ 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; }
3
+ 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) { _defineProperty(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; }
4
+ import React from 'react';
5
+ import { AnalyticsContext } from '@atlaskit/analytics-next';
6
+ import { getResolvedAttributes } from '@atlaskit/link-analytics/resolved-attributes';
7
+ import { ANALYTICS_CHANNEL } from '../../../../../../../../utils/analytics';
8
+ var createUiRelatedLinksViewedEventPayload = function createUiRelatedLinksViewedEventPayload(_ref) {
9
+ var relatedLinksCount = _ref.relatedLinksCount;
10
+ return {
11
+ action: 'viewed',
12
+ actionSubject: 'relatedLinks',
13
+ eventType: 'ui',
14
+ attributes: {
15
+ relatedLinksCount: relatedLinksCount
16
+ }
17
+ };
18
+ };
19
+ export var fireRelatedLinksViewedEvent = function fireRelatedLinksViewedEvent(createAnalyticsEvent) {
20
+ return function (attributes) {
21
+ var payload = createUiRelatedLinksViewedEventPayload(attributes);
22
+ if (payload) {
23
+ createAnalyticsEvent(_objectSpread({}, payload)).fire(ANALYTICS_CHANNEL);
24
+ }
25
+ };
26
+ };
27
+ export var RelatedUrlItemAnalyticsContext = function RelatedUrlItemAnalyticsContext(props) {
28
+ var children = props.children,
29
+ details = props.details;
30
+
31
+ /**
32
+ * We don't really need the `url` to get the attributes here so set
33
+ * it to an empty string to just make typescript happy
34
+ */
35
+ var attributes = getResolvedAttributes({
36
+ url: ''
37
+ }, details);
38
+ return /*#__PURE__*/React.createElement(AnalyticsContext, {
39
+ data: {
40
+ attributes: attributes,
41
+ component: 'relatedLink'
42
+ }
43
+ }, children);
44
+ };
@@ -0,0 +1,44 @@
1
+ import React, { useEffect } from 'react';
2
+ import { Stack, xcss } from '@atlaskit/primitives';
3
+ import { AnalyticsContext, useAnalyticsEvents } from '@atlaskit/analytics-next';
4
+ import RelatedUrlItem from '../related-url-item';
5
+ import { RelatedUrlItemAnalyticsContext, fireRelatedLinksViewedEvent } from './analytics';
6
+ var ResolvedResultsStack = function ResolvedResultsStack(_ref) {
7
+ var resolvedResults = _ref.resolvedResults,
8
+ testId = _ref.testId,
9
+ renderers = _ref.renderers;
10
+ var _useAnalyticsEvents = useAnalyticsEvents(),
11
+ createAnalyticsEvent = _useAnalyticsEvents.createAnalyticsEvent;
12
+ useEffect(function () {
13
+ // This event will fire each time the component is loaded
14
+ fireRelatedLinksViewedEvent(createAnalyticsEvent)({
15
+ relatedLinksCount: resolvedResults.length
16
+ });
17
+ }, [resolvedResults.length, createAnalyticsEvent]);
18
+ return /*#__PURE__*/React.createElement(Stack, {
19
+ space: "space.050",
20
+ testId: "".concat(testId, "-items-wrapper"),
21
+ as: "ul",
22
+ xcss: xcss({
23
+ paddingLeft: '0px',
24
+ marginTop: '0px'
25
+ })
26
+ }, resolvedResults.map(function (resolvedResults, idx) {
27
+ return /*#__PURE__*/React.createElement(RelatedUrlItemAnalyticsContext, {
28
+ details: resolvedResults,
29
+ key: idx
30
+ }, /*#__PURE__*/React.createElement(RelatedUrlItem, {
31
+ testId: "".concat(testId, "-item"),
32
+ results: resolvedResults,
33
+ renderers: renderers
34
+ }));
35
+ }));
36
+ };
37
+ var ResolvedResultsStackWithAnalytics = function ResolvedResultsStackWithAnalytics(props) {
38
+ return /*#__PURE__*/React.createElement(AnalyticsContext, {
39
+ data: {
40
+ component: 'relatedLinksSection'
41
+ }
42
+ }, /*#__PURE__*/React.createElement(ResolvedResultsStack, props));
43
+ };
44
+ export default ResolvedResultsStackWithAnalytics;
@@ -11,7 +11,7 @@ import LinkWarningModal from './LinkWarningModal';
11
11
  import { getBooleanFF } from '@atlaskit/platform-feature-flags';
12
12
  var PACKAGE_DATA = {
13
13
  packageName: "@atlaskit/smart-card",
14
- packageVersion: "26.41.3",
14
+ packageVersion: "26.42.0",
15
15
  componentName: 'linkUrl'
16
16
  };
17
17
  var Link = withLinkClickedEvent('a');
@@ -1,7 +1,7 @@
1
1
  import { GasPayload } from '@atlaskit/analytics-gas-types';
2
2
  import { CardInnerAppearance } from '../view/Card/types';
3
- export type AnalyticsAction = 'authStarted' | 'clicked' | 'closed' | 'connected' | 'connectFailed' | 'connectSucceeded' | 'created' | 'dismissed' | 'inserted' | 'renderFailed' | 'renderSuccess' | 'renderWithStatus' | 'resolved' | 'viewed' | 'unresolved' | 'updated' | 'chunkLoadFailed' | 'dwelled' | 'focused' | 'started' | 'success' | 'failed';
4
- export type AnalyticsActionSubject = 'smartLink' | 'smartLinkAction' | 'applicationAccount' | 'button' | 'consentModal' | 'hoverCard' | 'modal' | 'embedPreviewModal' | 'smartLinkIframe' | 'link' | 'smartLinkQuickAction';
3
+ export type AnalyticsAction = 'authStarted' | 'clicked' | 'closed' | 'connected' | 'connectFailed' | 'connectSucceeded' | 'created' | 'dismissed' | 'inserted' | 'renderFailed' | 'renderSuccess' | 'renderWithStatus' | 'resolved' | 'viewed' | 'unresolved' | 'updated' | 'chunkLoadFailed' | 'dwelled' | 'focused' | 'started' | 'success' | 'failed' | 'loaded';
4
+ export type AnalyticsActionSubject = 'smartLink' | 'smartLinkAction' | 'applicationAccount' | 'button' | 'consentModal' | 'hoverCard' | 'modal' | 'embedPreviewModal' | 'smartLinkIframe' | 'link' | 'smartLinkQuickAction' | 'relatedLinks';
5
5
  export type AnalyticsName = 'embedPreviewModal';
6
6
  export type AnalyticsOrigin = 'smartLinkCard' | 'smartLinkEmbed' | 'smartLinkInline' | 'smartLinkPreviewHoverCard';
7
7
  export type AnalyticsPayload = GasPayload & {
@@ -0,0 +1,3 @@
1
+ import { AnalyticsEventPayload, UIAnalyticsEvent } from '@atlaskit/analytics-next';
2
+ import { TrackRelatedLinksLoadedEventProps } from './types';
3
+ export declare const fireRelatedLinksLoadedEvent: (createAnalyticsEvent: (payload: AnalyticsEventPayload) => UIAnalyticsEvent) => (attributes: TrackRelatedLinksLoadedEventProps) => void;
@@ -0,0 +1,11 @@
1
+ import React from 'react';
2
+ import { AnalyticsEventPayload, UIAnalyticsEvent } from '@atlaskit/analytics-next';
3
+ import { JsonLd } from 'json-ld-types';
4
+ import { UiRelatedLinksViewedEventProps } from './types';
5
+ export declare const fireRelatedLinksViewedEvent: (createAnalyticsEvent: (payload: AnalyticsEventPayload) => UIAnalyticsEvent) => (attributes: UiRelatedLinksViewedEventProps) => void;
6
+ type RelatedUrlItemAnalyticsContextProps = {
7
+ details: JsonLd.Response;
8
+ children?: React.ReactNode;
9
+ };
10
+ export declare const RelatedUrlItemAnalyticsContext: (props: RelatedUrlItemAnalyticsContextProps) => JSX.Element;
11
+ export {};
@@ -0,0 +1,4 @@
1
+ /// <reference types="react" />
2
+ import { ResolvedResultsStackProps } from './types';
3
+ declare const ResolvedResultsStackWithAnalytics: (props: ResolvedResultsStackProps) => JSX.Element;
4
+ export default ResolvedResultsStackWithAnalytics;
@@ -0,0 +1,10 @@
1
+ import { JsonLd } from 'json-ld-types';
2
+ import { CardProviderRenderers } from '@atlaskit/link-provider';
3
+ export interface ResolvedResultsStackProps {
4
+ testId: string;
5
+ resolvedResults: JsonLd.Response[];
6
+ renderers?: CardProviderRenderers;
7
+ }
8
+ export type UiRelatedLinksViewedEventProps = {
9
+ relatedLinksCount: number;
10
+ };
@@ -0,0 +1,3 @@
1
+ export type TrackRelatedLinksLoadedEventProps = {
2
+ relatedLinksCount: number;
3
+ };
@@ -1,7 +1,7 @@
1
1
  import { GasPayload } from '@atlaskit/analytics-gas-types';
2
2
  import { CardInnerAppearance } from '../view/Card/types';
3
- export type AnalyticsAction = 'authStarted' | 'clicked' | 'closed' | 'connected' | 'connectFailed' | 'connectSucceeded' | 'created' | 'dismissed' | 'inserted' | 'renderFailed' | 'renderSuccess' | 'renderWithStatus' | 'resolved' | 'viewed' | 'unresolved' | 'updated' | 'chunkLoadFailed' | 'dwelled' | 'focused' | 'started' | 'success' | 'failed';
4
- export type AnalyticsActionSubject = 'smartLink' | 'smartLinkAction' | 'applicationAccount' | 'button' | 'consentModal' | 'hoverCard' | 'modal' | 'embedPreviewModal' | 'smartLinkIframe' | 'link' | 'smartLinkQuickAction';
3
+ export type AnalyticsAction = 'authStarted' | 'clicked' | 'closed' | 'connected' | 'connectFailed' | 'connectSucceeded' | 'created' | 'dismissed' | 'inserted' | 'renderFailed' | 'renderSuccess' | 'renderWithStatus' | 'resolved' | 'viewed' | 'unresolved' | 'updated' | 'chunkLoadFailed' | 'dwelled' | 'focused' | 'started' | 'success' | 'failed' | 'loaded';
4
+ export type AnalyticsActionSubject = 'smartLink' | 'smartLinkAction' | 'applicationAccount' | 'button' | 'consentModal' | 'hoverCard' | 'modal' | 'embedPreviewModal' | 'smartLinkIframe' | 'link' | 'smartLinkQuickAction' | 'relatedLinks';
5
5
  export type AnalyticsName = 'embedPreviewModal';
6
6
  export type AnalyticsOrigin = 'smartLinkCard' | 'smartLinkEmbed' | 'smartLinkInline' | 'smartLinkPreviewHoverCard';
7
7
  export type AnalyticsPayload = GasPayload & {
@@ -0,0 +1,3 @@
1
+ import { AnalyticsEventPayload, UIAnalyticsEvent } from '@atlaskit/analytics-next';
2
+ import { TrackRelatedLinksLoadedEventProps } from './types';
3
+ export declare const fireRelatedLinksLoadedEvent: (createAnalyticsEvent: (payload: AnalyticsEventPayload) => UIAnalyticsEvent) => (attributes: TrackRelatedLinksLoadedEventProps) => void;
@@ -0,0 +1,11 @@
1
+ import React from 'react';
2
+ import { AnalyticsEventPayload, UIAnalyticsEvent } from '@atlaskit/analytics-next';
3
+ import { JsonLd } from 'json-ld-types';
4
+ import { UiRelatedLinksViewedEventProps } from './types';
5
+ export declare const fireRelatedLinksViewedEvent: (createAnalyticsEvent: (payload: AnalyticsEventPayload) => UIAnalyticsEvent) => (attributes: UiRelatedLinksViewedEventProps) => void;
6
+ type RelatedUrlItemAnalyticsContextProps = {
7
+ details: JsonLd.Response;
8
+ children?: React.ReactNode;
9
+ };
10
+ export declare const RelatedUrlItemAnalyticsContext: (props: RelatedUrlItemAnalyticsContextProps) => JSX.Element;
11
+ export {};
@@ -0,0 +1,4 @@
1
+ /// <reference types="react" />
2
+ import { ResolvedResultsStackProps } from './types';
3
+ declare const ResolvedResultsStackWithAnalytics: (props: ResolvedResultsStackProps) => JSX.Element;
4
+ export default ResolvedResultsStackWithAnalytics;
@@ -0,0 +1,10 @@
1
+ import { JsonLd } from 'json-ld-types';
2
+ import { CardProviderRenderers } from '@atlaskit/link-provider';
3
+ export interface ResolvedResultsStackProps {
4
+ testId: string;
5
+ resolvedResults: JsonLd.Response[];
6
+ renderers?: CardProviderRenderers;
7
+ }
8
+ export type UiRelatedLinksViewedEventProps = {
9
+ relatedLinksCount: number;
10
+ };
@@ -0,0 +1,3 @@
1
+ export type TrackRelatedLinksLoadedEventProps = {
2
+ relatedLinksCount: number;
3
+ };
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@atlaskit/smart-card",
3
- "version": "26.41.3",
3
+ "version": "26.42.0",
4
4
  "description": "Smart card component",
5
5
  "publishConfig": {
6
6
  "registry": "https://registry.npmjs.org/"
@@ -38,7 +38,7 @@
38
38
  "@atlaskit/link-analytics": "^8.3.0",
39
39
  "@atlaskit/link-client-extension": "^1.8.0",
40
40
  "@atlaskit/link-extractors": "^1.2.0",
41
- "@atlaskit/linking-common": "^4.15.0",
41
+ "@atlaskit/linking-common": "^4.16.0",
42
42
  "@atlaskit/linking-types": "^8.4.0",
43
43
  "@atlaskit/logo": "^13.14.0",
44
44
  "@atlaskit/lozenge": "^11.4.0",
package/report.api.md CHANGED
@@ -104,6 +104,7 @@ export type AnalyticsAction =
104
104
  | 'failed'
105
105
  | 'focused'
106
106
  | 'inserted'
107
+ | 'loaded'
107
108
  | 'renderFailed'
108
109
  | 'renderSuccess'
109
110
  | 'renderWithStatus'
@@ -123,6 +124,7 @@ export type AnalyticsActionSubject =
123
124
  | 'hoverCard'
124
125
  | 'link'
125
126
  | 'modal'
127
+ | 'relatedLinks'
126
128
  | 'smartLink'
127
129
  | 'smartLinkAction'
128
130
  | 'smartLinkIframe'
@@ -76,10 +76,10 @@ type ActionProps = {
76
76
  };
77
77
 
78
78
  // @public (undocumented)
79
- export type AnalyticsAction = 'authStarted' | 'chunkLoadFailed' | 'clicked' | 'closed' | 'connectFailed' | 'connectSucceeded' | 'connected' | 'created' | 'dismissed' | 'dwelled' | 'failed' | 'focused' | 'inserted' | 'renderFailed' | 'renderSuccess' | 'renderWithStatus' | 'resolved' | 'started' | 'success' | 'unresolved' | 'updated' | 'viewed';
79
+ export type AnalyticsAction = 'authStarted' | 'chunkLoadFailed' | 'clicked' | 'closed' | 'connectFailed' | 'connectSucceeded' | 'connected' | 'created' | 'dismissed' | 'dwelled' | 'failed' | 'focused' | 'inserted' | 'loaded' | 'renderFailed' | 'renderSuccess' | 'renderWithStatus' | 'resolved' | 'started' | 'success' | 'unresolved' | 'updated' | 'viewed';
80
80
 
81
81
  // @public (undocumented)
82
- export type AnalyticsActionSubject = 'applicationAccount' | 'button' | 'consentModal' | 'embedPreviewModal' | 'hoverCard' | 'link' | 'modal' | 'smartLink' | 'smartLinkAction' | 'smartLinkIframe' | 'smartLinkQuickAction';
82
+ export type AnalyticsActionSubject = 'applicationAccount' | 'button' | 'consentModal' | 'embedPreviewModal' | 'hoverCard' | 'link' | 'modal' | 'relatedLinks' | 'smartLink' | 'smartLinkAction' | 'smartLinkIframe' | 'smartLinkQuickAction';
83
83
 
84
84
  // @public (undocumented)
85
85
  type AnalyticsFacade = ReturnType<typeof useSmartLinkAnalytics>;