@atlaskit/smart-card 16.1.1 → 17.0.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 (90) hide show
  1. package/CHANGELOG.md +98 -0
  2. package/dist/cjs/client/api.js +1 -1
  3. package/dist/cjs/client/types/responses.js +1 -1
  4. package/dist/cjs/client/utils/environments.js +2 -2
  5. package/dist/cjs/extractors/block/index.js +3 -3
  6. package/dist/cjs/extractors/common/actions/extractPreviewAction.js +2 -2
  7. package/dist/cjs/extractors/common/byline/extractByline.js +17 -5
  8. package/dist/cjs/extractors/common/lozenge/utils.js +1 -1
  9. package/dist/cjs/extractors/common/utils.js +1 -1
  10. package/dist/cjs/extractors/constants.js +1 -1
  11. package/dist/cjs/in-product.js +8 -8
  12. package/dist/cjs/index.js +74 -32
  13. package/dist/cjs/providers/editor/transformer.js +6 -2
  14. package/dist/cjs/state/actions/constants.js +1 -1
  15. package/dist/cjs/state/actions/index.js +14 -7
  16. package/dist/cjs/state/analytics/index.js +32 -84
  17. package/dist/cjs/state/analytics/ufoExperiences.js +63 -0
  18. package/dist/cjs/state/analytics/useSmartLinkAnalytics.js +114 -0
  19. package/dist/cjs/state/context/index.js +3 -2
  20. package/dist/cjs/state/helpers.js +1 -1
  21. package/dist/cjs/state/hooks/useSmartLink.js +6 -6
  22. package/dist/cjs/state/index.js +4 -4
  23. package/dist/cjs/utils/analytics/analytics.js +7 -7
  24. package/dist/cjs/utils/analytics/index.js +27 -27
  25. package/dist/cjs/utils/index.js +1 -1
  26. package/dist/cjs/utils/mocks.js +1 -1
  27. package/dist/cjs/utils/performance.js +1 -1
  28. package/dist/cjs/version.json +1 -1
  29. package/dist/cjs/view/BlockCard/index.js +1 -1
  30. package/dist/cjs/view/Card/index.js +9 -2
  31. package/dist/cjs/view/CardWithUrl/component-lazy/LazyFallback.js +1 -1
  32. package/dist/cjs/view/CardWithUrl/component-lazy/index.js +1 -1
  33. package/dist/cjs/view/CardWithUrl/component.js +8 -3
  34. package/dist/cjs/view/CardWithUrl/loader.js +106 -134
  35. package/dist/cjs/view/EmbedCard/index.js +1 -1
  36. package/dist/es2019/client/utils/environments.js +1 -1
  37. package/dist/es2019/extractors/block/index.js +2 -2
  38. package/dist/es2019/extractors/common/actions/extractPreviewAction.js +2 -2
  39. package/dist/es2019/extractors/common/byline/extractByline.js +16 -5
  40. package/dist/es2019/index.js +1 -1
  41. package/dist/es2019/providers/editor/transformer.js +4 -2
  42. package/dist/es2019/state/actions/index.js +10 -5
  43. package/dist/es2019/state/analytics/index.js +2 -40
  44. package/dist/es2019/state/analytics/ufoExperiences.js +43 -0
  45. package/dist/es2019/state/analytics/useSmartLinkAnalytics.js +76 -0
  46. package/dist/es2019/state/hooks/useSmartLink.js +4 -5
  47. package/dist/es2019/utils/analytics/analytics.js +6 -6
  48. package/dist/es2019/version.json +1 -1
  49. package/dist/es2019/view/BlockCard/index.js +2 -2
  50. package/dist/es2019/view/Card/index.js +8 -2
  51. package/dist/es2019/view/CardWithUrl/component-lazy/index.js +1 -1
  52. package/dist/es2019/view/CardWithUrl/component.js +8 -3
  53. package/dist/es2019/view/CardWithUrl/loader.js +82 -91
  54. package/dist/es2019/view/EmbedCard/index.js +2 -2
  55. package/dist/esm/client/utils/environments.js +1 -1
  56. package/dist/esm/extractors/block/index.js +2 -2
  57. package/dist/esm/extractors/common/actions/extractPreviewAction.js +2 -2
  58. package/dist/esm/extractors/common/byline/extractByline.js +16 -5
  59. package/dist/esm/index.js +1 -1
  60. package/dist/esm/providers/editor/transformer.js +6 -2
  61. package/dist/esm/state/actions/index.js +13 -7
  62. package/dist/esm/state/analytics/index.js +2 -80
  63. package/dist/esm/state/analytics/ufoExperiences.js +43 -0
  64. package/dist/esm/state/analytics/useSmartLinkAnalytics.js +102 -0
  65. package/dist/esm/state/hooks/useSmartLink.js +6 -6
  66. package/dist/esm/utils/analytics/analytics.js +6 -6
  67. package/dist/esm/version.json +1 -1
  68. package/dist/esm/view/BlockCard/index.js +2 -2
  69. package/dist/esm/view/Card/index.js +8 -2
  70. package/dist/esm/view/CardWithUrl/component-lazy/index.js +1 -1
  71. package/dist/esm/view/CardWithUrl/component.js +8 -3
  72. package/dist/esm/view/CardWithUrl/loader.js +101 -130
  73. package/dist/esm/view/EmbedCard/index.js +2 -2
  74. package/dist/types/extractors/block/types.d.ts +1 -1
  75. package/dist/types/extractors/common/actions/extractPreviewAction.d.ts +1 -1
  76. package/dist/types/index.d.ts +1 -1
  77. package/dist/types/state/analytics/index.d.ts +3 -32
  78. package/dist/types/state/analytics/ufoExperiences.d.ts +7 -0
  79. package/dist/types/state/analytics/useSmartLinkAnalytics.d.ts +31 -0
  80. package/dist/types/state/context/provider.d.ts +1 -0
  81. package/dist/types/state/hooks/useSmartLink.d.ts +5 -6
  82. package/dist/types/utils/analytics/analytics.d.ts +3 -3
  83. package/dist/types/utils/test-utils.d.ts +1 -0
  84. package/dist/types/view/Card/index.d.ts +2 -1
  85. package/dist/types/view/CardWithUrl/component-lazy/LazyIntersectionObserverCard.d.ts +1 -0
  86. package/dist/types/view/CardWithUrl/component-lazy/LazyLazilyRenderCard.d.ts +1 -0
  87. package/dist/types/view/CardWithUrl/component-lazy/index.d.ts +2 -1
  88. package/dist/types/view/CardWithUrl/component.d.ts +1 -0
  89. package/dist/types/view/CardWithUrl/loader.d.ts +2 -15
  90. package/package.json +19 -15
@@ -0,0 +1,76 @@
1
+ import { uiAuthEvent, uiAuthAlternateAccountEvent, uiCardClickedEvent, uiActionClickedEvent, uiClosedAuthEvent, uiRenderSuccessEvent, resolvedEvent, unresolvedEvent, invokeSucceededEvent, invokeFailedEvent, connectSucceededEvent, connectFailedEvent, trackAppAccountConnected, screenAuthPopupEvent, instrumentEvent } from '../../utils/analytics';
2
+ import { useMemo } from 'react';
3
+ import { failUfoExperience, startUfoExperience, succeedUfoExperience } from './ufoExperiences';
4
+ export const useSmartLinkAnalytics = dispatchAnalytics => {
5
+ const ui = useMemo(() => ({
6
+ authEvent: (display, definitionId, extensionKey) => dispatchAnalytics(uiAuthEvent(display, definitionId, extensionKey)),
7
+ authAlternateAccountEvent: (display, definitionId, extensionKey) => dispatchAnalytics(uiAuthAlternateAccountEvent(display, definitionId, extensionKey)),
8
+ cardClickedEvent: (display, definitionId, extensionKey) => dispatchAnalytics(uiCardClickedEvent(display, definitionId, extensionKey)),
9
+ actionClickedEvent: (id, extensionKey, actionType, display, invokeType) => {
10
+ startUfoExperience('smart-link-action-invocation', id, {
11
+ actionType,
12
+ display,
13
+ extensionKey,
14
+ invokeType
15
+ });
16
+ dispatchAnalytics(uiActionClickedEvent(extensionKey, actionType, display));
17
+ },
18
+ closedAuthEvent: (display, definitionId, extensionKey) => dispatchAnalytics(uiClosedAuthEvent(display, definitionId, extensionKey)),
19
+ renderSuccessEvent: (display, id, definitionId, extensionKey) => {
20
+ succeedUfoExperience('smart-link-rendered', id, {
21
+ extensionKey,
22
+ display
23
+ }); // UFO will disregard this if authentication experience has not yet been started
24
+
25
+ succeedUfoExperience('smart-link-authenticated', id, {
26
+ display
27
+ });
28
+ dispatchAnalytics(uiRenderSuccessEvent(display, definitionId, extensionKey));
29
+ }
30
+ }), [dispatchAnalytics]);
31
+ const operational = useMemo(() => ({
32
+ resolvedEvent: (id, definitionId, extensionKey, resourceType) => dispatchAnalytics(resolvedEvent(id, definitionId, extensionKey, resourceType)),
33
+ unresolvedEvent: (id, status, definitionId, extensionKey, resourceType) => dispatchAnalytics(unresolvedEvent(id, status, definitionId, extensionKey, resourceType)),
34
+ invokeSucceededEvent: (id, providerKey, actionType, display) => {
35
+ succeedUfoExperience('smart-link-action-invocation', id);
36
+ dispatchAnalytics(invokeSucceededEvent(id, providerKey, actionType, display));
37
+ },
38
+ invokeFailedEvent: (id, providerKey, actionType, display, reason) => {
39
+ failUfoExperience('smart-link-action-invocation', id);
40
+ dispatchAnalytics(invokeFailedEvent(id, providerKey, actionType, display, reason));
41
+ },
42
+ connectSucceededEvent: (id, definitionId, extensionKey) => {
43
+ startUfoExperience('smart-link-authenticated', id, {
44
+ extensionKey,
45
+ status: 'success'
46
+ });
47
+ dispatchAnalytics(connectSucceededEvent(definitionId, extensionKey));
48
+ },
49
+ connectFailedEvent: (id, definitionId, extensionKey, status) => {
50
+ startUfoExperience('smart-link-authenticated', id, {
51
+ extensionKey,
52
+ status
53
+ });
54
+ dispatchAnalytics(connectFailedEvent(definitionId, extensionKey, status));
55
+ },
56
+ instrument: (id, status, definitionId, extensionKey, resourceType, error) => {
57
+ const event = instrumentEvent(id, status, definitionId, extensionKey, resourceType, error);
58
+
59
+ if (event) {
60
+ dispatchAnalytics(event);
61
+ }
62
+ }
63
+ }), [dispatchAnalytics]);
64
+ const track = useMemo(() => ({
65
+ appAccountConnected: (definitionId, extensionKey) => dispatchAnalytics(trackAppAccountConnected(definitionId, extensionKey))
66
+ }), [dispatchAnalytics]);
67
+ const screen = useMemo(() => ({
68
+ authPopupEvent: (definitionId, extensionKey) => dispatchAnalytics(screenAuthPopupEvent(definitionId, extensionKey))
69
+ }), [dispatchAnalytics]);
70
+ return useMemo(() => ({
71
+ ui,
72
+ operational,
73
+ track,
74
+ screen
75
+ }), [ui, operational, track, screen]);
76
+ };
@@ -11,12 +11,10 @@ export function useSmartLink(id, url, dispatchAnalytics) {
11
11
  const config = useSmartLinkConfig();
12
12
  const renderers = useSmartLinkRenderers(); // NB: used to propagate errors from hooks to error boundaries.
13
13
 
14
- const [, setState] = useState(); // Register the current card.
14
+ const [error, setError] = useState(null); // Register the current card.
15
15
 
16
16
  const register = () => {
17
- actions.register().catch(err => setState(() => {
18
- throw err;
19
- }));
17
+ actions.register().catch(err => setError(err));
20
18
  }; // AFP-2511 TODO: Fix automatic suppressions below
21
19
  // eslint-disable-next-line react-hooks/exhaustive-deps
22
20
 
@@ -28,6 +26,7 @@ export function useSmartLink(id, url, dispatchAnalytics) {
28
26
  actions,
29
27
  config,
30
28
  analytics,
31
- renderers
29
+ renderers,
30
+ error
32
31
  };
33
32
  }
@@ -69,7 +69,7 @@ export const unresolvedEvent = (id, status, definitionId, extensionKey, resource
69
69
  } : undefined
70
70
  }
71
71
  });
72
- export const invokeSucceededEvent = (id, providerKey, actionType, display) => {
72
+ export const invokeSucceededEvent = (id, extensionKey, actionType, display) => {
73
73
  const measure = getMeasure(id, 'resolved') || {
74
74
  duration: undefined
75
75
  };
@@ -81,12 +81,12 @@ export const invokeSucceededEvent = (id, providerKey, actionType, display) => {
81
81
  id,
82
82
  actionType,
83
83
  display,
84
- definitionId: providerKey,
84
+ extensionKey,
85
85
  duration: measure.duration
86
86
  }
87
87
  };
88
88
  };
89
- export const invokeFailedEvent = (id, providerKey, actionType, display, reason) => {
89
+ export const invokeFailedEvent = (id, extensionKey, actionType, display, reason) => {
90
90
  const measure = getMeasure(id, 'errored') || {
91
91
  duration: undefined
92
92
  };
@@ -98,7 +98,7 @@ export const invokeFailedEvent = (id, providerKey, actionType, display, reason)
98
98
  id,
99
99
  actionType,
100
100
  display,
101
- definitionId: providerKey,
101
+ extensionKey,
102
102
  duration: measure.duration,
103
103
  reason
104
104
  }
@@ -179,13 +179,13 @@ export const uiCardClickedEvent = (display, definitionId, extensionKey) => ({
179
179
  display
180
180
  }
181
181
  });
182
- export const uiActionClickedEvent = (providerKey, actionType, display) => ({
182
+ export const uiActionClickedEvent = (extensionKey, actionType, display) => ({
183
183
  action: 'clicked',
184
184
  actionSubject: 'smartLinkAction',
185
185
  eventType: 'ui',
186
186
  attributes: { ...context,
187
187
  display,
188
- definitionId: providerKey,
188
+ extensionKey,
189
189
  actionType: actionType
190
190
  }
191
191
  });
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/smart-card",
3
- "version": "16.1.1",
3
+ "version": "17.0.0",
4
4
  "sideEffects": false
5
5
  }
@@ -1,7 +1,7 @@
1
1
  import _extends from "@babel/runtime/helpers/extends";
2
2
  import React from 'react';
3
3
  import { CardLinkView, BlockCardResolvingView, BlockCardErroredView, BlockCardUnauthorisedView, BlockCardForbiddenView, BlockCardResolvedView, BlockCardNotFoundView, AuthorizeAction, ForbiddenAction } from '@atlaskit/media-ui';
4
- import { getDefinitionId } from '../../state/helpers';
4
+ import { getExtensionKey } from '../../state/helpers';
5
5
  import { extractBlockProps } from '../../extractors/block';
6
6
  import { getEmptyJsonLd, getUnauthorizedJsonLd } from '../../utils/jsonld';
7
7
  import { extractRequestAccessContext } from '../../extractors/common/context';
@@ -31,7 +31,7 @@ export const BlockCard = ({
31
31
  const extractorOpts = {
32
32
  handleAnalytics: handlePreviewAnalytics,
33
33
  handleInvoke,
34
- definitionId: getDefinitionId(details)
34
+ extensionKey: getExtensionKey(details)
35
35
  };
36
36
 
37
37
  switch (status) {
@@ -4,12 +4,18 @@ import { CardWithDataRenderer } from '../CardWithData/loader';
4
4
  import { CardWithURLRenderer } from '../CardWithUrl/loader';
5
5
  import { isCardWithData } from '../../utils';
6
6
  import { context } from '../../utils/analytics';
7
+ import { injectIntl, IntlProvider } from 'react-intl-next';
7
8
 
8
9
  class PlainCard extends React.PureComponent {
9
10
  render() {
10
- return isCardWithData(this.props) ? /*#__PURE__*/React.createElement(CardWithDataRenderer, this.props) : /*#__PURE__*/React.createElement(CardWithURLRenderer, this.props);
11
+ const content = isCardWithData(this.props) ? /*#__PURE__*/React.createElement(CardWithDataRenderer, this.props) : /*#__PURE__*/React.createElement(CardWithURLRenderer, this.props);
12
+ return this.props.intl ? content : /*#__PURE__*/React.createElement(IntlProvider, {
13
+ locale: "en"
14
+ }, content);
11
15
  }
12
16
 
13
17
  }
14
18
 
15
- export const Card = withAnalyticsContext(context)(withAnalyticsEvents()(PlainCard));
19
+ export const Card = withAnalyticsContext(context)(withAnalyticsEvents()(injectIntl(PlainCard, {
20
+ enforceContext: false
21
+ })));
@@ -2,7 +2,7 @@ import React from 'react';
2
2
  import { isIntersectionObserverSupported } from '@atlaskit/media-ui';
3
3
  import { LazyLazilyRenderCard } from './LazyLazilyRenderCard';
4
4
  import { LazyIntersectionObserverCard } from './LazyIntersectionObserverCard';
5
- export function LazyCardWithUrlContent(props) {
5
+ export default function LazyCardWithUrlContent(props) {
6
6
  if (isIntersectionObserverSupported()) {
7
7
  return /*#__PURE__*/React.createElement(LazyIntersectionObserverCard, props);
8
8
  } else {
@@ -28,7 +28,8 @@ export function CardWithUrlContent({
28
28
  actions,
29
29
  config,
30
30
  analytics,
31
- renderers
31
+ renderers,
32
+ error
32
33
  } = useSmartLink(id, url, dispatchAnalytics);
33
34
  const definitionId = getDefinitionId(state.details);
34
35
  const extensionKey = getExtensionKey(state.details);
@@ -67,9 +68,13 @@ export function CardWithUrlContent({
67
68
 
68
69
  useEffect(() => {
69
70
  if (isFinalState(state.status)) {
70
- analytics.ui.renderSuccessEvent(appearance, definitionId, extensionKey);
71
+ analytics.ui.renderSuccessEvent(appearance, id, definitionId, extensionKey);
71
72
  }
72
- }, [appearance, state.details, state.status, url, definitionId, extensionKey, analytics.ui]);
73
+ }, [appearance, state.details, state.status, url, definitionId, extensionKey, analytics.ui, id]); // We have to keep this last to prevent hook order from being violated
74
+
75
+ if (error) {
76
+ throw error;
77
+ }
73
78
 
74
79
  switch (appearance) {
75
80
  case 'inline':
@@ -1,60 +1,59 @@
1
- import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
- import React from 'react';
1
+ import React, { lazy, useEffect, useState, Suspense, useCallback } from 'react';
3
2
  import uuid from 'uuid';
4
3
  import { CardLinkView } from '@atlaskit/media-ui';
5
4
  import { uiRenderFailedEvent, fireSmartLinkEvent } from '../../utils/analytics';
6
5
  import { clearMarks, clearMeasures } from '../../utils/performance';
7
- export class CardWithURLRenderer extends React.PureComponent {
8
- constructor(props) {
9
- super(props);
6
+ import { ErrorBoundary } from 'react-error-boundary';
7
+ import { failUfoExperience, startUfoExperience } from '../../state/analytics/ufoExperiences';
8
+ const LazyCardWithUrlContent = /*#__PURE__*/lazy(() => import(
9
+ /* webpackChunkName: "@atlaskit-internal_smartcard-urlcardcontent" */
10
+ './component-lazy/index'));
11
+ export function CardWithURLRenderer(props) {
12
+ const [id] = useState(() => uuid()); // Equivalent to ComponentWillMount
10
13
 
11
- _defineProperty(this, "dispatchAnalytics", analyticsPayload => {
12
- const {
13
- appearance,
14
- createAnalyticsEvent
15
- } = this.props;
16
-
17
- if (analyticsPayload && analyticsPayload.attributes) {
18
- // Update if we haven't already set the display - possible
19
- // in the case of `preview` which is rendered differently.
20
- if (!analyticsPayload.attributes.display) {
21
- analyticsPayload.attributes.display = appearance;
22
- }
23
- }
24
-
25
- fireSmartLinkEvent(analyticsPayload, createAnalyticsEvent);
26
- });
27
-
28
- this.state = {
29
- id: uuid()
14
+ useState(() => {
15
+ // We want to start timing of render event only once and right at the start
16
+ startUfoExperience('smart-link-rendered', id);
17
+ });
18
+ useEffect(() => {
19
+ // ComponentWillUnmount
20
+ return () => {
21
+ clearMarks(id);
22
+ clearMeasures(id);
30
23
  };
31
- }
24
+ }, [id]);
25
+ const {
26
+ url,
27
+ appearance,
28
+ isSelected,
29
+ isFrameVisible,
30
+ onClick,
31
+ container,
32
+ onResolve,
33
+ testId,
34
+ showActions,
35
+ inheritDimensions,
36
+ platform,
37
+ embedIframeRef,
38
+ inlinePreloaderStyle,
39
+ createAnalyticsEvent
40
+ } = props; // Wrapper around analytics.
32
41
 
33
- static moduleImporter(target) {
34
- import(
35
- /* webpackChunkName: "@atlaskit-internal_smartcard-urlcardcontent" */
36
- './component-lazy/index').then(module => {
37
- CardWithURLRenderer.CardContent = module.LazyCardWithUrlContent;
38
- target.forceUpdate();
39
- });
40
- }
41
-
42
- componentDidMount() {
43
- if (CardWithURLRenderer.CardContent === null) {
44
- (this.props.importer || CardWithURLRenderer.moduleImporter)(this);
42
+ const dispatchAnalytics = useCallback(analyticsPayload => {
43
+ if (analyticsPayload && analyticsPayload.attributes) {
44
+ // Update if we haven't already set the display - possible
45
+ // in the case of `preview` which is rendered differently.
46
+ if (!analyticsPayload.attributes.display) {
47
+ analyticsPayload.attributes.display = appearance;
48
+ }
45
49
  }
46
- }
47
50
 
48
- componentWillUnmount() {
49
- const id = this.state.id;
50
- clearMarks(id);
51
- clearMeasures(id);
52
- }
53
-
54
- componentDidCatch(error, errorInfo) {
51
+ fireSmartLinkEvent(analyticsPayload, createAnalyticsEvent);
52
+ }, [appearance, createAnalyticsEvent]);
53
+ const logError = useCallback((error, info) => {
55
54
  const {
56
- appearance
57
- } = this.props; // NB: APIErrors are thrown in response to Object Resolver Service.
55
+ componentStack
56
+ } = info; // NB: APIErrors are thrown in response to Object Resolver Service.
58
57
  // In these cases, control is handed back to the Editor. We do not
59
58
  // fire an event for these, as they do not cover failed UI render events.
60
59
 
@@ -64,54 +63,46 @@ export class CardWithURLRenderer extends React.PureComponent {
64
63
  // to the reliability of the smart-card front-end components. We instrument
65
64
  // these in order to measure our front-end reliability.
66
65
  else {
67
- this.dispatchAnalytics(uiRenderFailedEvent(appearance, error, errorInfo));
66
+ const errorInfo = {
67
+ componentStack
68
+ };
69
+ failUfoExperience('smart-link-rendered', id);
70
+ failUfoExperience('smart-link-authenticated', id);
71
+ dispatchAnalytics(uiRenderFailedEvent(appearance, error, errorInfo));
68
72
  }
69
- } // Wrapper around analytics.
70
-
71
-
72
- render() {
73
- const {
74
- url,
75
- appearance,
76
- isSelected,
77
- isFrameVisible,
78
- onClick,
79
- container,
80
- onResolve,
81
- testId,
82
- showActions,
83
- inheritDimensions,
84
- platform,
85
- embedIframeRef,
86
- inlinePreloaderStyle
87
- } = this.props;
73
+ }, [appearance, dispatchAnalytics, id]);
88
74
 
89
- if (!url) {
90
- throw new Error('@atlaskit/smart-card: url property is missing.');
91
- }
75
+ if (!url) {
76
+ throw new Error('@atlaskit/smart-card: url property is missing.');
77
+ }
92
78
 
93
- return CardWithURLRenderer.CardContent !== null ? /*#__PURE__*/React.createElement(CardWithURLRenderer.CardContent, {
94
- id: this.state.id,
95
- url: url,
96
- appearance: appearance,
97
- onClick: onClick,
98
- isSelected: isSelected,
99
- isFrameVisible: isFrameVisible,
100
- dispatchAnalytics: this.dispatchAnalytics,
101
- container: container,
102
- onResolve: onResolve,
103
- testId: testId,
104
- showActions: showActions,
105
- inheritDimensions: inheritDimensions,
106
- platform: platform,
107
- embedIframeRef: embedIframeRef,
108
- inlinePreloaderStyle: inlinePreloaderStyle
109
- }) : /*#__PURE__*/React.createElement(CardLinkView, {
79
+ return /*#__PURE__*/React.createElement(ErrorBoundary, {
80
+ FallbackComponent: ErrorFallback,
81
+ onError: logError
82
+ }, /*#__PURE__*/React.createElement(Suspense, {
83
+ fallback: /*#__PURE__*/React.createElement(CardLinkView, {
110
84
  key: 'chunk-placeholder',
111
85
  link: url
112
- });
113
- }
114
-
86
+ })
87
+ }, /*#__PURE__*/React.createElement(LazyCardWithUrlContent, {
88
+ id: id,
89
+ url: url,
90
+ appearance: appearance,
91
+ onClick: onClick,
92
+ isSelected: isSelected,
93
+ isFrameVisible: isFrameVisible,
94
+ dispatchAnalytics: dispatchAnalytics,
95
+ container: container,
96
+ onResolve: onResolve,
97
+ testId: testId,
98
+ showActions: showActions,
99
+ inheritDimensions: inheritDimensions,
100
+ platform: platform,
101
+ embedIframeRef: embedIframeRef,
102
+ inlinePreloaderStyle: inlinePreloaderStyle
103
+ })));
115
104
  }
116
105
 
117
- _defineProperty(CardWithURLRenderer, "CardContent", null);
106
+ const ErrorFallback = () => {
107
+ return /*#__PURE__*/React.createElement("span", null);
108
+ };
@@ -6,7 +6,7 @@ import { extractEmbedProps } from '../../extractors/embed';
6
6
  import { getEmptyJsonLd, getUnauthorizedJsonLd } from '../../utils/jsonld';
7
7
  import { extractInlineProps } from '../../extractors/inline';
8
8
  import { extractBlockProps } from '../../extractors/block';
9
- import { getDefinitionId } from '../../state/helpers';
9
+ import { getExtensionKey } from '../../state/helpers';
10
10
  import { extractRequestAccessContext } from '../../extractors/common/context';
11
11
  export const EmbedCard = /*#__PURE__*/React.forwardRef(({
12
12
  url,
@@ -75,7 +75,7 @@ export const EmbedCard = /*#__PURE__*/React.forwardRef(({
75
75
  const resolvedBlockViewProps = extractBlockProps(data, meta, {
76
76
  handleAnalytics,
77
77
  handleInvoke,
78
- definitionId: getDefinitionId(details)
78
+ extensionKey: getExtensionKey(details)
79
79
  });
80
80
  return /*#__PURE__*/React.createElement(BlockCardResolvedView, _extends({}, resolvedBlockViewProps, {
81
81
  isSelected: isSelected,
@@ -1,5 +1,5 @@
1
1
  var devBaseUrl = 'https://api-private.dev.atlassian.com';
2
- var stgBaseUrl = 'https://api-private.stg.atlassian.com';
2
+ var stgBaseUrl = 'https://commerce-components-preview.dev.atlassian.com/gateway/api';
3
3
  var prodBaseUrl = 'https://api-private.atlassian.com';
4
4
  export var BaseUrls = {
5
5
  dev: devBaseUrl,
@@ -44,10 +44,10 @@ export var extractBlockActions = function extractBlockActions(props, jsonLd, opt
44
44
  if (opts) {
45
45
  var handleInvoke = opts.handleInvoke,
46
46
  handleAnalytics = opts.handleAnalytics,
47
- definitionId = opts.definitionId,
47
+ extensionKey = opts.extensionKey,
48
48
  testId = opts.testId;
49
49
  var actions = extractActions(jsonLd, handleInvoke);
50
- var previewAction = extractPreviewAction(definitionId, props, jsonLd, handleInvoke, handleAnalytics, testId, platform); // The previewAction should always be the last action
50
+ var previewAction = extractPreviewAction(extensionKey, props, jsonLd, handleInvoke, handleAnalytics, testId, platform); // The previewAction should always be the last action
51
51
 
52
52
  if (previewAction) {
53
53
  actions.push(previewAction);
@@ -53,7 +53,7 @@ var getInvokeOpts = function getInvokeOpts(key, action, source) {
53
53
  };
54
54
 
55
55
  export var extractPreviewAction = function extractPreviewAction() {
56
- var definitionId = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'empty-object-provider';
56
+ var extensionKey = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : 'empty-object-provider';
57
57
  var viewProps = arguments.length > 1 ? arguments[1] : undefined;
58
58
  var jsonLd = arguments.length > 2 ? arguments[2] : undefined;
59
59
  var handleInvoke = arguments.length > 3 ? arguments[3] : undefined;
@@ -69,7 +69,7 @@ export var extractPreviewAction = function extractPreviewAction() {
69
69
 
70
70
  if (metadataFromJsonLd.src) {
71
71
  // Build action using instrumentation hooks.
72
- var key = definitionId;
72
+ var key = extensionKey;
73
73
  var previewAction = PreviewAction(_objectSpread(_objectSpread({}, metadata), {}, {
74
74
  testId: testId,
75
75
  onOpen: function onOpen() {
@@ -1,5 +1,6 @@
1
1
  import React from 'react';
2
- import { FormattedRelative } from 'react-intl';
2
+ import { FormattedRelativeTime } from 'react-intl-next';
3
+ import { selectUnit } from '@formatjs/intl-utils';
3
4
  import { extractPersonUpdatedBy } from '../person/extractPersonUpdatedBy';
4
5
  import { extractPersonCreatedBy } from '../person/extractPersonCreatedBy';
5
6
  import { extractDateCreated } from '../date/extractDateCreated';
@@ -9,15 +10,25 @@ export var extractByline = function extractByline(jsonLd) {
9
10
  var createdAt = extractDateCreated(jsonLd);
10
11
 
11
12
  if (updatedAt) {
13
+ var _selectUnit = selectUnit(new Date(updatedAt).getTime()),
14
+ value = _selectUnit.value,
15
+ unit = _selectUnit.unit;
16
+
12
17
  var updatedBy = extractPersonUpdatedBy(jsonLd);
13
- return /*#__PURE__*/React.createElement("span", null, "Updated ", updatedBy && "by ".concat(updatedBy.name), ' ', /*#__PURE__*/React.createElement(FormattedRelative, {
14
- value: updatedAt
18
+ return /*#__PURE__*/React.createElement("span", null, "Updated ", updatedBy && "by ".concat(updatedBy.name), ' ', /*#__PURE__*/React.createElement(FormattedRelativeTime, {
19
+ value: value,
20
+ unit: unit
15
21
  }));
16
22
  } else if (createdAt) {
23
+ var _selectUnit2 = selectUnit(new Date(createdAt).getTime()),
24
+ _value = _selectUnit2.value,
25
+ _unit = _selectUnit2.unit;
26
+
17
27
  var createdBy = extractPersonCreatedBy(jsonLd);
18
28
  var createdByPerson = extractFirstPerson(createdBy);
19
- return /*#__PURE__*/React.createElement("span", null, "Created ", createdByPerson && "by ".concat(createdByPerson.name), ' ', /*#__PURE__*/React.createElement(FormattedRelative, {
20
- value: createdAt
29
+ return /*#__PURE__*/React.createElement("span", null, "Created ", createdByPerson && "by ".concat(createdByPerson.name), ' ', /*#__PURE__*/React.createElement(FormattedRelativeTime, {
30
+ value: _value,
31
+ unit: _unit
21
32
  }));
22
33
  }
23
34
  };
package/dist/esm/index.js CHANGED
@@ -9,5 +9,5 @@ export { embedHeaderHeight } from '@atlaskit/media-ui/embeds';
9
9
  export { SmartLinkEvents } from './utils/analytics/analytics';
10
10
  export { useSmartLinkEvents } from './view/SmartLinkEvents/useSmartLinkEvents'; // Classnames for integrators
11
11
 
12
- export { contentFooterClassName, metadataListClassName, blockCardResolvingViewClassName, blockCardResolvedViewClassName, blockCardForbiddenViewClassName, blockCardIconImageClassName } from '@atlaskit/media-ui/classNames';
12
+ export { contentFooterClassName, metadataListClassName, blockCardResolvingViewClassName, blockCardResolvedViewClassName, blockCardForbiddenViewClassName, blockCardIconImageClassName, blockCardResolvedViewByClassName, blockCardForbiddenViewLinkClassName, blockCardContentClassName, blockCardContentHeaderClassName, blockCardContentHeaderNameClassName, blockCardNotFoundViewClassName, blockCardErroredViewClassName } from '@atlaskit/media-ui/classNames';
13
13
  export { loadingPlaceholderClassName } from './view/CardWithUrl/component-lazy/LazyFallback';
@@ -6,7 +6,11 @@ var isJiraRoadMap = function isJiraRoadMap(url) {
6
6
  };
7
7
 
8
8
  var isPolarisView = function isPolarisView(url) {
9
- return url.match(/^https:\/\/.*?\/jira\/polaris\/projects\/[^\/]+?\/ideas\/view\/\d+$/);
9
+ return url.match(/^https:\/\/.*?\/jira\/polaris\/projects\/[^\/]+?\/ideas\/view\/\d+$|^https:\/\/.*?\/secure\/JiraProductDiscoveryAnonymous\.jspa\?hash=\w+|^https:\/\/.*?\/jira\/polaris\/share\/\w+/);
10
+ };
11
+
12
+ var isJwmView = function isJwmView(url) {
13
+ return url.match(/^https:\/\/.*?\/jira\/core\/projects\/[^\/]+?\/(timeline|calendar)\/?/);
10
14
  };
11
15
 
12
16
  var isSlackMessage = function isSlackMessage(url) {
@@ -52,7 +56,7 @@ export var Transformer = /*#__PURE__*/function () {
52
56
  }, {
53
57
  key: "toAdf",
54
58
  value: function toAdf(url, appearance) {
55
- if (isJiraRoadMap(url) || isPolarisView(url)) {
59
+ if (isJiraRoadMap(url) || isPolarisView(url) || isJwmView(url)) {
56
60
  return this.buildEmbedAdf(url);
57
61
  } else if (isSlackMessage(url)) {
58
62
  return this.buildBlockAdf(url);
@@ -9,6 +9,7 @@ import { useSmartLinkContext } from '../context';
9
9
  import * as measure from '../../utils/performance';
10
10
  import { APIError } from '../../client/errors';
11
11
  import { getUnauthorizedJsonLd } from '../../utils/jsonld';
12
+ import { addMetadataToExperience } from '../analytics';
12
13
  export var useSmartCardActions = function useSmartCardActions(id, url, analytics) {
13
14
  var _useSmartLinkContext = useSmartLinkContext(),
14
15
  store = _useSmartLinkContext.store,
@@ -98,7 +99,7 @@ export var useSmartCardActions = function useSmartCardActions(id, url, analytics
98
99
  isReloading = _args.length > 1 && _args[1] !== undefined ? _args[1] : false;
99
100
 
100
101
  if (!(isReloading || !hasData)) {
101
- _context.next = 4;
102
+ _context.next = 6;
102
103
  break;
103
104
  }
104
105
 
@@ -108,13 +109,18 @@ export var useSmartCardActions = function useSmartCardActions(id, url, analytics
108
109
  return handleResolvedLinkError(resourceUrl, error);
109
110
  }));
110
111
 
111
- case 4:
112
+ case 6:
113
+ addMetadataToExperience('smart-link-rendered', id, {
114
+ cached: true
115
+ });
116
+
117
+ case 7:
112
118
  case "end":
113
119
  return _context.stop();
114
120
  }
115
121
  }
116
122
  }, _callee);
117
- })), [url, hasData, connections.client, handleResolvedLinkResponse, handleResolvedLinkError]);
123
+ })), [url, hasData, connections.client, handleResolvedLinkResponse, handleResolvedLinkError, id]);
118
124
  var register = useCallback(function () {
119
125
  if (!details) {
120
126
  dispatch(cardAction(ACTION_PENDING, {
@@ -152,10 +158,10 @@ export var useSmartCardActions = function useSmartCardActions(id, url, analytics
152
158
  analytics.screen.authPopupEvent(definitionId, extensionKey);
153
159
  auth(services[0].url).then(function () {
154
160
  analytics.track.appAccountConnected(definitionId, extensionKey);
155
- analytics.operational.connectSucceededEvent(definitionId, extensionKey);
161
+ analytics.operational.connectSucceededEvent(id, definitionId, extensionKey);
156
162
  reload();
157
163
  }, function (err) {
158
- analytics.operational.connectFailedEvent(definitionId, extensionKey, err.type);
164
+ analytics.operational.connectFailedEvent(id, definitionId, extensionKey, err.type);
159
165
 
160
166
  if (err.type === 'auth_window_closed') {
161
167
  analytics.ui.closedAuthEvent(appearance, definitionId, extensionKey);
@@ -164,7 +170,7 @@ export var useSmartCardActions = function useSmartCardActions(id, url, analytics
164
170
  reload();
165
171
  });
166
172
  }
167
- }, [analytics.ui, analytics.screen, analytics.track, analytics.operational, reload, details, status]);
173
+ }, [analytics.ui, analytics.screen, analytics.track, analytics.operational, id, reload, details, status]);
168
174
  var invoke = useCallback( /*#__PURE__*/function () {
169
175
  var _ref3 = _asyncToGenerator( /*#__PURE__*/_regeneratorRuntime.mark(function _callee2(opts, appearance) {
170
176
  var key, action, source, markName, response;
@@ -179,7 +185,7 @@ export var useSmartCardActions = function useSmartCardActions(id, url, analytics
179
185
  measure.mark(markName, 'pending');
180
186
  _context2.prev = 4;
181
187
  // Begin analytics instrumentation.
182
- analytics.ui.actionClickedEvent(key, action.type, source); // Invoke action - either client-side or server-side.
188
+ analytics.ui.actionClickedEvent(id, key, action.type, source, opts.type); // Invoke action - either client-side or server-side.
183
189
 
184
190
  if (!(opts.type === 'client')) {
185
191
  _context2.next = 12;