@atlaskit/smart-card 26.2.1 → 26.3.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 (93) hide show
  1. package/CHANGELOG.md +14 -0
  2. package/dist/cjs/extractors/block/index.js +5 -4
  3. package/dist/cjs/extractors/common/actions/extractPreviewAction.js +4 -2
  4. package/dist/cjs/messages.js +6 -0
  5. package/dist/cjs/state/actions/index.js +27 -11
  6. package/dist/cjs/state/hooks/use-invoke/index.js +8 -28
  7. package/dist/cjs/state/hooks/use-resolve/index.js +28 -12
  8. package/dist/cjs/utils/analytics/SmartLinkAnalyticsContext.js +47 -0
  9. package/dist/cjs/utils/analytics/analytics.js +13 -1
  10. package/dist/cjs/version.json +1 -1
  11. package/dist/cjs/view/BlockCard/actions/PreviewAction.js +4 -2
  12. package/dist/cjs/view/BlockCard/index.js +3 -1
  13. package/dist/cjs/view/CardWithUrl/component.js +13 -3
  14. package/dist/cjs/view/FlexibleCard/components/actions/action/preview-action/index.js +7 -1
  15. package/dist/cjs/view/FlexibleCard/components/actions/utils.js +1 -1
  16. package/dist/cjs/view/FlexibleCard/components/common/lozenge-action/index.js +38 -30
  17. package/dist/cjs/view/FlexibleCard/components/common/lozenge-action/lozenge-action-analytics.js +31 -0
  18. package/dist/cjs/view/FlexibleCard/components/common/lozenge-action/lozenge-action-error/styled.js +1 -1
  19. package/dist/cjs/view/HoverCard/components/HoverCardComponent.js +21 -2
  20. package/dist/cjs/view/HoverCard/components/views/resolved/index.js +26 -3
  21. package/dist/es2019/extractors/block/index.js +5 -4
  22. package/dist/es2019/extractors/common/actions/extractPreviewAction.js +4 -2
  23. package/dist/es2019/messages.js +6 -0
  24. package/dist/es2019/state/actions/index.js +32 -12
  25. package/dist/es2019/state/hooks/use-invoke/index.js +4 -23
  26. package/dist/es2019/state/hooks/use-resolve/index.js +28 -12
  27. package/dist/es2019/utils/analytics/SmartLinkAnalyticsContext.js +35 -0
  28. package/dist/es2019/utils/analytics/analytics.js +10 -0
  29. package/dist/es2019/version.json +1 -1
  30. package/dist/es2019/view/BlockCard/actions/PreviewAction.js +17 -13
  31. package/dist/es2019/view/BlockCard/index.js +3 -1
  32. package/dist/es2019/view/CardWithUrl/component.js +9 -2
  33. package/dist/es2019/view/FlexibleCard/components/actions/action/preview-action/index.js +7 -1
  34. package/dist/es2019/view/FlexibleCard/components/actions/utils.js +1 -1
  35. package/dist/es2019/view/FlexibleCard/components/common/lozenge-action/index.js +14 -6
  36. package/dist/es2019/view/FlexibleCard/components/common/lozenge-action/lozenge-action-analytics.js +21 -0
  37. package/dist/es2019/view/FlexibleCard/components/common/lozenge-action/lozenge-action-error/styled.js +1 -0
  38. package/dist/es2019/view/HoverCard/components/HoverCardComponent.js +21 -2
  39. package/dist/es2019/view/HoverCard/components/views/resolved/index.js +36 -11
  40. package/dist/esm/extractors/block/index.js +5 -4
  41. package/dist/esm/extractors/common/actions/extractPreviewAction.js +4 -2
  42. package/dist/esm/messages.js +6 -0
  43. package/dist/esm/state/actions/index.js +27 -11
  44. package/dist/esm/state/hooks/use-invoke/index.js +8 -28
  45. package/dist/esm/state/hooks/use-resolve/index.js +28 -12
  46. package/dist/esm/utils/analytics/SmartLinkAnalyticsContext.js +36 -0
  47. package/dist/esm/utils/analytics/analytics.js +10 -0
  48. package/dist/esm/version.json +1 -1
  49. package/dist/esm/view/BlockCard/actions/PreviewAction.js +4 -2
  50. package/dist/esm/view/BlockCard/index.js +3 -1
  51. package/dist/esm/view/CardWithUrl/component.js +11 -2
  52. package/dist/esm/view/FlexibleCard/components/actions/action/preview-action/index.js +7 -1
  53. package/dist/esm/view/FlexibleCard/components/actions/utils.js +1 -1
  54. package/dist/esm/view/FlexibleCard/components/common/lozenge-action/index.js +38 -30
  55. package/dist/esm/view/FlexibleCard/components/common/lozenge-action/lozenge-action-analytics.js +21 -0
  56. package/dist/esm/view/FlexibleCard/components/common/lozenge-action/lozenge-action-error/styled.js +1 -1
  57. package/dist/esm/view/HoverCard/components/HoverCardComponent.js +21 -2
  58. package/dist/esm/view/HoverCard/components/views/resolved/index.js +26 -3
  59. package/dist/types/extractors/block/index.d.ts +2 -2
  60. package/dist/types/extractors/block/types.d.ts +1 -0
  61. package/dist/types/extractors/common/actions/extractPreviewAction.d.ts +1 -1
  62. package/dist/types/messages.d.ts +1 -1
  63. package/dist/types/state/analytics/useSmartLinkAnalytics.d.ts +6 -3
  64. package/dist/types/state/flexible-ui-context/index.d.ts +10 -6
  65. package/dist/types/state/hooks/use-invoke/index.d.ts +1 -7
  66. package/dist/types/state/hooks/useSmartLink.d.ts +5 -3
  67. package/dist/types/utils/analytics/SmartLinkAnalyticsContext.d.ts +9 -0
  68. package/dist/types/utils/analytics/analytics.d.ts +11 -3
  69. package/dist/types/utils/mocks.d.ts +5 -3
  70. package/dist/types/view/BlockCard/actions/PreviewAction.d.ts +2 -1
  71. package/dist/types/view/BlockCard/views/ResolvedView.d.ts +2 -0
  72. package/dist/types/view/CardWithUrl/component.d.ts +1 -1
  73. package/dist/types/view/FlexibleCard/components/common/lozenge-action/lozenge-action-analytics.d.ts +21 -0
  74. package/dist/types/view/HoverCard/components/views/resolved/index.d.ts +1 -1
  75. package/dist/types-ts4.5/extractors/block/index.d.ts +2 -2
  76. package/dist/types-ts4.5/extractors/block/types.d.ts +1 -0
  77. package/dist/types-ts4.5/extractors/common/actions/extractPreviewAction.d.ts +1 -1
  78. package/dist/types-ts4.5/messages.d.ts +1 -1
  79. package/dist/types-ts4.5/state/analytics/useSmartLinkAnalytics.d.ts +6 -3
  80. package/dist/types-ts4.5/state/flexible-ui-context/index.d.ts +10 -6
  81. package/dist/types-ts4.5/state/hooks/use-invoke/index.d.ts +1 -7
  82. package/dist/types-ts4.5/state/hooks/useSmartLink.d.ts +5 -3
  83. package/dist/types-ts4.5/utils/analytics/SmartLinkAnalyticsContext.d.ts +9 -0
  84. package/dist/types-ts4.5/utils/analytics/analytics.d.ts +11 -3
  85. package/dist/types-ts4.5/utils/mocks.d.ts +5 -3
  86. package/dist/types-ts4.5/view/BlockCard/actions/PreviewAction.d.ts +2 -1
  87. package/dist/types-ts4.5/view/BlockCard/views/ResolvedView.d.ts +2 -0
  88. package/dist/types-ts4.5/view/CardWithUrl/component.d.ts +1 -1
  89. package/dist/types-ts4.5/view/FlexibleCard/components/common/lozenge-action/lozenge-action-analytics.d.ts +21 -0
  90. package/dist/types-ts4.5/view/HoverCard/components/views/resolved/index.d.ts +1 -1
  91. package/package.json +11 -3
  92. package/report.api.md +21 -3
  93. package/tmp/api-report-tmp.d.ts +21 -3
@@ -24,6 +24,8 @@ var _createStatusUpdateRequest = _interopRequireDefault(require("../../../../../
24
24
  var _useResolve = _interopRequireDefault(require("../../../../../state/hooks/use-resolve"));
25
25
  var _types = require("./lozenge-action-error/types");
26
26
  var _flexibleUiContext = require("../../../../../state/flexible-ui-context");
27
+ var _analytics = require("../../../../../utils/analytics/analytics");
28
+ var _lozengeActionAnalytics = require("./lozenge-action-analytics");
27
29
  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); }
28
30
  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; }
29
31
  /** @jsx jsx */
@@ -76,11 +78,7 @@ var LozengeAction = function LozengeAction(_ref) {
76
78
  var reload = (0, _useResolve.default)();
77
79
  //TODO EDM-6583 Replace usage of useFlexibleUiAnalyticsContext with linking platform analytics context from find team.
78
80
  var analytics = (0, _flexibleUiContext.useFlexibleUiAnalyticsContext)();
79
- var invoke = (0, _useInvoke.default)({
80
- started: analytics === null || analytics === void 0 ? void 0 : analytics.track.smartLinkQuickActionStarted,
81
- success: analytics === null || analytics === void 0 ? void 0 : analytics.track.smartLinkQuickActionSuccess,
82
- failed: analytics === null || analytics === void 0 ? void 0 : analytics.track.smartLinkQuickActionFailed
83
- });
81
+ var invoke = (0, _useInvoke.default)();
84
82
  (0, _react2.useEffect)(function () {
85
83
  setSelected({
86
84
  text: text,
@@ -99,47 +97,52 @@ var LozengeAction = function LozengeAction(_ref) {
99
97
  case 0:
100
98
  setIsOpen(args.isOpen);
101
99
  if (!args.isOpen) {
102
- _context.next = 22;
100
+ _context.next = 24;
103
101
  break;
104
102
  }
105
103
  analytics === null || analytics === void 0 ? void 0 : analytics.ui.smartLinkLozengeActionClickedEvent();
104
+ analytics === null || analytics === void 0 ? void 0 : analytics.track.smartLinkQuickActionStarted({
105
+ smartLinkActionType: _analytics.TrackQuickActionType.StatusUpdate
106
+ });
106
107
  if (!(!isLoaded && action !== null && action !== void 0 && action.read)) {
107
- _context.next = 22;
108
+ _context.next = 24;
108
109
  break;
109
110
  }
110
- _context.prev = 4;
111
+ _context.prev = 5;
111
112
  setIsLoading(true);
112
- _context.next = 8;
113
+ _context.next = 9;
113
114
  return invoke(action.read, _extractLozengeActionItems.default);
114
- case 8:
115
+ case 9:
115
116
  responseItems = _context.sent;
116
117
  validItems = typeof text === 'string' ? validateItems(responseItems, text) : responseItems;
117
118
  setItems(validItems);
118
119
  setIsLoaded(true);
119
120
  if ((validItems === null || validItems === void 0 ? void 0 : validItems.length) === 0) {
121
+ analytics === null || analytics === void 0 ? void 0 : analytics.track.smartLinkQuickActionFailed(_lozengeActionAnalytics.permissionLoadErrorAnalyticsPayload);
120
122
  setErrorMessage(_types.LozengeActionErrorMessages.noData);
121
123
  setIsLoaded(false);
122
124
  }
123
- _context.next = 19;
125
+ _context.next = 21;
124
126
  break;
125
- case 15:
126
- _context.prev = 15;
127
- _context.t0 = _context["catch"](4);
127
+ case 16:
128
+ _context.prev = 16;
129
+ _context.t0 = _context["catch"](5);
128
130
  setErrorMessage(_types.LozengeActionErrorMessages.unknown);
129
131
  setIsLoaded(false);
130
- case 19:
131
- _context.prev = 19;
132
+ analytics === null || analytics === void 0 ? void 0 : analytics.track.smartLinkQuickActionFailed(_lozengeActionAnalytics.unknownLoadErrorAnalyticsPayload);
133
+ case 21:
134
+ _context.prev = 21;
132
135
  setIsLoading(false);
133
- return _context.finish(19);
134
- case 22:
136
+ return _context.finish(21);
137
+ case 24:
135
138
  if (!args.isOpen) {
136
139
  setErrorMessage(undefined);
137
140
  }
138
- case 23:
141
+ case 25:
139
142
  case "end":
140
143
  return _context.stop();
141
144
  }
142
- }, _callee, null, [[4, 15, 19, 22]]);
145
+ }, _callee, null, [[5, 16, 21, 24]]);
143
146
  }));
144
147
  return function (_x) {
145
148
  return _ref3.apply(this, arguments);
@@ -162,7 +165,7 @@ var LozengeAction = function LozengeAction(_ref) {
162
165
  analytics === null || analytics === void 0 ? void 0 : analytics.ui.smartLinkLozengeActionListItemClickedEvent();
163
166
  updateAction = action === null || action === void 0 ? void 0 : action.update;
164
167
  if (!(updateAction && id)) {
165
- _context2.next = 16;
168
+ _context2.next = 17;
166
169
  break;
167
170
  }
168
171
  setIsLoading(true);
@@ -178,34 +181,39 @@ var LozengeAction = function LozengeAction(_ref) {
178
181
  setIsLoaded(false);
179
182
  setIsOpen(false);
180
183
  setItems([]);
184
+ analytics === null || analytics === void 0 ? void 0 : analytics.track.smartLinkQuickActionSuccess({
185
+ smartLinkActionType: _analytics.TrackQuickActionType.StatusUpdate
186
+ });
181
187
  if (!url) {
182
- _context2.next = 16;
188
+ _context2.next = 17;
183
189
  break;
184
190
  }
185
- _context2.next = 16;
191
+ _context2.next = 17;
186
192
  return reload(url, true, undefined, linkId);
187
- case 16:
188
- _context2.next = 22;
193
+ case 17:
194
+ _context2.next = 23;
189
195
  break;
190
- case 18:
191
- _context2.prev = 18;
196
+ case 19:
197
+ _context2.prev = 19;
192
198
  _context2.t0 = _context2["catch"](0);
193
199
  setIsLoading(false);
194
200
  if (isInvokeCustomError(_context2.t0)) {
195
201
  setErrorMessage(_context2.t0.message);
202
+ analytics === null || analytics === void 0 ? void 0 : analytics.track.smartLinkQuickActionFailed(_lozengeActionAnalytics.validationUpdateErrorAnalyticsPayload);
196
203
  } else {
197
204
  setErrorMessage(_types.LozengeActionErrorMessages.updateFailed);
205
+ analytics === null || analytics === void 0 ? void 0 : analytics.track.smartLinkQuickActionFailed(_lozengeActionAnalytics.unknownUpdateErrorAnalyticsPayload);
198
206
  }
199
- case 22:
207
+ case 23:
200
208
  case "end":
201
209
  return _context2.stop();
202
210
  }
203
- }, _callee2, null, [[0, 18]]);
211
+ }, _callee2, null, [[0, 19]]);
204
212
  }));
205
213
  return function (_x2, _x3, _x4) {
206
214
  return _ref4.apply(this, arguments);
207
215
  };
208
- }(), [action === null || action === void 0 ? void 0 : action.update, analytics === null || analytics === void 0 ? void 0 : analytics.ui, invoke, linkId, reload, url]);
216
+ }(), [action === null || action === void 0 ? void 0 : action.update, analytics, invoke, linkId, reload, url]);
209
217
  var dropdownItemGroup = (0, _react2.useMemo)(function () {
210
218
  if (errorMessage) {
211
219
  return (0, _react.jsx)(_lozengeActionError.default, {
@@ -0,0 +1,31 @@
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.validationUpdateErrorAnalyticsPayload = exports.unknownUpdateErrorAnalyticsPayload = exports.unknownLoadErrorAnalyticsPayload = exports.permissionLoadErrorAnalyticsPayload = void 0;
7
+ var _analytics = require("../../../../../utils/analytics/analytics");
8
+ var unknownLoadErrorAnalyticsPayload = {
9
+ smartLinkActionType: _analytics.TrackQuickActionType.StatusUpdate,
10
+ reason: _analytics.TrackQuickActionFailureReason.UnknownError,
11
+ step: 'load'
12
+ };
13
+ exports.unknownLoadErrorAnalyticsPayload = unknownLoadErrorAnalyticsPayload;
14
+ var permissionLoadErrorAnalyticsPayload = {
15
+ smartLinkActionType: _analytics.TrackQuickActionType.StatusUpdate,
16
+ reason: _analytics.TrackQuickActionFailureReason.PermissionError,
17
+ step: 'load'
18
+ };
19
+ exports.permissionLoadErrorAnalyticsPayload = permissionLoadErrorAnalyticsPayload;
20
+ var unknownUpdateErrorAnalyticsPayload = {
21
+ smartLinkActionType: _analytics.TrackQuickActionType.StatusUpdate,
22
+ reason: _analytics.TrackQuickActionFailureReason.UnknownError,
23
+ step: 'update'
24
+ };
25
+ exports.unknownUpdateErrorAnalyticsPayload = unknownUpdateErrorAnalyticsPayload;
26
+ var validationUpdateErrorAnalyticsPayload = {
27
+ smartLinkActionType: _analytics.TrackQuickActionType.StatusUpdate,
28
+ reason: _analytics.TrackQuickActionFailureReason.ValidationError,
29
+ step: 'update'
30
+ };
31
+ exports.validationUpdateErrorAnalyticsPayload = validationUpdateErrorAnalyticsPayload;
@@ -15,7 +15,7 @@ exports.dropdownItemGroupStyles = dropdownItemGroupStyles;
15
15
  var sharedBlockStyles = (0, _react.css)(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2.default)(["\n display: flex;\n gap: 0.5rem;\n line-height: 1rem;\n min-width: 0;\n overflow: hidden;\n flex-direction: row;\n align-items: center;\n"])));
16
16
  var contentStyles = (0, _react.css)(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2.default)(["\n ", ";\n\n margin-top: ", ";\n align-items: flex-start;\n\n > span,\n > div {\n font-size: 0.875rem;\n line-height: 1.25rem;\n color: ", ";\n }\n"])), sharedBlockStyles, "var(--ds-space-025, 2px)", "var(--ds-text, ".concat(_colors.N800, ")"));
17
17
  exports.contentStyles = contentStyles;
18
- var linkStyles = (0, _react.css)(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2.default)(["\n ", ";\n\n font-size: 0.875rem;\n margin-top: 10px;\n margin-left: ", ";\n margin-bottom: ", ";\n"])), sharedBlockStyles, "var(--ds-space-400, 32px)", "var(--ds-space-025, 2px)");
18
+ var linkStyles = (0, _react.css)(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2.default)(["\n ", ";\n\n cursor: pointer;\n font-size: 0.875rem;\n margin-top: 10px;\n margin-left: ", ";\n margin-bottom: ", ";\n"])), sharedBlockStyles, "var(--ds-space-400, 32px)", "var(--ds-space-025, 2px)");
19
19
  exports.linkStyles = linkStyles;
20
20
  var textStyles = function textStyles(maxLines) {
21
21
  return (0, _react.css)(_templateObject5 || (_templateObject5 = (0, _taggedTemplateLiteral2.default)(["\n line-height: 1rem;\n white-space: normal;\n ", ";\n"])), (0, _utils.getTruncateStyles)(maxLines));
@@ -8,6 +8,7 @@ Object.defineProperty(exports, "__esModule", {
8
8
  exports.HoverCardComponent = void 0;
9
9
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
10
10
  var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
11
+ var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
11
12
  var _popup = _interopRequireDefault(require("@atlaskit/popup"));
12
13
  var _react = require("@emotion/react");
13
14
  var _react2 = _interopRequireWildcard(require("react"));
@@ -17,6 +18,7 @@ var _store = require("../../../state/store");
17
18
  var _HoverCardContent = _interopRequireDefault(require("../components/HoverCardContent"));
18
19
  var _styled = require("../styled");
19
20
  var _constants = require("../../../constants");
21
+ var _SmartLinkAnalyticsContext = require("../../../utils/analytics/SmartLinkAnalyticsContext");
20
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); }
21
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; }
22
24
  /** @jsx jsx */
@@ -24,6 +26,7 @@ function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj &&
24
26
  var HoverCardComponent = function HoverCardComponent(_ref) {
25
27
  var children = _ref.children,
26
28
  url = _ref.url,
29
+ id = _ref.id,
27
30
  analyticsHandler = _ref.analyticsHandler,
28
31
  analytics = _ref.analytics,
29
32
  _ref$canOpen = _ref.canOpen,
@@ -133,7 +136,23 @@ var HoverCardComponent = function HoverCardComponent(_ref) {
133
136
  }, [closeOnChildClick, hideCard]);
134
137
  var content = (0, _react2.useCallback)(function (_ref2) {
135
138
  var update = _ref2.update;
136
- return (0, _react.jsx)(_HoverCardContent.default, {
139
+ return (0, _platformFeatureFlags.getBooleanFF)('platform.linking-platform.smart-card.enable-analytics-context') ? (0, _react.jsx)(_SmartLinkAnalyticsContext.SmartLinkAnalyticsContext, {
140
+ url: url,
141
+ appearance: _constants.CardDisplay.HoverCardPreview,
142
+ id: id
143
+ }, (0, _react.jsx)(_HoverCardContent.default, {
144
+ onMouseEnter: initShowCard,
145
+ onMouseLeave: initHideCard,
146
+ analytics: analytics,
147
+ cardActions: filteredActions,
148
+ cardState: linkState,
149
+ onActionClick: onActionClick,
150
+ onResolve: update,
151
+ renderers: renderers,
152
+ showServerActions: showServerActions,
153
+ url: url,
154
+ id: id
155
+ })) : (0, _react.jsx)(_HoverCardContent.default, {
137
156
  onMouseEnter: initShowCard,
138
157
  onMouseLeave: initHideCard,
139
158
  analytics: analytics,
@@ -145,7 +164,7 @@ var HoverCardComponent = function HoverCardComponent(_ref) {
145
164
  showServerActions: showServerActions,
146
165
  url: url
147
166
  });
148
- }, [analytics, initHideCard, initShowCard, filteredActions, linkState, onActionClick, renderers, showServerActions, url]);
167
+ }, [analytics, initHideCard, initShowCard, filteredActions, linkState, onActionClick, renderers, showServerActions, url, id]);
149
168
  var trigger = (0, _react2.useCallback)(function (triggerProps) {
150
169
  return (0, _react.jsx)("span", {
151
170
  ref: parentSpan
@@ -6,6 +6,7 @@ Object.defineProperty(exports, "__esModule", {
6
6
  value: true
7
7
  });
8
8
  exports.toFooterActions = exports.default = void 0;
9
+ var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
9
10
  var _react = _interopRequireWildcard(require("react"));
10
11
  var _linkProvider = require("@atlaskit/link-provider");
11
12
  var _extractors = require("@atlaskit/linking-common/extractors");
@@ -16,10 +17,31 @@ var _FlexibleCard = _interopRequireDefault(require("../../../../FlexibleCard"));
16
17
  var _utils = require("../../../utils");
17
18
  var _SnippetOrPreview = _interopRequireDefault(require("../../SnippetOrPreview"));
18
19
  var _extractMetadata = require("../../../../../extractors/hover/extractMetadata");
20
+ var _messages = require("../../../../../messages");
21
+ var _reactIntlNext = require("react-intl-next");
19
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); }
20
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; }
21
- var toFooterActions = function toFooterActions(cardActions, onActionClick) {
24
+ function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
25
+ function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { (0, _defineProperty2.default)(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
26
+ var toFooterActions = function toFooterActions(cardActions, onActionClick, enableImprovedPreviewAction) {
27
+ var appearance = enableImprovedPreviewAction ? {
28
+ appearance: 'primary'
29
+ } : undefined;
30
+ var previewText = enableImprovedPreviewAction ? _messages.messages.preview_improved : _messages.messages.preview;
22
31
  return cardActions.map(function (action) {
32
+ if (action.id === 'preview-content') {
33
+ return _objectSpread({
34
+ content: /*#__PURE__*/_react.default.createElement(_reactIntlNext.FormattedMessage, previewText),
35
+ name: _constants.ActionName.CustomAction,
36
+ onClick: function onClick() {
37
+ if (onActionClick) {
38
+ onActionClick(action.id);
39
+ }
40
+ return action.invoke();
41
+ },
42
+ testId: action.id
43
+ }, appearance);
44
+ }
23
45
  return {
24
46
  content: action.text,
25
47
  name: _constants.ActionName.CustomAction,
@@ -48,6 +70,7 @@ var HoverCardResolvedView = function HoverCardResolvedView(_ref) {
48
70
  onActionClick = _ref.onActionClick,
49
71
  extensionKey = _ref.extensionKey;
50
72
  var showActionableElement = (0, _linkProvider.useFeatureFlag)('enableActionableElement');
73
+ var enableImprovedPreviewAction = (0, _linkProvider.useFeatureFlag)('enableImprovedPreviewAction');
51
74
  (0, _react.useEffect)(function () {
52
75
  // Since this hover view is only rendered on resolved status,
53
76
  // there is no need to check for statuses.
@@ -57,8 +80,8 @@ var HoverCardResolvedView = function HoverCardResolvedView(_ref) {
57
80
  });
58
81
  }, [analytics.ui, cardState.status]);
59
82
  var footerActions = (0, _react.useMemo)(function () {
60
- return toFooterActions(cardActions, onActionClick);
61
- }, [cardActions, onActionClick]);
83
+ return toFooterActions(cardActions, onActionClick, Boolean(enableImprovedPreviewAction));
84
+ }, [cardActions, onActionClick, enableImprovedPreviewAction]);
62
85
  var data = (_cardState$details = cardState.details) === null || _cardState$details === void 0 ? void 0 : _cardState$details.data;
63
86
  var _useMemo = (0, _react.useMemo)(function () {
64
87
  var types = data ? (0, _extractors.extractType)(data) : undefined;
@@ -21,7 +21,7 @@ const extractBlockIcon = jsonLd => {
21
21
  }
22
22
  };
23
23
  const extractBlockDetails = jsonLd => [extractCommentCount(jsonLd), extractProgrammingLanguage(jsonLd), extractSubscriberCount(jsonLd), extractAttachmentCount(jsonLd)].filter(detail => !!detail);
24
- export const extractBlockActions = (props, jsonLd, opts, platform, meta) => {
24
+ export const extractBlockActions = (props, jsonLd, opts, platform, meta, enableImprovedPreviewAction) => {
25
25
  if (opts) {
26
26
  const {
27
27
  handleInvoke
@@ -32,7 +32,8 @@ export const extractBlockActions = (props, jsonLd, opts, platform, meta) => {
32
32
  viewProps: props,
33
33
  jsonLd,
34
34
  platform,
35
- meta
35
+ meta,
36
+ enableImprovedPreviewAction
36
37
  });
37
38
 
38
39
  // The previewAction should always be the last action
@@ -63,7 +64,7 @@ export const extractBlockUsers = jsonLd => {
63
64
  return updatedByMembers || createdByMembers;
64
65
  }
65
66
  };
66
- export const extractBlockProps = (jsonLd, meta, opts, renderers, platform) => {
67
+ export const extractBlockProps = (jsonLd, meta, opts, renderers, platform, enableImprovedPreviewAction) => {
67
68
  const props = {
68
69
  link: extractLink(jsonLd),
69
70
  title: extractTitle(jsonLd),
@@ -80,6 +81,6 @@ export const extractBlockProps = (jsonLd, meta, opts, renderers, platform) => {
80
81
  };
81
82
  return {
82
83
  ...props,
83
- actions: extractBlockActions(props, jsonLd, opts, platform, meta)
84
+ actions: extractBlockActions(props, jsonLd, opts, platform, meta, enableImprovedPreviewAction)
84
85
  };
85
86
  };
@@ -46,7 +46,8 @@ export const extractPreviewAction = ({
46
46
  origin,
47
47
  source = 'block',
48
48
  analytics,
49
- meta
49
+ meta,
50
+ enableImprovedPreviewAction
50
51
  }) => {
51
52
  // Extract metadata from view props & raw JSON-LD.
52
53
  const metadataFromJsonLd = getMetadataFromJsonLd(jsonLd, platform);
@@ -70,7 +71,8 @@ export const extractPreviewAction = ({
70
71
  onViewActionClick: () => {
71
72
  handleInvoke(getInvokeOpts(key, 'ViewAction'));
72
73
  },
73
- isSupportTheming: extractIsSupportTheming(meta)
74
+ isSupportTheming: extractIsSupportTheming(meta),
75
+ enableImprovedPreviewAction
74
76
  });
75
77
  // Setup props to go through proper Redux 'invocation' flow
76
78
  // for analytics, further state management if required in future.
@@ -215,6 +215,12 @@ export const messages = defineMessages({
215
215
  defaultMessage: 'Owned by {context}',
216
216
  description: 'Indicates the person or entity that owns or maintains the resource.'
217
217
  },
218
+ // Move this to preview once FF has been merged
219
+ preview_improved: {
220
+ id: 'fabric.linking.preview_improved',
221
+ defaultMessage: 'Open preview',
222
+ description: 'Click to view a richer view of your content, without needing to navigate to it.'
223
+ },
218
224
  preview: {
219
225
  id: 'fabric.linking.preview',
220
226
  defaultMessage: 'Full screen view',
@@ -16,14 +16,21 @@ export const useSmartCardActions = (id, url, analytics) => {
16
16
  getState,
17
17
  dispatch
18
18
  } = store;
19
- const {
20
- details,
21
- status,
22
- metadataStatus
23
- } = getState()[url] || {
24
- status: SmartLinkStatus.Pending,
25
- details: undefined
26
- };
19
+ const getSmartLinkState = useCallback(() => {
20
+ var _getState$url;
21
+ const {
22
+ details,
23
+ status,
24
+ metadataStatus
25
+ } = (_getState$url = getState()[url]) !== null && _getState$url !== void 0 ? _getState$url : {
26
+ status: SmartLinkStatus.Pending
27
+ };
28
+ return {
29
+ details,
30
+ status,
31
+ metadataStatus
32
+ };
33
+ }, [getState, url]);
27
34
  const setMetadataStatus = useCallback(metadataStatus => {
28
35
  dispatch(cardAction(ACTION_UPDATE_METADATA_STATUS, {
29
36
  url
@@ -31,6 +38,9 @@ export const useSmartCardActions = (id, url, analytics) => {
31
38
  }, [dispatch, url]);
32
39
  const resolve = useCallback(async (resourceUrl = url, isReloading = false, isMetadataRequest = false) => resolveUrl(resourceUrl, isReloading, isMetadataRequest, id), [id, resolveUrl, url]);
33
40
  const register = useCallback(() => {
41
+ const {
42
+ details
43
+ } = getSmartLinkState();
34
44
  if (!details) {
35
45
  dispatch(cardAction(ACTION_RESOLVING, {
36
46
  url
@@ -38,23 +48,33 @@ export const useSmartCardActions = (id, url, analytics) => {
38
48
  setMetadataStatus('pending');
39
49
  }
40
50
  return resolve();
41
- }, [details, resolve, dispatch, url, setMetadataStatus]);
51
+ }, [getSmartLinkState, resolve, dispatch, url, setMetadataStatus]);
42
52
  const reload = useCallback(() => {
53
+ const {
54
+ details
55
+ } = getSmartLinkState();
43
56
  const definitionId = getDefinitionId(details);
44
57
  if (definitionId) {
45
58
  getByDefinitionId(definitionId, getState()).map(url => resolve(url, true));
46
59
  } else {
47
60
  resolve(url, true);
48
61
  }
49
- }, [details, url, getState, resolve]);
62
+ }, [getSmartLinkState, url, getState, resolve]);
50
63
  const loadMetadata = useCallback(() => {
64
+ const {
65
+ metadataStatus
66
+ } = getSmartLinkState();
51
67
  //metadataStatus will be undefined for SSR links only
52
68
  if (metadataStatus === undefined) {
53
69
  setMetadataStatus('pending');
54
70
  return resolve(url, false, true);
55
71
  }
56
- }, [metadataStatus, resolve, setMetadataStatus, url]);
72
+ }, [getSmartLinkState, resolve, setMetadataStatus, url]);
57
73
  const authorize = useCallback(appearance => {
74
+ const {
75
+ details,
76
+ status
77
+ } = getSmartLinkState();
58
78
  const definitionId = getDefinitionId(details);
59
79
  const extensionKey = getExtensionKey(details);
60
80
  const services = getServices(details);
@@ -106,7 +126,7 @@ export const useSmartCardActions = (id, url, analytics) => {
106
126
  reload();
107
127
  });
108
128
  }
109
- }, [analytics.ui, analytics.screen, analytics.track, analytics.operational, id, reload, details, status]);
129
+ }, [getSmartLinkState, analytics.ui, analytics.screen, analytics.track, analytics.operational, id, reload]);
110
130
  const invoke = useCallback(async (opts, appearance) => {
111
131
  const {
112
132
  key,
@@ -1,33 +1,14 @@
1
1
  import { useCallback } from 'react';
2
2
  import { useSmartLinkClientExtension } from '@atlaskit/link-client-extension';
3
3
  import { useSmartLinkContext } from '@atlaskit/link-provider';
4
- const useInvoke = ({
5
- failed,
6
- started,
7
- success
8
- } = {}) => {
4
+ const useInvoke = () => {
9
5
  const {
10
6
  connections
11
7
  } = useSmartLinkContext();
12
8
  const clientExt = useSmartLinkClientExtension(connections.client);
13
9
  return useCallback(async (req, cb) => {
14
- var _req$action;
15
- const smartLinkActionType = req === null || req === void 0 ? void 0 : (_req$action = req.action) === null || _req$action === void 0 ? void 0 : _req$action.actionType;
16
- try {
17
- started && started({
18
- smartLinkActionType
19
- });
20
- const response = await clientExt.invoke(req);
21
- success && success({
22
- smartLinkActionType
23
- });
24
- return cb ? cb(response) : response;
25
- } catch (err) {
26
- failed && failed({
27
- smartLinkActionType
28
- });
29
- throw err;
30
- }
31
- }, [clientExt, failed, started, success]);
10
+ const response = await clientExt.invoke(req);
11
+ return cb ? cb(response) : response;
12
+ }, [clientExt]);
32
13
  };
33
14
  export default useInvoke;
@@ -1,7 +1,9 @@
1
1
  import { useCallback } from 'react';
2
+ import { unstable_batchedUpdates } from 'react-dom';
2
3
  import { addMetadataToExperience } from '../../analytics';
3
4
  import { getStatus } from '../../helpers';
4
5
  import { ACTION_ERROR, ACTION_ERROR_FALLBACK, ACTION_RELOADING, ACTION_RESOLVED, ACTION_UPDATE_METADATA_STATUS, APIError, cardAction } from '@atlaskit/linking-common';
6
+ import { getBooleanFF } from '@atlaskit/platform-feature-flags';
5
7
  import { ERROR_MESSAGE_FATAL, ERROR_MESSAGE_METADATA, ERROR_MESSAGE_OAUTH } from '../../actions/constants';
6
8
  import { getUnauthorizedJsonLd } from '../../../utils/jsonld';
7
9
  import { SmartLinkStatus } from '../../../constants';
@@ -75,6 +77,20 @@ const useResolve = () => {
75
77
  }
76
78
  }
77
79
  }, [getState, setMetadataStatus, dispatch]);
80
+ const handleResolvedLinkSuccess = useCallback((resourceUrl, response, isReloading, isMetadataRequest) => {
81
+ //if a link resolves normally, metadata will also always be resolved
82
+ setMetadataStatus(resourceUrl, 'resolved');
83
+ // Dispatch Analytics and resolved card action - including unauthorized states.
84
+ if (isReloading) {
85
+ dispatch(cardAction(ACTION_RELOADING, {
86
+ url: resourceUrl
87
+ }, response));
88
+ } else {
89
+ dispatch(cardAction(ACTION_RESOLVED, {
90
+ url: resourceUrl
91
+ }, response, undefined, undefined, isMetadataRequest));
92
+ }
93
+ }, [setMetadataStatus, dispatch]);
78
94
  const handleResolvedLinkResponse = useCallback((resourceUrl, response, isReloading = false, isMetadataRequest) => {
79
95
  const hostname = new URL(resourceUrl).hostname;
80
96
  const nextStatus = response ? getStatus(response) : 'fatal';
@@ -97,20 +113,20 @@ const useResolve = () => {
97
113
  handleResolvedLinkError(resourceUrl, new APIError('error', hostname, ERROR_MESSAGE_METADATA), response, isMetadataRequest);
98
114
  return;
99
115
  }
100
-
101
- //if a link resolves normally, metadata will also always be resolved
102
- setMetadataStatus(resourceUrl, 'resolved');
103
- // Dispatch Analytics and resolved card action - including unauthorized states.
104
- if (isReloading) {
105
- dispatch(cardAction(ACTION_RELOADING, {
106
- url: resourceUrl
107
- }, response));
116
+ if (getBooleanFF('platform.linking-platform.smart-card.enable-analytics-context')) {
117
+ /**
118
+ * Using unstable_batchedUpdates because this store update happens async and trigers a rerender
119
+ * more info:
120
+ * https://github.com/facebook/react/blob/v18.2.0/packages/use-sync-external-store/src/useSyncExternalStoreShimClient.js#L113
121
+ * https://react-redux.js.org/api/batch
122
+ */
123
+ unstable_batchedUpdates(() => {
124
+ handleResolvedLinkSuccess(resourceUrl, response, isReloading, isMetadataRequest);
125
+ });
108
126
  } else {
109
- dispatch(cardAction(ACTION_RESOLVED, {
110
- url: resourceUrl
111
- }, response, undefined, undefined, isMetadataRequest));
127
+ handleResolvedLinkSuccess(resourceUrl, response, isReloading, isMetadataRequest);
112
128
  }
113
- }, [dispatch, handleResolvedLinkError, hasAuthFlowSupported, setMetadataStatus]);
129
+ }, [handleResolvedLinkError, handleResolvedLinkSuccess, hasAuthFlowSupported]);
114
130
  return useCallback(async (url, isReloading = false, isMetadataRequest = false, id = '') => {
115
131
  const {
116
132
  details
@@ -0,0 +1,35 @@
1
+ import React, { useMemo } from 'react';
2
+ import { AnalyticsContext } from '@atlaskit/analytics-next';
3
+ import { getResolvedAttributes, getUrlAttributes } from '@atlaskit/link-analytics/resolved-attributes';
4
+ import { isFlexibleUiCard } from '../flexible';
5
+ import { CardDisplay } from '../../constants';
6
+ import { useSmartCardState as useSmartLinkState } from '../../state/store';
7
+ export const SmartLinkAnalyticsContext = ({
8
+ children,
9
+ url,
10
+ appearance,
11
+ id
12
+ }) => {
13
+ const {
14
+ details,
15
+ status
16
+ } = useSmartLinkState(url);
17
+ const resolvedAttributes = getResolvedAttributes({
18
+ url
19
+ }, details, status);
20
+ const {
21
+ urlHash
22
+ } = getUrlAttributes(url);
23
+ const isFlexibleUi = useMemo(() => isFlexibleUiCard(children), [children]);
24
+ const display = isFlexibleUi ? CardDisplay.Flexible : appearance;
25
+ return /*#__PURE__*/React.createElement(AnalyticsContext, {
26
+ data: {
27
+ attributes: {
28
+ ...resolvedAttributes,
29
+ urlHash,
30
+ display,
31
+ id
32
+ }
33
+ }
34
+ }, children);
35
+ };
@@ -6,6 +6,16 @@ export const context = {
6
6
  packageName,
7
7
  packageVersion
8
8
  };
9
+ export let TrackQuickActionType = /*#__PURE__*/function (TrackQuickActionType) {
10
+ TrackQuickActionType["StatusUpdate"] = "StatusUpdate";
11
+ return TrackQuickActionType;
12
+ }({});
13
+ export let TrackQuickActionFailureReason = /*#__PURE__*/function (TrackQuickActionFailureReason) {
14
+ TrackQuickActionFailureReason["PermissionError"] = "PermissionError";
15
+ TrackQuickActionFailureReason["ValidationError"] = "ValidationError";
16
+ TrackQuickActionFailureReason["UnknownError"] = "UnknownError";
17
+ return TrackQuickActionFailureReason;
18
+ }({});
9
19
  const uiActionSubjectIds = {
10
20
  DownloadAction: 'downloadDocument',
11
21
  PreviewAction: 'invokePreviewScreen',
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/smart-card",
3
- "version": "26.2.1",
3
+ "version": "26.3.0",
4
4
  "sideEffects": false
5
5
  }