@atlaskit/smart-card 19.1.13 → 19.1.16

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 (79) hide show
  1. package/CHANGELOG.md +67 -0
  2. package/dist/cjs/extractors/common/actions/extractPreviewAction.js +1 -1
  3. package/dist/cjs/index.js +6 -0
  4. package/dist/cjs/state/analytics/useSmartLinkAnalytics.js +257 -36
  5. package/dist/cjs/state/hooks/useSmartLink.js +1 -1
  6. package/dist/cjs/state/hooks-external/useSmartLinkActions.js +1 -1
  7. package/dist/cjs/state/hooks-external/useSmartLinkReload.js +1 -1
  8. package/dist/cjs/state/index.js +9 -1
  9. package/dist/cjs/utils/analytics/analytics.js +26 -14
  10. package/dist/cjs/utils/analytics/types.js +5 -0
  11. package/dist/cjs/version.json +1 -1
  12. package/dist/cjs/view/CardWithData/loader.js +2 -0
  13. package/dist/cjs/view/CardWithUrl/component.js +12 -8
  14. package/dist/cjs/view/CardWithUrl/loader.js +5 -3
  15. package/dist/cjs/view/FlexibleCard/components/elements/date-time/index.js +3 -2
  16. package/dist/cjs/view/HoverCard/index.js +5 -3
  17. package/dist/cjs/view/HoverCard/utils.js +3 -1
  18. package/dist/cjs/view/InlineCard/ResolvedView/index.js +2 -0
  19. package/dist/cjs/view/InlineCard/index.js +3 -1
  20. package/dist/es2019/extractors/common/actions/extractPreviewAction.js +1 -1
  21. package/dist/es2019/index.js +1 -1
  22. package/dist/es2019/state/analytics/useSmartLinkAnalytics.js +196 -30
  23. package/dist/es2019/state/hooks/useSmartLink.js +1 -1
  24. package/dist/es2019/state/hooks-external/useSmartLinkActions.js +1 -1
  25. package/dist/es2019/state/hooks-external/useSmartLinkReload.js +1 -1
  26. package/dist/es2019/state/index.js +2 -1
  27. package/dist/es2019/utils/analytics/analytics.js +26 -14
  28. package/dist/es2019/utils/analytics/types.js +1 -0
  29. package/dist/es2019/version.json +1 -1
  30. package/dist/es2019/view/CardWithData/loader.js +2 -0
  31. package/dist/es2019/view/CardWithUrl/component.js +12 -8
  32. package/dist/es2019/view/CardWithUrl/loader.js +5 -3
  33. package/dist/es2019/view/FlexibleCard/components/elements/date-time/index.js +3 -2
  34. package/dist/es2019/view/HoverCard/index.js +5 -3
  35. package/dist/es2019/view/HoverCard/utils.js +1 -1
  36. package/dist/es2019/view/InlineCard/ResolvedView/index.js +2 -0
  37. package/dist/es2019/view/InlineCard/index.js +2 -0
  38. package/dist/esm/extractors/common/actions/extractPreviewAction.js +1 -1
  39. package/dist/esm/index.js +1 -1
  40. package/dist/esm/state/analytics/useSmartLinkAnalytics.js +256 -37
  41. package/dist/esm/state/hooks/useSmartLink.js +1 -1
  42. package/dist/esm/state/hooks-external/useSmartLinkActions.js +1 -1
  43. package/dist/esm/state/hooks-external/useSmartLinkReload.js +1 -1
  44. package/dist/esm/state/index.js +2 -1
  45. package/dist/esm/utils/analytics/analytics.js +26 -14
  46. package/dist/esm/utils/analytics/types.js +1 -0
  47. package/dist/esm/version.json +1 -1
  48. package/dist/esm/view/CardWithData/loader.js +2 -0
  49. package/dist/esm/view/CardWithUrl/component.js +12 -8
  50. package/dist/esm/view/CardWithUrl/loader.js +5 -3
  51. package/dist/esm/view/FlexibleCard/components/elements/date-time/index.js +3 -2
  52. package/dist/esm/view/HoverCard/index.js +5 -3
  53. package/dist/esm/view/HoverCard/utils.js +3 -1
  54. package/dist/esm/view/InlineCard/ResolvedView/index.js +2 -0
  55. package/dist/esm/view/InlineCard/index.js +3 -1
  56. package/dist/types/index.d.ts +1 -1
  57. package/dist/types/state/analytics/useSmartLinkAnalytics.d.ts +146 -13
  58. package/dist/types/state/helpers.d.ts +2 -2
  59. package/dist/types/state/hooks/useSmartLink.d.ts +10 -12
  60. package/dist/types/state/index.d.ts +1 -0
  61. package/dist/types/utils/analytics/analytics.d.ts +8 -8
  62. package/dist/types/utils/analytics/types.d.ts +1 -0
  63. package/dist/types/utils/performance.d.ts +1 -1
  64. package/dist/types/utils/types.d.ts +1 -1
  65. package/dist/types/view/BlockCard/types.d.ts +1 -0
  66. package/dist/types/view/Card/index.d.ts +1 -1
  67. package/dist/types/view/Card/types.d.ts +3 -0
  68. package/dist/types/view/CardWithData/types.d.ts +1 -0
  69. package/dist/types/view/CardWithUrl/component.d.ts +1 -1
  70. package/dist/types/view/CardWithUrl/types.d.ts +2 -0
  71. package/dist/types/view/EmbedCard/types.d.ts +1 -0
  72. package/dist/types/view/FlexibleCard/components/elements/date-time/types.d.ts +4 -0
  73. package/dist/types/view/FlexibleCard/types.d.ts +4 -0
  74. package/dist/types/view/HoverCard/index.d.ts +1 -1
  75. package/dist/types/view/HoverCard/types.d.ts +1 -0
  76. package/dist/types/view/HoverCard/utils.d.ts +1 -1
  77. package/dist/types/view/InlineCard/ResolvedView/index.d.ts +2 -0
  78. package/dist/types/view/InlineCard/types.d.ts +1 -0
  79. package/package.json +1 -1
@@ -6,6 +6,11 @@ export const context = {
6
6
  packageName,
7
7
  packageVersion
8
8
  };
9
+ const uiActionSubjectIds = {
10
+ DownloadAction: 'downloadDocument',
11
+ PreviewAction: 'invokePreviewScreen',
12
+ ViewAction: 'shortcutGoToLink'
13
+ };
9
14
  export class SmartLinkEvents {
10
15
  insertSmartLink(url, type, createAnalyticsEvent) {
11
16
  fireSmartLinkEvent({
@@ -69,7 +74,7 @@ export const unresolvedEvent = (id, status, definitionId, extensionKey, resource
69
74
  } : undefined
70
75
  }
71
76
  });
72
- export const invokeSucceededEvent = (id, extensionKey, actionType, display) => {
77
+ export const invokeSucceededEvent = (id, actionType, display, extensionKey) => {
73
78
  const measure = getMeasure(id, 'resolved') || {
74
79
  duration: undefined
75
80
  };
@@ -81,12 +86,12 @@ export const invokeSucceededEvent = (id, extensionKey, actionType, display) => {
81
86
  id,
82
87
  actionType,
83
88
  display,
84
- extensionKey,
89
+ extensionKey: extensionKey || '',
85
90
  duration: measure.duration
86
91
  }
87
92
  };
88
93
  };
89
- export const invokeFailedEvent = (id, extensionKey, actionType, display, reason) => {
94
+ export const invokeFailedEvent = (id, actionType, display, reason, extensionKey) => {
90
95
  const measure = getMeasure(id, 'errored') || {
91
96
  duration: undefined
92
97
  };
@@ -98,7 +103,7 @@ export const invokeFailedEvent = (id, extensionKey, actionType, display, reason)
98
103
  id,
99
104
  actionType,
100
105
  display,
101
- extensionKey,
106
+ extensionKey: extensionKey || '',
102
107
  duration: measure.duration,
103
108
  reason
104
109
  }
@@ -169,24 +174,30 @@ export const uiAuthAlternateAccountEvent = (display, definitionId, extensionKey)
169
174
  display
170
175
  }
171
176
  });
172
- export const uiCardClickedEvent = (display, definitionId, extensionKey, isModifierKeyPressed) => ({
177
+ export const uiCardClickedEvent = (id, display, status, definitionId, extensionKey, isModifierKeyPressed, location, destinationProduct) => ({
173
178
  action: 'clicked',
174
179
  actionSubject: 'smartLink',
180
+ actionSubjectId: 'titleGoToLink',
175
181
  eventType: 'ui',
176
182
  attributes: { ...context,
183
+ id,
184
+ status,
177
185
  definitionId: definitionId || '',
178
186
  extensionKey: extensionKey || '',
179
187
  display,
180
- isModifierKeyPressed
188
+ isModifierKeyPressed,
189
+ location,
190
+ destinationProduct
181
191
  }
182
192
  });
183
- export const uiActionClickedEvent = (extensionKey, actionType, display) => ({
193
+ export const uiActionClickedEvent = (actionType, extensionKey, display) => ({
184
194
  action: 'clicked',
185
- actionSubject: 'smartLinkAction',
195
+ actionSubject: 'button',
196
+ actionSubjectId: uiActionSubjectIds[actionType],
186
197
  eventType: 'ui',
187
198
  attributes: { ...context,
188
199
  display,
189
- extensionKey,
200
+ extensionKey: extensionKey || '',
190
201
  actionType: actionType
191
202
  }
192
203
  });
@@ -208,11 +219,12 @@ export const screenAuthPopupEvent = (definitionId, extensionKey) => ({
208
219
  extensionKey: extensionKey || ''
209
220
  }
210
221
  });
211
- export const uiRenderSuccessEvent = (display, definitionId, extensionKey) => ({
222
+ export const uiRenderSuccessEvent = (display, status, definitionId, extensionKey) => ({
212
223
  action: 'renderSuccess',
213
224
  actionSubject: 'smartLink',
214
225
  eventType: 'ui',
215
226
  attributes: { ...context,
227
+ status,
216
228
  definitionId: definitionId || '',
217
229
  extensionKey: extensionKey || '',
218
230
  display
@@ -228,18 +240,18 @@ export const uiRenderFailedEvent = (display, error, errorInfo) => ({
228
240
  display
229
241
  }
230
242
  });
231
- export const uiHoverCardViewedEvent = (hoverDisplay, definitionId, extensionKey, previewInvokeMethod) => ({
243
+ export const uiHoverCardViewedEvent = (previewDisplay, definitionId, extensionKey, previewInvokeMethod) => ({
232
244
  action: 'viewed',
233
245
  actionSubject: 'hoverCard',
234
246
  eventType: 'ui',
235
247
  attributes: { ...context,
236
248
  definitionId: definitionId || '',
237
249
  extensionKey: extensionKey || '',
238
- hoverDisplay,
250
+ previewDisplay,
239
251
  previewInvokeMethod
240
252
  }
241
253
  });
242
- export const uiHoverCardDismissedEvent = (hoverDisplay, hoverTime, definitionId, extensionKey, previewInvokeMethod) => ({
254
+ export const uiHoverCardDismissedEvent = (previewDisplay, hoverTime, definitionId, extensionKey, previewInvokeMethod) => ({
243
255
  action: 'dismissed',
244
256
  actionSubject: 'hoverCard',
245
257
  eventType: 'ui',
@@ -247,7 +259,7 @@ export const uiHoverCardDismissedEvent = (hoverDisplay, hoverTime, definitionId,
247
259
  definitionId: definitionId || '',
248
260
  extensionKey: extensionKey || '',
249
261
  hoverTime,
250
- hoverDisplay,
262
+ previewDisplay,
251
263
  previewInvokeMethod
252
264
  }
253
265
  });
@@ -0,0 +1 @@
1
+ export {};
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/smart-card",
3
- "version": "19.1.13",
3
+ "version": "19.1.16",
4
4
  "sideEffects": false
5
5
  }
@@ -18,6 +18,7 @@ export class CardWithDataRenderer extends React.PureComponent {
18
18
 
19
19
  render() {
20
20
  const {
21
+ id,
21
22
  appearance,
22
23
  data,
23
24
  isSelected,
@@ -34,6 +35,7 @@ export class CardWithDataRenderer extends React.PureComponent {
34
35
 
35
36
  if (CardWithDataRenderer.CardContent) {
36
37
  return /*#__PURE__*/React.createElement(CardWithDataRenderer.CardContent, {
38
+ id: id,
37
39
  inlinePreloaderStyle: inlinePreloaderStyle,
38
40
  appearance: appearance,
39
41
  data: data,
@@ -26,17 +26,19 @@ export function CardWithUrlContent({
26
26
  inlinePreloaderStyle,
27
27
  ui,
28
28
  children,
29
- showHoverPreview
29
+ showHoverPreview,
30
+ analyticsEvents
30
31
  }) {
31
32
  // Get state, actions for this card.
32
33
  const {
33
34
  state,
34
35
  actions,
36
+ analytics: defaultAnalytics,
35
37
  config,
36
- analytics,
37
38
  renderers,
38
39
  error
39
40
  } = useSmartLink(id, url, dispatchAnalytics);
41
+ const analytics = analyticsEvents || defaultAnalytics;
40
42
  const definitionId = getDefinitionId(state.details);
41
43
  const extensionKey = getExtensionKey(state.details);
42
44
  const resourceType = getResourceType(state.details);
@@ -48,17 +50,15 @@ export function CardWithUrlContent({
48
50
  isSpecialEvent(event) ? window.open(clickUrl, '_blank') : window.open(clickUrl, '_self');
49
51
  }, [state.details, url]);
50
52
  const handleClickWrapper = useCallback(event => {
51
- if (state.status === 'resolved') {
52
- const isModifierKeyPressed = isSpecialEvent(event);
53
- analytics.ui.cardClickedEvent(isFlexibleUi ? 'flexible' : appearance, definitionId, extensionKey, isModifierKeyPressed);
54
- }
53
+ const isModifierKeyPressed = isSpecialEvent(event);
54
+ analytics.ui.cardClickedEvent(id, isFlexibleUi ? 'flexible' : appearance, state.status, definitionId, extensionKey, isModifierKeyPressed);
55
55
 
56
56
  if (onClick) {
57
57
  onClick(event);
58
58
  } else if (!isFlexibleUi) {
59
59
  handleClick(event);
60
60
  }
61
- }, [state.status, analytics.ui, appearance, definitionId, extensionKey, onClick, handleClick, isFlexibleUi]);
61
+ }, [id, state.status, analytics.ui, appearance, definitionId, extensionKey, onClick, handleClick, isFlexibleUi]);
62
62
  const handleAuthorize = useCallback(() => actions.authorize(appearance), [actions, appearance]);
63
63
  const handleRetry = useCallback(() => {
64
64
  actions.reload();
@@ -80,7 +80,7 @@ export function CardWithUrlContent({
80
80
 
81
81
  useEffect(() => {
82
82
  if (isFinalState(state.status)) {
83
- analytics.ui.renderSuccessEvent(appearance, id, definitionId, extensionKey);
83
+ analytics.ui.renderSuccessEvent(appearance, state.status, id, definitionId, extensionKey);
84
84
  }
85
85
  }, [appearance, state.details, state.status, url, definitionId, extensionKey, analytics.ui, id]);
86
86
 
@@ -98,6 +98,7 @@ export function CardWithUrlContent({
98
98
  }
99
99
 
100
100
  return /*#__PURE__*/React.createElement(FlexibleCard, {
101
+ id: id,
101
102
  cardState: cardState,
102
103
  onAuthorize: services.length && handleAuthorize || undefined,
103
104
  onClick: handleClickWrapper,
@@ -117,6 +118,7 @@ export function CardWithUrlContent({
117
118
  switch (appearance) {
118
119
  case 'inline':
119
120
  return /*#__PURE__*/React.createElement(InlineCard, {
121
+ id: id,
120
122
  url: url,
121
123
  renderers: renderers,
122
124
  cardState: state,
@@ -131,6 +133,7 @@ export function CardWithUrlContent({
131
133
 
132
134
  case 'block':
133
135
  return /*#__PURE__*/React.createElement(BlockCard, {
136
+ id: id,
134
137
  url: url,
135
138
  renderers: renderers,
136
139
  authFlow: config && config.authFlow,
@@ -149,6 +152,7 @@ export function CardWithUrlContent({
149
152
 
150
153
  case 'embed':
151
154
  return /*#__PURE__*/React.createElement(EmbedCard, {
155
+ id: id,
152
156
  url: url,
153
157
  cardState: state,
154
158
  handleAuthorize: services.length && handleAuthorize || undefined,
@@ -9,7 +9,7 @@ const LazyCardWithUrlContent = /*#__PURE__*/lazy(() => import(
9
9
  /* webpackChunkName: "@atlaskit-internal_smartcard-urlcardcontent" */
10
10
  './component-lazy/index'));
11
11
  export function CardWithURLRenderer(props) {
12
- const [id] = useState(() => uuid());
12
+ const [id] = useState(() => props.id ? props.id : uuid());
13
13
  useEffect(() => {
14
14
  // ComponentWillUnmount
15
15
  return () => {
@@ -34,7 +34,8 @@ export function CardWithURLRenderer(props) {
34
34
  createAnalyticsEvent,
35
35
  children,
36
36
  ui,
37
- showHoverPreview
37
+ showHoverPreview,
38
+ analyticsEvents
38
39
  } = props; // Wrapper around analytics.
39
40
 
40
41
  const dispatchAnalytics = useCallback(analyticsPayload => {
@@ -94,7 +95,8 @@ export function CardWithURLRenderer(props) {
94
95
  embedIframeRef,
95
96
  inlinePreloaderStyle,
96
97
  ui,
97
- showHoverPreview
98
+ showHoverPreview,
99
+ analyticsEvents
98
100
  };
99
101
  return /*#__PURE__*/React.createElement(ErrorBoundary, {
100
102
  FallbackComponent: ErrorFallback,
@@ -36,7 +36,8 @@ const DateTime = ({
36
36
  date,
37
37
  overrideCss,
38
38
  type,
39
- testId = 'smart-element-date-time'
39
+ testId = 'smart-element-date-time',
40
+ text
40
41
  }) => {
41
42
  const {
42
43
  formatRelativeTime,
@@ -74,7 +75,7 @@ const DateTime = ({
74
75
  "data-separator": true,
75
76
  "data-smart-element-date-time": true,
76
77
  "data-testid": testId
77
- }, jsx(FormattedMessage, _extends({}, typeToDescriptorMap[type][typeVariant], {
78
+ }, text ? `${text} ${context}` : jsx(FormattedMessage, _extends({}, typeToDescriptorMap[type][typeVariant], {
78
79
  values: {
79
80
  context
80
81
  }
@@ -20,6 +20,7 @@ import { getSimulatedMetadata } from './utils';
20
20
  import extractPreview from '../../extractors/flexible/extract-preview';
21
21
  export const HoverCardComponent = ({
22
22
  children,
23
+ id,
23
24
  url,
24
25
  createAnalyticsEvent
25
26
  }) => {
@@ -32,7 +33,7 @@ export const HoverCardComponent = ({
32
33
  const fadeInTimeoutId = useRef();
33
34
  const cardOpenTime = useRef();
34
35
  const linkState = useLinkState(url);
35
- const analytics = useSmartLinkAnalytics(analyticsHandler);
36
+ const analytics = useSmartLinkAnalytics(url, analyticsHandler, id);
36
37
  const extensionKey = useMemo(() => getExtensionKey(linkState.details), [linkState]);
37
38
  const definitionId = useMemo(() => getDefinitionId(linkState.details), [linkState]);
38
39
  const initHideCard = useCallback(() => {
@@ -44,7 +45,7 @@ export const HoverCardComponent = ({
44
45
  //Check its previously open to avoid firing events when moving between the child and hover card components
45
46
  if (isOpen === true && cardOpenTime.current) {
46
47
  const hoverTime = Date.now() - cardOpenTime.current;
47
- analytics.ui.hoverCardDismissedEvent('card', hoverTime, definitionId, extensionKey);
48
+ analytics.ui.hoverCardDismissedEvent('card', hoverTime, definitionId, extensionKey, 'mouse_hover');
48
49
  }
49
50
 
50
51
  setIsOpen(false);
@@ -59,7 +60,7 @@ export const HoverCardComponent = ({
59
60
  //Check if its previously closed to avoid firing events when moving between the child and hover card components
60
61
  if (isOpen === false) {
61
62
  cardOpenTime.current = Date.now();
62
- analytics.ui.hoverCardViewedEvent('card', definitionId, extensionKey);
63
+ analytics.ui.hoverCardViewedEvent('card', definitionId, extensionKey, 'mouse_hover');
63
64
  }
64
65
 
65
66
  setIsOpen(true);
@@ -106,6 +107,7 @@ export const HoverCardComponent = ({
106
107
  onMouseLeave: initHideCard,
107
108
  css: HoverCardContainer
108
109
  }, jsx(Card, {
110
+ id: id,
109
111
  appearance: "block",
110
112
  url: url,
111
113
  ui: {
@@ -1,4 +1,4 @@
1
- export const getSimulatedMetadata = extensionKey => {
1
+ export const getSimulatedMetadata = (extensionKey = '') => {
2
2
  switch (extensionKey) {
3
3
  case 'confluence-object-provider':
4
4
  return {
@@ -22,6 +22,7 @@ export class InlineCardResolvedView extends React.Component {
22
22
 
23
23
  render() {
24
24
  const {
25
+ id,
25
26
  title = '',
26
27
  isSelected,
27
28
  onClick,
@@ -46,6 +47,7 @@ export class InlineCardResolvedView extends React.Component {
46
47
 
47
48
  if (showHoverPreview && link) {
48
49
  return /*#__PURE__*/React.createElement(HoverCard, {
50
+ id: id,
49
51
  url: link
50
52
  }, inlineCardResolvedView);
51
53
  }
@@ -11,6 +11,7 @@ import { InlineCardResolvingView } from './ResolvingView';
11
11
  import { InlineCardUnauthorizedView } from './UnauthorisedView';
12
12
  export { InlineCardResolvedView, InlineCardResolvingView, InlineCardErroredView, InlineCardForbiddenView, InlineCardUnauthorizedView };
13
13
  export const InlineCard = ({
14
+ id,
14
15
  url,
15
16
  cardState,
16
17
  handleAuthorize,
@@ -53,6 +54,7 @@ export const InlineCard = ({
53
54
  }
54
55
 
55
56
  return /*#__PURE__*/React.createElement(InlineCardResolvedView, _extends({}, resolvedProps, {
57
+ id: id,
56
58
  showHoverPreview: showHoverPreview,
57
59
  link: url,
58
60
  isSelected: isSelected,
@@ -73,7 +73,7 @@ export var extractPreviewAction = function extractPreviewAction() {
73
73
  var previewAction = PreviewAction(_objectSpread(_objectSpread({}, metadata), {}, {
74
74
  testId: testId,
75
75
  onOpen: function onOpen() {
76
- handleAnalytics(uiRenderSuccessEvent('preview', key));
76
+ handleAnalytics(uiRenderSuccessEvent('preview', 'resolved', key));
77
77
  },
78
78
  onOpenFailed: function onOpenFailed(error, errorInfo) {
79
79
  handleAnalytics(uiRenderFailedEvent('preview', error, errorInfo));
package/dist/esm/index.js CHANGED
@@ -1,4 +1,4 @@
1
- export { SmartCardProvider as Provider, SmartCardContext } from './state';
1
+ export { SmartCardProvider as Provider, SmartCardContext, useSmartLinkAnalytics } from './state';
2
2
  export { EditorCardProvider, editorCardProvider } from '@atlaskit/link-provider';
3
3
  export { APIError } from '@atlaskit/linking-common';
4
4
  export { CardClient as Client } from '@atlaskit/link-provider';