@atlaskit/smart-card 26.41.2 → 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 (68) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/cjs/ssr.js +2 -2
  3. package/dist/cjs/utils/analytics/analytics.js +1 -1
  4. package/dist/cjs/view/CardWithUrl/component-lazy/LazyFallback.js +2 -19
  5. package/dist/cjs/view/CardWithUrl/component-lazy/LazyIntersectionObserverCard.js +2 -2
  6. package/dist/cjs/view/CardWithUrl/component-lazy/LazyLazilyRenderCard.js +2 -2
  7. package/dist/cjs/view/CardWithUrl/component-lazy/LoadingCardLink.js +24 -0
  8. package/dist/cjs/view/CardWithUrl/loader.js +2 -2
  9. package/dist/cjs/view/FlexibleCard/components/blocks/related-urls-block/analytics.js +30 -0
  10. package/dist/cjs/view/FlexibleCard/components/blocks/related-urls-block/index.js +19 -8
  11. package/dist/cjs/view/FlexibleCard/components/blocks/related-urls-block/resolved/related-url-list/index.js +11 -16
  12. package/dist/cjs/view/FlexibleCard/components/blocks/related-urls-block/resolved/related-url-list/related-url-item/index.js +9 -1
  13. package/dist/cjs/view/FlexibleCard/components/blocks/related-urls-block/resolved/related-url-list/resolved-result-stack/analytics.js +51 -0
  14. package/dist/cjs/view/FlexibleCard/components/blocks/related-urls-block/resolved/related-url-list/resolved-result-stack/index.js +54 -0
  15. package/dist/cjs/view/FlexibleCard/components/blocks/related-urls-block/resolved/related-url-list/resolved-result-stack/types.js +5 -0
  16. package/dist/cjs/view/FlexibleCard/components/blocks/related-urls-block/types.js +5 -0
  17. package/dist/cjs/view/LinkUrl/index.js +1 -1
  18. package/dist/es2019/ssr.js +1 -1
  19. package/dist/es2019/utils/analytics/analytics.js +1 -1
  20. package/dist/es2019/view/CardWithUrl/component-lazy/LazyFallback.js +1 -18
  21. package/dist/es2019/view/CardWithUrl/component-lazy/LazyIntersectionObserverCard.js +1 -1
  22. package/dist/es2019/view/CardWithUrl/component-lazy/LazyLazilyRenderCard.js +1 -1
  23. package/dist/es2019/view/CardWithUrl/component-lazy/LoadingCardLink.js +18 -0
  24. package/dist/es2019/view/CardWithUrl/loader.js +1 -1
  25. package/dist/es2019/view/FlexibleCard/components/blocks/related-urls-block/analytics.js +19 -0
  26. package/dist/es2019/view/FlexibleCard/components/blocks/related-urls-block/index.js +14 -1
  27. package/dist/es2019/view/FlexibleCard/components/blocks/related-urls-block/resolved/related-url-list/index.js +12 -15
  28. package/dist/es2019/view/FlexibleCard/components/blocks/related-urls-block/resolved/related-url-list/related-url-item/index.js +11 -2
  29. package/dist/es2019/view/FlexibleCard/components/blocks/related-urls-block/resolved/related-url-list/resolved-result-stack/analytics.js +42 -0
  30. package/dist/es2019/view/FlexibleCard/components/blocks/related-urls-block/resolved/related-url-list/resolved-result-stack/index.js +44 -0
  31. package/dist/es2019/view/FlexibleCard/components/blocks/related-urls-block/resolved/related-url-list/resolved-result-stack/types.js +1 -0
  32. package/dist/es2019/view/FlexibleCard/components/blocks/related-urls-block/types.js +1 -0
  33. package/dist/es2019/view/LinkUrl/index.js +1 -1
  34. package/dist/esm/ssr.js +1 -1
  35. package/dist/esm/utils/analytics/analytics.js +1 -1
  36. package/dist/esm/view/CardWithUrl/component-lazy/LazyFallback.js +1 -17
  37. package/dist/esm/view/CardWithUrl/component-lazy/LazyIntersectionObserverCard.js +1 -1
  38. package/dist/esm/view/CardWithUrl/component-lazy/LazyLazilyRenderCard.js +1 -1
  39. package/dist/esm/view/CardWithUrl/component-lazy/LoadingCardLink.js +17 -0
  40. package/dist/esm/view/CardWithUrl/loader.js +1 -1
  41. package/dist/esm/view/FlexibleCard/components/blocks/related-urls-block/analytics.js +23 -0
  42. package/dist/esm/view/FlexibleCard/components/blocks/related-urls-block/index.js +19 -8
  43. package/dist/esm/view/FlexibleCard/components/blocks/related-urls-block/resolved/related-url-list/index.js +12 -17
  44. package/dist/esm/view/FlexibleCard/components/blocks/related-urls-block/resolved/related-url-list/related-url-item/index.js +10 -2
  45. package/dist/esm/view/FlexibleCard/components/blocks/related-urls-block/resolved/related-url-list/resolved-result-stack/analytics.js +44 -0
  46. package/dist/esm/view/FlexibleCard/components/blocks/related-urls-block/resolved/related-url-list/resolved-result-stack/index.js +44 -0
  47. package/dist/esm/view/FlexibleCard/components/blocks/related-urls-block/resolved/related-url-list/resolved-result-stack/types.js +1 -0
  48. package/dist/esm/view/FlexibleCard/components/blocks/related-urls-block/types.js +1 -0
  49. package/dist/esm/view/LinkUrl/index.js +1 -1
  50. package/dist/types/utils/types.d.ts +2 -2
  51. package/dist/types/view/CardWithUrl/component-lazy/LazyFallback.d.ts +0 -3
  52. package/dist/types/view/CardWithUrl/component-lazy/LoadingCardLink.d.ts +3 -0
  53. package/dist/types/view/FlexibleCard/components/blocks/related-urls-block/analytics.d.ts +3 -0
  54. package/dist/types/view/FlexibleCard/components/blocks/related-urls-block/resolved/related-url-list/resolved-result-stack/analytics.d.ts +11 -0
  55. package/dist/types/view/FlexibleCard/components/blocks/related-urls-block/resolved/related-url-list/resolved-result-stack/index.d.ts +4 -0
  56. package/dist/types/view/FlexibleCard/components/blocks/related-urls-block/resolved/related-url-list/resolved-result-stack/types.d.ts +10 -0
  57. package/dist/types/view/FlexibleCard/components/blocks/related-urls-block/types.d.ts +3 -0
  58. package/dist/types-ts4.5/utils/types.d.ts +2 -2
  59. package/dist/types-ts4.5/view/CardWithUrl/component-lazy/LazyFallback.d.ts +0 -3
  60. package/dist/types-ts4.5/view/CardWithUrl/component-lazy/LoadingCardLink.d.ts +3 -0
  61. package/dist/types-ts4.5/view/FlexibleCard/components/blocks/related-urls-block/analytics.d.ts +3 -0
  62. package/dist/types-ts4.5/view/FlexibleCard/components/blocks/related-urls-block/resolved/related-url-list/resolved-result-stack/analytics.d.ts +11 -0
  63. package/dist/types-ts4.5/view/FlexibleCard/components/blocks/related-urls-block/resolved/related-url-list/resolved-result-stack/index.d.ts +4 -0
  64. package/dist/types-ts4.5/view/FlexibleCard/components/blocks/related-urls-block/resolved/related-url-list/resolved-result-stack/types.d.ts +10 -0
  65. package/dist/types-ts4.5/view/FlexibleCard/components/blocks/related-urls-block/types.d.ts +3 -0
  66. package/package.json +3 -3
  67. package/report.api.md +2 -0
  68. package/tmp/api-report-tmp.d.ts +2 -2
@@ -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.2",
11
+ packageVersion: "26.42.0",
12
12
  componentName: 'linkUrl'
13
13
  };
14
14
  const Link = withLinkClickedEvent('a');
package/dist/esm/ssr.js CHANGED
@@ -8,7 +8,7 @@ import uuid from 'uuid';
8
8
  import { ErrorBoundary } from 'react-error-boundary';
9
9
  import { AnalyticsContext } from '@atlaskit/analytics-next';
10
10
  import { CardWithUrlContent } from './view/CardWithUrl/component';
11
- import { LoadingCardLink } from './view/CardWithUrl/component-lazy/LazyFallback';
11
+ import { LoadingCardLink } from './view/CardWithUrl/component-lazy/LoadingCardLink';
12
12
  import { context } from './utils/analytics/analytics';
13
13
  // SSR friendly version of smart-card
14
14
  // simplifies the logic around rendering and loading placeholders and
@@ -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.2"
18
+ packageVersion: "26.42.0"
19
19
  };
20
20
  export var TrackQuickActionType = /*#__PURE__*/function (TrackQuickActionType) {
21
21
  TrackQuickActionType["StatusUpdate"] = "StatusUpdate";
@@ -1,17 +1 @@
1
- import React from 'react';
2
- import { CardLinkView } from '../../../view/LinkView';
3
- export var loadingPlaceholderClassName = 'smart-link-loading-placeholder';
4
- export var LoadingCardLink = function LoadingCardLink(_ref) {
5
- var isSelected = _ref.isSelected,
6
- url = _ref.url,
7
- placeholder = _ref.placeholder;
8
- return /*#__PURE__*/React.createElement(CardLinkView, {
9
- key: 'lazy-render-key',
10
- testId: 'lazy-render-placeholder',
11
- "data-trello-do-not-use-override": "lazy-render-placeholder-trello",
12
- isSelected: isSelected,
13
- link: url,
14
- className: loadingPlaceholderClassName,
15
- placeholder: placeholder
16
- });
17
- };
1
+ export var loadingPlaceholderClassName = 'smart-link-loading-placeholder';
@@ -3,7 +3,7 @@ import _slicedToArray from "@babel/runtime/helpers/slicedToArray";
3
3
  import React, { useCallback, useState } from 'react';
4
4
  import { usePrefetch } from '../../../state';
5
5
  import { CardWithUrlContent } from '../component';
6
- import { LoadingCardLink } from './LazyFallback';
6
+ import { LoadingCardLink } from './LoadingCardLink';
7
7
  import { startUfoExperience } from '../../../state/analytics/ufoExperiences';
8
8
 
9
9
  // This property enables the intersection observer to be run once the
@@ -2,7 +2,7 @@ import _extends from "@babel/runtime/helpers/extends";
2
2
  import React, { useState } from 'react';
3
3
  import LazilyRender from 'react-lazily-render';
4
4
  import { CardWithUrlContent } from '../component';
5
- import { LoadingCardLink } from './LazyFallback';
5
+ import { LoadingCardLink } from './LoadingCardLink';
6
6
  import { startUfoExperience } from '../../../state/analytics/ufoExperiences';
7
7
  export function LazyLazilyRenderCard(props) {
8
8
  var appearance = props.appearance,
@@ -0,0 +1,17 @@
1
+ import React from 'react';
2
+ import { CardLinkView } from '../../../view/LinkView';
3
+ import { loadingPlaceholderClassName } from './LazyFallback';
4
+ export var LoadingCardLink = function LoadingCardLink(_ref) {
5
+ var isSelected = _ref.isSelected,
6
+ url = _ref.url,
7
+ placeholder = _ref.placeholder;
8
+ return /*#__PURE__*/React.createElement(CardLinkView, {
9
+ key: 'lazy-render-key',
10
+ testId: 'lazy-render-placeholder',
11
+ "data-trello-do-not-use-override": "lazy-render-placeholder-trello",
12
+ isSelected: isSelected,
13
+ link: url,
14
+ className: loadingPlaceholderClassName,
15
+ placeholder: placeholder
16
+ });
17
+ };
@@ -4,7 +4,7 @@ import uuid from 'uuid';
4
4
  import { clearMarks, clearMeasures } from '../../utils/performance';
5
5
  import { ErrorBoundary } from 'react-error-boundary';
6
6
  import { useSmartLinkAnalytics } from '../../state/analytics';
7
- import { LoadingCardLink } from './component-lazy/LazyFallback';
7
+ import { LoadingCardLink } from './component-lazy/LoadingCardLink';
8
8
  import { importWithRetry } from '../../utils';
9
9
  import { isFlexibleUiCard } from '../../utils/flexible';
10
10
  var LazyCardWithUrlContent = /*#__PURE__*/lazy(function () {
@@ -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.2",
14
+ packageVersion: "26.42.0",
15
15
  componentName: 'linkUrl'
16
16
  };
17
17
  var Link = withLinkClickedEvent('a');