@atlaskit/smart-card 20.0.4 → 20.1.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 (76) hide show
  1. package/CHANGELOG.md +41 -0
  2. package/dist/cjs/state/actions/constants.js +4 -2
  3. package/dist/cjs/state/actions/index.js +51 -19
  4. package/dist/cjs/state/analytics/useSmartLinkAnalytics.js +26 -6
  5. package/dist/cjs/version.json +1 -1
  6. package/dist/cjs/view/BlockCard/index.js +29 -0
  7. package/dist/cjs/view/CardWithUrl/component.js +7 -2
  8. package/dist/cjs/view/CardWithUrl/loader.js +7 -9
  9. package/dist/cjs/view/EmbedCard/index.js +29 -0
  10. package/dist/cjs/view/FlexibleCard/components/blocks/element-group/index.js +2 -2
  11. package/dist/cjs/view/FlexibleCard/index.js +34 -7
  12. package/dist/cjs/view/HoverCard/components/HoverCardComponent.js +143 -0
  13. package/dist/cjs/view/HoverCard/components/{hover-card-content.js → HoverCardContent.js} +29 -25
  14. package/dist/cjs/view/HoverCard/index.js +25 -126
  15. package/dist/cjs/view/HoverCard/styled.js +11 -1
  16. package/dist/cjs/view/HoverCard/utils.js +3 -3
  17. package/dist/cjs/view/InlineCard/index.js +29 -0
  18. package/dist/es2019/state/actions/constants.js +2 -1
  19. package/dist/es2019/state/actions/index.js +46 -18
  20. package/dist/es2019/state/analytics/useSmartLinkAnalytics.js +24 -7
  21. package/dist/es2019/version.json +1 -1
  22. package/dist/es2019/view/BlockCard/index.js +29 -0
  23. package/dist/es2019/view/CardWithUrl/component.js +7 -2
  24. package/dist/es2019/view/CardWithUrl/loader.js +8 -10
  25. package/dist/es2019/view/EmbedCard/index.js +29 -0
  26. package/dist/es2019/view/FlexibleCard/components/blocks/element-group/index.js +4 -0
  27. package/dist/es2019/view/FlexibleCard/index.js +32 -7
  28. package/dist/es2019/view/HoverCard/components/HoverCardComponent.js +102 -0
  29. package/dist/es2019/view/HoverCard/components/{hover-card-content.js → HoverCardContent.js} +18 -21
  30. package/dist/es2019/view/HoverCard/index.js +26 -97
  31. package/dist/es2019/view/HoverCard/styled.js +8 -0
  32. package/dist/es2019/view/HoverCard/utils.js +1 -1
  33. package/dist/es2019/view/InlineCard/index.js +29 -0
  34. package/dist/esm/state/actions/constants.js +2 -1
  35. package/dist/esm/state/actions/index.js +51 -20
  36. package/dist/esm/state/analytics/useSmartLinkAnalytics.js +27 -7
  37. package/dist/esm/version.json +1 -1
  38. package/dist/esm/view/BlockCard/index.js +29 -0
  39. package/dist/esm/view/CardWithUrl/component.js +7 -2
  40. package/dist/esm/view/CardWithUrl/loader.js +8 -10
  41. package/dist/esm/view/EmbedCard/index.js +29 -0
  42. package/dist/esm/view/FlexibleCard/components/blocks/element-group/index.js +2 -2
  43. package/dist/esm/view/FlexibleCard/index.js +33 -7
  44. package/dist/esm/view/HoverCard/components/HoverCardComponent.js +114 -0
  45. package/dist/esm/view/HoverCard/components/{hover-card-content.js → HoverCardContent.js} +20 -22
  46. package/dist/esm/view/HoverCard/index.js +24 -109
  47. package/dist/esm/view/HoverCard/styled.js +8 -0
  48. package/dist/esm/view/HoverCard/utils.js +1 -1
  49. package/dist/esm/view/InlineCard/index.js +29 -0
  50. package/dist/types/state/actions/constants.d.ts +1 -0
  51. package/dist/types/state/actions/index.d.ts +1 -0
  52. package/dist/types/state/analytics/useSmartLinkAnalytics.d.ts +9 -0
  53. package/dist/types/state/hooks/useSmartLink.d.ts +3 -0
  54. package/dist/types/view/BlockCard/types.d.ts +2 -0
  55. package/dist/types/view/Card/index.d.ts +1 -1
  56. package/dist/types/view/Card/types.d.ts +2 -1
  57. package/dist/types/view/CardWithUrl/component.d.ts +1 -1
  58. package/dist/types/view/CardWithUrl/types.d.ts +2 -1
  59. package/dist/types/view/EmbedCard/components/styled.d.ts +16 -16
  60. package/dist/types/view/EmbedCard/types.d.ts +2 -0
  61. package/dist/types/view/FlexibleCard/types.d.ts +9 -4
  62. package/dist/types/view/HoverCard/components/HoverCardComponent.d.ts +4 -0
  63. package/dist/types/view/HoverCard/components/HoverCardContent.d.ts +9 -0
  64. package/dist/types/view/HoverCard/index.d.ts +2 -4
  65. package/dist/types/view/HoverCard/styled.d.ts +2 -0
  66. package/dist/types/view/HoverCard/types.d.ts +8 -0
  67. package/dist/types/view/HoverCard/utils.d.ts +1 -1
  68. package/dist/types/view/InlineCard/Frame/styled.d.ts +1 -1
  69. package/dist/types/view/InlineCard/Icon.d.ts +3 -3
  70. package/dist/types/view/InlineCard/IconAndTitleLayout/styled.d.ts +9 -9
  71. package/dist/types/view/InlineCard/ResolvingView/styled.d.ts +13 -5
  72. package/dist/types/view/InlineCard/styled.d.ts +8 -4
  73. package/dist/types/view/InlineCard/types.d.ts +2 -1
  74. package/dist/types/view/types.d.ts +6 -0
  75. package/package.json +4 -4
  76. package/dist/types/view/HoverCard/components/hover-card-content.d.ts +0 -4
package/CHANGELOG.md CHANGED
@@ -1,5 +1,46 @@
1
1
  # @atlaskit/smart-card
2
2
 
3
+ ## 20.1.0
4
+
5
+ ### Minor Changes
6
+
7
+ - [`58eb89c70f5`](https://bitbucket.org/atlassian/atlassian-frontend/commits/58eb89c70f5) - Add onError callback on Card component.
8
+ The callback is triggered when Card component unable to resolve the link.
9
+
10
+ Return statuses are errored, fallback, forbidden, not_found and unauthorized.
11
+
12
+ Usage
13
+
14
+ ```typescript
15
+ const onError = (data: { status: string; url: string }) => {};
16
+
17
+ <Card appearance="inline" onError={onError} url="https://link-url" />;
18
+ ```
19
+
20
+ ### Patch Changes
21
+
22
+ - [`e15410365b2`](https://bitbucket.org/atlassian/atlassian-frontend/commits/e15410365b2) - - export types/functions in linking common to be used in smart card
23
+
24
+ - add flag to card action to override re-using previous 'resolved' state
25
+
26
+ - add prop to cardState which reflects the metadata state, can be pending, resolved or errored
27
+
28
+ - modified reducer and dispatchers to handle these new props
29
+
30
+ - Updated dependencies
31
+
32
+ ## 20.0.6
33
+
34
+ ### Patch Changes
35
+
36
+ - [`afb579e5778`](https://bitbucket.org/atlassian/atlassian-frontend/commits/afb579e5778) - Flexible UI: Fix styling on MetadataBlock and FooterBlock in Firefox and Safari browser
37
+
38
+ ## 20.0.5
39
+
40
+ ### Patch Changes
41
+
42
+ - [`6e4810f82c3`](https://bitbucket.org/atlassian/atlassian-frontend/commits/6e4810f82c3) - wrap hover preview in error boundary and emit failure event
43
+
3
44
  ## 20.0.4
4
45
 
5
46
  ### Patch Changes
@@ -3,7 +3,7 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.ERROR_MESSAGE_OAUTH = exports.ERROR_MESSAGE_FATAL = exports.ANALYTICS_RESOLVING = exports.ANALYTICS_FALLBACK = exports.ANALYTICS_ERROR = void 0;
6
+ exports.ERROR_MESSAGE_OAUTH = exports.ERROR_MESSAGE_METADATA = exports.ERROR_MESSAGE_FATAL = exports.ANALYTICS_RESOLVING = exports.ANALYTICS_FALLBACK = exports.ANALYTICS_ERROR = void 0;
7
7
  var ANALYTICS_RESOLVING = 'resolving';
8
8
  exports.ANALYTICS_RESOLVING = ANALYTICS_RESOLVING;
9
9
  var ANALYTICS_ERROR = 'errored';
@@ -13,4 +13,6 @@ exports.ANALYTICS_FALLBACK = ANALYTICS_FALLBACK;
13
13
  var ERROR_MESSAGE_OAUTH = 'Provider.authFlow is not set to OAuth2.';
14
14
  exports.ERROR_MESSAGE_OAUTH = ERROR_MESSAGE_OAUTH;
15
15
  var ERROR_MESSAGE_FATAL = 'Fatal error resolving URL';
16
- exports.ERROR_MESSAGE_FATAL = ERROR_MESSAGE_FATAL;
16
+ exports.ERROR_MESSAGE_FATAL = ERROR_MESSAGE_FATAL;
17
+ var ERROR_MESSAGE_METADATA = 'Error resolving metadata.';
18
+ exports.ERROR_MESSAGE_METADATA = ERROR_MESSAGE_METADATA;
@@ -17,10 +17,10 @@ var _react = require("react");
17
17
 
18
18
  var _outboundAuthFlowClient = require("@atlaskit/outbound-auth-flow-client");
19
19
 
20
- var _linkingCommon = require("@atlaskit/linking-common");
21
-
22
20
  var _linkProvider = require("@atlaskit/link-provider");
23
21
 
22
+ var _linkingCommon = require("@atlaskit/linking-common");
23
+
24
24
  var _helpers = require("../helpers");
25
25
 
26
26
  var _constants = require("./constants");
@@ -49,11 +49,23 @@ var useSmartCardActions = function useSmartCardActions(id, url, analytics) {
49
49
  details: undefined
50
50
  },
51
51
  details = _ref.details,
52
- status = _ref.status;
52
+ status = _ref.status,
53
+ metadataStatus = _ref.metadataStatus;
53
54
 
54
55
  var hasAuthFlowSupported = config.authFlow !== 'disabled';
55
56
  var hasData = !!(details && details.data);
56
- var handleResolvedLinkError = (0, _react.useCallback)(function (url, error, response) {
57
+ var setMetadataStatus = (0, _react.useCallback)(function (metadataStatus) {
58
+ dispatch((0, _linkingCommon.cardAction)(_linkingCommon.ACTION_UPDATE_METADATA_STATUS, {
59
+ url: url
60
+ }, undefined, undefined, metadataStatus));
61
+ }, [dispatch, url]);
62
+ var handleResolvedLinkError = (0, _react.useCallback)(function (url, error, response, isMetadataRequest) {
63
+ // If metadata request then set metadata status, return and do not alter link status
64
+ if (isMetadataRequest) {
65
+ setMetadataStatus('errored');
66
+ return;
67
+ }
68
+
57
69
  if (error.kind === 'fatal') {
58
70
  // If there's no previous data in the store for this URL, then bail
59
71
  // out and let the editor handle fallbacks (returns to a blue link).
@@ -90,25 +102,34 @@ var useSmartCardActions = function useSmartCardActions(id, url, analytics) {
90
102
  }, undefined, error));
91
103
  }
92
104
  }
93
- }, [hasData, status, dispatch, details]);
105
+ }, [setMetadataStatus, hasData, status, dispatch, details]);
94
106
  var handleResolvedLinkResponse = (0, _react.useCallback)(function (resourceUrl, response) {
95
107
  var isReloading = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
108
+ var isMetadataRequest = arguments.length > 3 ? arguments[3] : undefined;
96
109
  var hostname = new URL(resourceUrl).hostname;
97
110
  var nextStatus = response ? (0, _helpers.getStatus)(response) : 'fatal'; // If we require authorization & do not have an authFlow available,
98
111
  // throw an error and render as a normal blue link.
99
112
 
100
113
  if ((nextStatus === 'unauthorized' || nextStatus === 'forbidden') && !hasAuthFlowSupported) {
101
- handleResolvedLinkError(resourceUrl, new _linkingCommon.APIError('fallback', hostname, _constants.ERROR_MESSAGE_OAUTH), response);
114
+ handleResolvedLinkError(resourceUrl, new _linkingCommon.APIError('fallback', hostname, _constants.ERROR_MESSAGE_OAUTH), response, isMetadataRequest);
102
115
  return;
103
116
  } // Handle any other errors
104
117
 
105
118
 
106
119
  if (nextStatus === 'fatal') {
107
- handleResolvedLinkError(resourceUrl, new _linkingCommon.APIError('fatal', hostname, _constants.ERROR_MESSAGE_FATAL));
120
+ handleResolvedLinkError(resourceUrl, new _linkingCommon.APIError('fatal', hostname, _constants.ERROR_MESSAGE_FATAL), undefined, isMetadataRequest);
108
121
  return;
109
- } // Dispatch Analytics and resolved card action - including unauthorized states.
122
+ } // Handle errors of any other kind in the metadata request response
110
123
 
111
124
 
125
+ if (isMetadataRequest && nextStatus !== 'resolved') {
126
+ handleResolvedLinkError(resourceUrl, new _linkingCommon.APIError('error', hostname, _constants.ERROR_MESSAGE_METADATA), response, isMetadataRequest);
127
+ return;
128
+ } //if a link resolves normally, metadata will also always be resolved
129
+
130
+
131
+ setMetadataStatus('resolved'); // Dispatch Analytics and resolved card action - including unauthorized states.
132
+
112
133
  if (isReloading) {
113
134
  dispatch((0, _linkingCommon.cardAction)(_linkingCommon.ACTION_RELOADING, {
114
135
  url: resourceUrl
@@ -116,12 +137,13 @@ var useSmartCardActions = function useSmartCardActions(id, url, analytics) {
116
137
  } else {
117
138
  dispatch((0, _linkingCommon.cardAction)(_linkingCommon.ACTION_RESOLVED, {
118
139
  url: resourceUrl
119
- }, response));
140
+ }, response, undefined, undefined, isMetadataRequest));
120
141
  }
121
- }, [dispatch, handleResolvedLinkError, hasAuthFlowSupported]);
142
+ }, [dispatch, handleResolvedLinkError, hasAuthFlowSupported, setMetadataStatus]);
122
143
  var resolve = (0, _react.useCallback)( /*#__PURE__*/(0, _asyncToGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee() {
123
144
  var resourceUrl,
124
145
  isReloading,
146
+ isMetadataRequest,
125
147
  _args = arguments;
126
148
  return _regenerator.default.wrap(function _callee$(_context) {
127
149
  while (1) {
@@ -129,24 +151,25 @@ var useSmartCardActions = function useSmartCardActions(id, url, analytics) {
129
151
  case 0:
130
152
  resourceUrl = _args.length > 0 && _args[0] !== undefined ? _args[0] : url;
131
153
  isReloading = _args.length > 1 && _args[1] !== undefined ? _args[1] : false;
154
+ isMetadataRequest = _args.length > 2 && _args[2] !== undefined ? _args[2] : false;
132
155
 
133
- if (!(isReloading || !hasData)) {
134
- _context.next = 6;
156
+ if (!(isReloading || !hasData || isMetadataRequest)) {
157
+ _context.next = 7;
135
158
  break;
136
159
  }
137
160
 
138
161
  return _context.abrupt("return", connections.client.fetchData(resourceUrl).then(function (response) {
139
- return handleResolvedLinkResponse(resourceUrl, response, isReloading);
162
+ return handleResolvedLinkResponse(resourceUrl, response, isReloading, isMetadataRequest);
140
163
  }).catch(function (error) {
141
- return handleResolvedLinkError(resourceUrl, error);
164
+ return handleResolvedLinkError(resourceUrl, error, undefined, isMetadataRequest);
142
165
  }));
143
166
 
144
- case 6:
167
+ case 7:
145
168
  (0, _analytics.addMetadataToExperience)('smart-link-rendered', id, {
146
169
  cached: true
147
170
  });
148
171
 
149
- case 7:
172
+ case 8:
150
173
  case "end":
151
174
  return _context.stop();
152
175
  }
@@ -158,10 +181,11 @@ var useSmartCardActions = function useSmartCardActions(id, url, analytics) {
158
181
  dispatch((0, _linkingCommon.cardAction)(_linkingCommon.ACTION_PENDING, {
159
182
  url: url
160
183
  }));
184
+ setMetadataStatus('pending');
161
185
  }
162
186
 
163
187
  return resolve();
164
- }, [url, resolve, details, dispatch]);
188
+ }, [details, resolve, dispatch, url, setMetadataStatus]);
165
189
  var reload = (0, _react.useCallback)(function () {
166
190
  var definitionId = (0, _helpers.getDefinitionId)(details);
167
191
 
@@ -173,6 +197,13 @@ var useSmartCardActions = function useSmartCardActions(id, url, analytics) {
173
197
  resolve(url, true);
174
198
  }
175
199
  }, [url, details, getState, resolve]);
200
+ var loadMetadata = (0, _react.useCallback)(function () {
201
+ //metadataStatus will be undefined for SSR links only
202
+ if (metadataStatus === undefined) {
203
+ setMetadataStatus('pending');
204
+ return resolve(url, false, true);
205
+ }
206
+ }, [metadataStatus, resolve, setMetadataStatus, url]);
176
207
  var authorize = (0, _react.useCallback)(function (appearance) {
177
208
  var definitionId = (0, _helpers.getDefinitionId)(details);
178
209
  var extensionKey = (0, _helpers.getExtensionKey)(details);
@@ -268,9 +299,10 @@ var useSmartCardActions = function useSmartCardActions(id, url, analytics) {
268
299
  register: register,
269
300
  reload: reload,
270
301
  authorize: authorize,
271
- invoke: invoke
302
+ invoke: invoke,
303
+ loadMetadata: loadMetadata
272
304
  };
273
- }, [register, reload, authorize, invoke]);
305
+ }, [register, reload, authorize, invoke, loadMetadata]);
274
306
  };
275
307
 
276
308
  exports.useSmartCardActions = useSmartCardActions;
@@ -32,12 +32,13 @@ var useSmartLinkAnalytics = function useSmartLinkAnalytics(url, dispatchAnalytic
32
32
  var _useSmartLinkContext = (0, _linkProvider.useSmartLinkContext)(),
33
33
  store = _useSmartLinkContext.store;
34
34
 
35
- var state = (0, _linkingCommon.getUrl)(store, url);
36
- var extractedDefinitionId = (0, _helpers.getDefinitionId)(state.details);
37
- var extractedExtensionKey = (0, _helpers.getExtensionKey)(state.details);
38
- var extractedResourceType = (0, _helpers.getResourceType)(state.details);
39
- var extractedSubproduct = (0, _helpers.getSubproduct)(state.details);
40
- var extractedProduct = (0, _helpers.getProduct)(state.details);
35
+ var state = store ? (0, _linkingCommon.getUrl)(store, url) : undefined;
36
+ var details = state ? state.details : undefined;
37
+ var extractedDefinitionId = (0, _helpers.getDefinitionId)(details);
38
+ var extractedExtensionKey = (0, _helpers.getExtensionKey)(details);
39
+ var extractedResourceType = (0, _helpers.getResourceType)(details);
40
+ var extractedSubproduct = (0, _helpers.getSubproduct)(details);
41
+ var extractedProduct = (0, _helpers.getProduct)(details);
41
42
  /** Contains all ui analytics events */
42
43
 
43
44
  var ui = (0, _react.useMemo)(function () {
@@ -172,6 +173,25 @@ var useSmartLinkAnalytics = function useSmartLinkAnalytics(url, dispatchAnalytic
172
173
  dispatchAnalytics((0, _analytics.uiRenderSuccessEvent)(display, status, definitionId, extensionKey));
173
174
  },
174
175
 
176
+ /**
177
+ * This fires an event that represents when a Smart Link renders unsuccessfuly.
178
+ * @param display Whether the card was an Inline, Block, Embed or Flexible UI.
179
+ * @param id The unique ID for this Smart Link.
180
+ * @param error: An error representing why the Smart Link render failed.
181
+ * @param errorInfo: Additional details about the error including the stack trace.
182
+ */
183
+ renderFailedEvent: function renderFailedEvent(display) {
184
+ var id = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : defaultId;
185
+ var error = arguments.length > 2 ? arguments[2] : undefined;
186
+ var errorInfo = arguments.length > 3 ? arguments[3] : undefined;
187
+ // Start and fail the smart-link-rendered experience. If it has already
188
+ // been started nothing happens.
189
+ (0, _ufoExperiences.startUfoExperience)('smart-link-rendered', id);
190
+ (0, _ufoExperiences.failUfoExperience)('smart-link-rendered', id);
191
+ (0, _ufoExperiences.failUfoExperience)('smart-link-authenticated', id);
192
+ dispatchAnalytics((0, _analytics.uiRenderFailedEvent)(display, error, errorInfo));
193
+ },
194
+
175
195
  /**
176
196
  * This fires an event that represents a hover preview being opened.
177
197
  * @param hoverDisplay Whether the hover preview was displayed as a card or embed.
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/smart-card",
3
- "version": "20.0.4",
3
+ "version": "20.1.0",
4
4
  "sideEffects": false
5
5
  }
@@ -109,6 +109,7 @@ var BlockCard = function BlockCard(_ref) {
109
109
  renderers = _ref.renderers,
110
110
  isSelected = _ref.isSelected,
111
111
  onResolve = _ref.onResolve,
112
+ onError = _ref.onError,
112
113
  testId = _ref.testId,
113
114
  showActions = _ref.showActions,
114
115
  platform = _ref.platform;
@@ -146,6 +147,13 @@ var BlockCard = function BlockCard(_ref) {
146
147
  }));
147
148
 
148
149
  case 'unauthorized':
150
+ if (onError) {
151
+ onError({
152
+ url: url,
153
+ status: status
154
+ });
155
+ }
156
+
149
157
  var unauthorizedViewProps = (0, _block.extractBlockProps)(data, meta, extractorOpts);
150
158
  return /*#__PURE__*/_react.default.createElement(_UnauthorizedView.UnauthorizedView, (0, _extends2.default)({}, unauthorizedViewProps, {
151
159
  isSelected: isSelected,
@@ -156,6 +164,13 @@ var BlockCard = function BlockCard(_ref) {
156
164
  }));
157
165
 
158
166
  case 'forbidden':
167
+ if (onError) {
168
+ onError({
169
+ url: url,
170
+ status: status
171
+ });
172
+ }
173
+
159
174
  var forbiddenViewProps = (0, _block.extractBlockProps)(data, meta, extractorOpts);
160
175
  var cardMetadata = (_details$meta = details === null || details === void 0 ? void 0 : details.meta) !== null && _details$meta !== void 0 ? _details$meta : (0, _jsonld.getUnauthorizedJsonLd)().meta;
161
176
  var requestAccessContext = (0, _context.extractRequestAccessContext)({
@@ -172,6 +187,13 @@ var BlockCard = function BlockCard(_ref) {
172
187
  }));
173
188
 
174
189
  case 'not_found':
190
+ if (onError) {
191
+ onError({
192
+ url: url,
193
+ status: status
194
+ });
195
+ }
196
+
175
197
  var notFoundViewProps = (0, _block.extractBlockProps)(data, meta, extractorOpts);
176
198
  return /*#__PURE__*/_react.default.createElement(_NotFoundView.NotFoundView, (0, _extends2.default)({}, notFoundViewProps, {
177
199
  isSelected: isSelected,
@@ -181,6 +203,13 @@ var BlockCard = function BlockCard(_ref) {
181
203
 
182
204
  case 'fallback':
183
205
  case 'errored':
206
+ if (onError) {
207
+ onError({
208
+ url: url,
209
+ status: status
210
+ });
211
+ }
212
+
184
213
  if (authFlow && authFlow === 'disabled') {
185
214
  return /*#__PURE__*/_react.default.createElement(_LinkView.CardLinkView, {
186
215
  link: url,
@@ -47,6 +47,7 @@ function CardWithUrlContent(_ref) {
47
47
  appearance = _ref.appearance,
48
48
  dispatchAnalytics = _ref.dispatchAnalytics,
49
49
  onResolve = _ref.onResolve,
50
+ onError = _ref.onError,
50
51
  testId = _ref.testId,
51
52
  showActions = _ref.showActions,
52
53
  inheritDimensions = _ref.inheritDimensions,
@@ -124,7 +125,7 @@ function CardWithUrlContent(_ref) {
124
125
  if ((0, _helpers.isFinalState)(state.status)) {
125
126
  analytics.ui.renderSuccessEvent(appearance, state.status, id, definitionId, extensionKey);
126
127
  }
127
- }, [appearance, state.details, state.status, url, definitionId, extensionKey, analytics.ui, id]);
128
+ }, [appearance, state.status, url, definitionId, extensionKey, analytics.ui, id]);
128
129
 
129
130
  if (isFlexibleUi) {
130
131
  var cardState = state;
@@ -148,7 +149,8 @@ function CardWithUrlContent(_ref) {
148
149
  ui: ui,
149
150
  url: url,
150
151
  testId: testId,
151
- onResolve: onResolve
152
+ onResolve: onResolve,
153
+ onError: onError
152
154
  }, children);
153
155
  } // We have to keep this last to prevent hook order from being violated
154
156
 
@@ -168,6 +170,7 @@ function CardWithUrlContent(_ref) {
168
170
  handleFrameClick: handleClickWrapper,
169
171
  isSelected: isSelected,
170
172
  onResolve: onResolve,
173
+ onError: onError,
171
174
  testId: testId,
172
175
  inlinePreloaderStyle: inlinePreloaderStyle,
173
176
  showHoverPreview: showHoverPreview
@@ -187,6 +190,7 @@ function CardWithUrlContent(_ref) {
187
190
  handleAnalytics: dispatchAnalytics,
188
191
  isSelected: isSelected,
189
192
  onResolve: onResolve,
193
+ onError: onError,
190
194
  testId: testId,
191
195
  showActions: showActions,
192
196
  platform: platform
@@ -206,6 +210,7 @@ function CardWithUrlContent(_ref) {
206
210
  isFrameVisible: isFrameVisible,
207
211
  platform: platform,
208
212
  onResolve: onResolve,
213
+ onError: onError,
209
214
  testId: testId,
210
215
  inheritDimensions: inheritDimensions,
211
216
  showActions: showActions,
@@ -21,7 +21,7 @@ var _performance = require("../../utils/performance");
21
21
 
22
22
  var _reactErrorBoundary = require("react-error-boundary");
23
23
 
24
- var _ufoExperiences = require("../../state/analytics/ufoExperiences");
24
+ var _analytics2 = require("../../state/analytics");
25
25
 
26
26
  var _LazyFallback = require("./component-lazy/LazyFallback");
27
27
 
@@ -56,6 +56,7 @@ function CardWithURLRenderer(props) {
56
56
  onClick = props.onClick,
57
57
  container = props.container,
58
58
  onResolve = props.onResolve,
59
+ onError = props.onError,
59
60
  testId = props.testId,
60
61
  showActions = props.showActions,
61
62
  inheritDimensions = props.inheritDimensions,
@@ -80,6 +81,7 @@ function CardWithURLRenderer(props) {
80
81
 
81
82
  (0, _analytics.fireSmartLinkEvent)(analyticsPayload, createAnalyticsEvent);
82
83
  }, [appearance, createAnalyticsEvent]);
84
+ var analytics = (0, _analytics2.useSmartLinkAnalytics)(url !== null && url !== void 0 ? url : '', dispatchAnalytics, id);
83
85
  var logError = (0, _react.useCallback)(function (error, info) {
84
86
  var componentStack = info.componentStack; // NB: APIErrors are thrown in response to Object Resolver Service.
85
87
  // In these cases, control is handed back to the Editor. We do not
@@ -93,15 +95,10 @@ function CardWithURLRenderer(props) {
93
95
  else {
94
96
  var errorInfo = {
95
97
  componentStack: componentStack
96
- }; // Start and fail the smart-link-rendered experience. If it has already
97
- // been started nothing happens.
98
-
99
- (0, _ufoExperiences.startUfoExperience)('smart-link-rendered', id);
100
- (0, _ufoExperiences.failUfoExperience)('smart-link-rendered', id);
101
- (0, _ufoExperiences.failUfoExperience)('smart-link-authenticated', id);
102
- dispatchAnalytics((0, _analytics.uiRenderFailedEvent)(appearance, error, errorInfo));
98
+ };
99
+ analytics.ui.renderFailedEvent(appearance, id, error, errorInfo);
103
100
  }
104
- }, [appearance, dispatchAnalytics, id]);
101
+ }, [analytics.ui, appearance, id]);
105
102
 
106
103
  if (!url) {
107
104
  throw new Error('@atlaskit/smart-card: url property is missing.');
@@ -117,6 +114,7 @@ function CardWithURLRenderer(props) {
117
114
  dispatchAnalytics: dispatchAnalytics,
118
115
  container: container,
119
116
  onResolve: onResolve,
117
+ onError: onError,
120
118
  testId: testId,
121
119
  showActions: showActions,
122
120
  inheritDimensions: inheritDimensions,
@@ -54,6 +54,7 @@ var EmbedCard = /*#__PURE__*/_react.default.forwardRef(function (_ref, iframeRef
54
54
  isFrameVisible = _ref.isFrameVisible,
55
55
  platform = _ref.platform,
56
56
  onResolve = _ref.onResolve,
57
+ onError = _ref.onError,
57
58
  testId = _ref.testId,
58
59
  inheritDimensions = _ref.inheritDimensions;
59
60
  var data = details && details.data || (0, _jsonld.getEmptyJsonLd)();
@@ -113,6 +114,13 @@ var EmbedCard = /*#__PURE__*/_react.default.forwardRef(function (_ref, iframeRef
113
114
  }
114
115
 
115
116
  case 'unauthorized':
117
+ if (onError) {
118
+ onError({
119
+ url: url,
120
+ status: status
121
+ });
122
+ }
123
+
116
124
  var unauthorisedViewProps = (0, _embed.extractEmbedProps)(data, meta, platform);
117
125
  return /*#__PURE__*/_react.default.createElement(_UnauthorisedView.EmbedCardUnauthorisedView, (0, _extends2.default)({}, unauthorisedViewProps, {
118
126
  isSelected: isSelected,
@@ -122,6 +130,13 @@ var EmbedCard = /*#__PURE__*/_react.default.forwardRef(function (_ref, iframeRef
122
130
  }));
123
131
 
124
132
  case 'forbidden':
133
+ if (onError) {
134
+ onError({
135
+ url: url,
136
+ status: status
137
+ });
138
+ }
139
+
125
140
  var forbiddenViewProps = (0, _embed.extractEmbedProps)(data, meta, platform);
126
141
  var cardMetadata = (_details$meta = details === null || details === void 0 ? void 0 : details.meta) !== null && _details$meta !== void 0 ? _details$meta : (0, _jsonld.getUnauthorizedJsonLd)().meta;
127
142
  var requestAccessContext = (0, _context.extractRequestAccessContext)({
@@ -138,6 +153,13 @@ var EmbedCard = /*#__PURE__*/_react.default.forwardRef(function (_ref, iframeRef
138
153
  }));
139
154
 
140
155
  case 'not_found':
156
+ if (onError) {
157
+ onError({
158
+ url: url,
159
+ status: status
160
+ });
161
+ }
162
+
141
163
  var notFoundViewProps = (0, _embed.extractEmbedProps)(data, meta, platform);
142
164
  return /*#__PURE__*/_react.default.createElement(_NotFoundView.EmbedCardNotFoundView, (0, _extends2.default)({}, notFoundViewProps, {
143
165
  isSelected: isSelected,
@@ -147,6 +169,13 @@ var EmbedCard = /*#__PURE__*/_react.default.forwardRef(function (_ref, iframeRef
147
169
 
148
170
  case 'fallback':
149
171
  case 'errored':
172
+ if (onError) {
173
+ onError({
174
+ url: url,
175
+ status: status
176
+ });
177
+ }
178
+
150
179
  return /*#__PURE__*/_react.default.createElement(_ErroredView.EmbedCardErroredView, {
151
180
  onRetry: handleErrorRetry,
152
181
  inheritDimensions: inheritDimensions,
@@ -24,11 +24,11 @@ var _templateObject, _templateObject2, _templateObject3, _templateObject4, _temp
24
24
  var getAlignmentStyles = function getAlignmentStyles(align) {
25
25
  switch (align) {
26
26
  case _constants.SmartLinkAlignment.Right:
27
- return (0, _core.css)(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2.default)(["\n justify-content: flex-end;\n text-align: right;\n "])));
27
+ return (0, _core.css)(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2.default)(["\n -webkit-box-align: end;\n -ms-flex-align: end;\n justify-content: flex-end;\n text-align: right;\n "])));
28
28
 
29
29
  case _constants.SmartLinkAlignment.Left:
30
30
  default:
31
- return (0, _core.css)(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2.default)(["\n justify-content: flex-start;\n text-align: left;\n "])));
31
+ return (0, _core.css)(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2.default)(["\n -webkit-box-align: start;\n -ms-flex-align: start;\n justify-content: flex-start;\n text-align: left;\n "])));
32
32
  }
33
33
  };
34
34
 
@@ -13,6 +13,8 @@ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")
13
13
 
14
14
  var _react = _interopRequireWildcard(require("react"));
15
15
 
16
+ var _constants = require("../../constants");
17
+
16
18
  var _container = _interopRequireDefault(require("./components/container"));
17
19
 
18
20
  var _flexibleUiContext = require("../../state/flexible-ui-context");
@@ -33,24 +35,49 @@ var FlexibleCard = function FlexibleCard(_ref) {
33
35
  var cardState = _ref.cardState,
34
36
  children = _ref.children,
35
37
  onAuthorize = _ref.onAuthorize,
38
+ onError = _ref.onError,
39
+ onResolve = _ref.onResolve,
36
40
  renderers = _ref.renderers,
37
41
  ui = _ref.ui,
38
42
  url = _ref.url,
39
43
  onClick = _ref.onClick,
40
- testId = _ref.testId,
41
- onResolve = _ref.onResolve;
44
+ testId = _ref.testId;
42
45
  var cardType = cardState.status,
43
46
  details = cardState.details;
44
47
  var status = cardType;
45
48
  var context = (0, _utils.getContextByStatus)(url, status, details, renderers);
46
49
  var retry = (0, _utils.getRetryOptions)(url, status, details, onAuthorize);
50
+
51
+ var _ref2 = context || {},
52
+ title = _ref2.title;
53
+
47
54
  (0, _react.useEffect)(function () {
48
- if (status === 'resolved' && onResolve) {
49
- onResolve({
50
- url: url
51
- });
55
+ switch (status) {
56
+ case _constants.SmartLinkStatus.Resolved:
57
+ if (onResolve) {
58
+ onResolve({
59
+ title: title,
60
+ url: url
61
+ });
62
+ }
63
+
64
+ break;
65
+
66
+ case _constants.SmartLinkStatus.Errored:
67
+ case _constants.SmartLinkStatus.Fallback:
68
+ case _constants.SmartLinkStatus.Forbidden:
69
+ case _constants.SmartLinkStatus.NotFound:
70
+ case _constants.SmartLinkStatus.Unauthorized:
71
+ if (onError) {
72
+ onError({
73
+ status: status,
74
+ url: url
75
+ });
76
+ }
77
+
78
+ break;
52
79
  }
53
- }, [onResolve, status, url]);
80
+ }, [onError, onResolve, status, title, url]);
54
81
  return /*#__PURE__*/_react.default.createElement(_flexibleUiContext.FlexibleUiContext.Provider, {
55
82
  value: context
56
83
  }, /*#__PURE__*/_react.default.createElement(_container.default, (0, _extends2.default)({