@atlaskit/smart-card 26.50.9 → 26.50.11

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 (71) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/dist/cjs/constants.js +2 -1
  3. package/dist/cjs/messages.js +5 -0
  4. package/dist/cjs/state/hooks/use-ai-summary/ai-summary-service/index.js +16 -5
  5. package/dist/cjs/state/hooks/use-ai-summary/ai-summary-service/types.js +7 -1
  6. package/dist/cjs/state/hooks/use-ai-summary/ai-summary-service/utils.js +47 -41
  7. package/dist/cjs/utils/analytics/analytics.js +1 -1
  8. package/dist/cjs/view/EmbedCard/components/styled.js +1 -1
  9. package/dist/cjs/view/FlexibleCard/components/blocks/action-group/index.js +1 -1
  10. package/dist/cjs/view/FlexibleCard/components/blocks/ai-summary-block/ai-event-error-viewed/index.js +6 -3
  11. package/dist/cjs/view/FlexibleCard/components/blocks/ai-summary-block/ai-state-indicator/ai-state-error.js +38 -12
  12. package/dist/cjs/view/FlexibleCard/components/blocks/ai-summary-block/ai-state-indicator/index.js +4 -2
  13. package/dist/cjs/view/FlexibleCard/components/blocks/ai-summary-block/resolved/index.js +6 -2
  14. package/dist/cjs/view/FlexibleCard/components/elements/lozenge/lozenge-action/lozenge-action-error/styled.js +1 -1
  15. package/dist/cjs/view/HoverCard/components/ContentContainer.js +1 -1
  16. package/dist/cjs/view/HoverCard/styled.js +23 -8
  17. package/dist/cjs/view/LinkUrl/index.js +1 -1
  18. package/dist/cjs/view/common/ai-prism/index.js +11 -4
  19. package/dist/es2019/constants.js +1 -0
  20. package/dist/es2019/messages.js +5 -0
  21. package/dist/es2019/state/hooks/use-ai-summary/ai-summary-service/index.js +8 -2
  22. package/dist/es2019/state/hooks/use-ai-summary/ai-summary-service/types.js +1 -0
  23. package/dist/es2019/state/hooks/use-ai-summary/ai-summary-service/utils.js +16 -12
  24. package/dist/es2019/utils/analytics/analytics.js +1 -1
  25. package/dist/es2019/view/EmbedCard/components/styled.js +1 -1
  26. package/dist/es2019/view/FlexibleCard/components/blocks/action-group/index.js +2 -1
  27. package/dist/es2019/view/FlexibleCard/components/blocks/ai-summary-block/ai-event-error-viewed/index.js +7 -3
  28. package/dist/es2019/view/FlexibleCard/components/blocks/ai-summary-block/ai-state-indicator/ai-state-error.js +35 -9
  29. package/dist/es2019/view/FlexibleCard/components/blocks/ai-summary-block/ai-state-indicator/index.js +4 -2
  30. package/dist/es2019/view/FlexibleCard/components/blocks/ai-summary-block/resolved/index.js +6 -2
  31. package/dist/es2019/view/FlexibleCard/components/elements/lozenge/lozenge-action/lozenge-action-error/styled.js +1 -1
  32. package/dist/es2019/view/HoverCard/components/ContentContainer.js +1 -1
  33. package/dist/es2019/view/HoverCard/styled.js +19 -20
  34. package/dist/es2019/view/LinkUrl/index.js +1 -1
  35. package/dist/es2019/view/common/ai-prism/index.js +12 -5
  36. package/dist/esm/constants.js +1 -0
  37. package/dist/esm/messages.js +5 -0
  38. package/dist/esm/state/hooks/use-ai-summary/ai-summary-service/index.js +16 -5
  39. package/dist/esm/state/hooks/use-ai-summary/ai-summary-service/types.js +1 -0
  40. package/dist/esm/state/hooks/use-ai-summary/ai-summary-service/utils.js +47 -41
  41. package/dist/esm/utils/analytics/analytics.js +1 -1
  42. package/dist/esm/view/EmbedCard/components/styled.js +1 -1
  43. package/dist/esm/view/FlexibleCard/components/blocks/action-group/index.js +2 -1
  44. package/dist/esm/view/FlexibleCard/components/blocks/ai-summary-block/ai-event-error-viewed/index.js +6 -3
  45. package/dist/esm/view/FlexibleCard/components/blocks/ai-summary-block/ai-state-indicator/ai-state-error.js +39 -13
  46. package/dist/esm/view/FlexibleCard/components/blocks/ai-summary-block/ai-state-indicator/index.js +4 -2
  47. package/dist/esm/view/FlexibleCard/components/blocks/ai-summary-block/resolved/index.js +6 -2
  48. package/dist/esm/view/FlexibleCard/components/elements/lozenge/lozenge-action/lozenge-action-error/styled.js +1 -1
  49. package/dist/esm/view/HoverCard/components/ContentContainer.js +1 -1
  50. package/dist/esm/view/HoverCard/styled.js +23 -8
  51. package/dist/esm/view/LinkUrl/index.js +1 -1
  52. package/dist/esm/view/common/ai-prism/index.js +12 -5
  53. package/dist/types/common/analytics/generated/analytics.types.d.ts +3 -1
  54. package/dist/types/constants.d.ts +1 -0
  55. package/dist/types/messages.d.ts +1 -1
  56. package/dist/types/state/hooks/use-ai-summary/ai-summary-service/index.d.ts +2 -1
  57. package/dist/types/state/hooks/use-ai-summary/ai-summary-service/types.d.ts +4 -1
  58. package/dist/types/state/hooks/use-ai-summary/index.d.ts +2 -5
  59. package/dist/types/view/FlexibleCard/components/blocks/ai-summary-block/ai-event-error-viewed/index.d.ts +3 -1
  60. package/dist/types/view/FlexibleCard/components/blocks/ai-summary-block/ai-state-indicator/types.d.ts +2 -1
  61. package/dist/types/view/HoverCard/styled.d.ts +1 -1
  62. package/dist/types-ts4.5/common/analytics/generated/analytics.types.d.ts +3 -1
  63. package/dist/types-ts4.5/constants.d.ts +1 -0
  64. package/dist/types-ts4.5/messages.d.ts +1 -1
  65. package/dist/types-ts4.5/state/hooks/use-ai-summary/ai-summary-service/index.d.ts +2 -1
  66. package/dist/types-ts4.5/state/hooks/use-ai-summary/ai-summary-service/types.d.ts +14 -1
  67. package/dist/types-ts4.5/state/hooks/use-ai-summary/index.d.ts +2 -5
  68. package/dist/types-ts4.5/view/FlexibleCard/components/blocks/ai-summary-block/ai-event-error-viewed/index.d.ts +3 -1
  69. package/dist/types-ts4.5/view/FlexibleCard/components/blocks/ai-summary-block/ai-state-indicator/types.d.ts +2 -1
  70. package/dist/types-ts4.5/view/HoverCard/styled.d.ts +1 -1
  71. package/package.json +4 -4
package/CHANGELOG.md CHANGED
@@ -1,5 +1,18 @@
1
1
  # @atlaskit/smart-card
2
2
 
3
+ ## 26.50.11
4
+
5
+ ### Patch Changes
6
+
7
+ - [#84238](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/84238) [`76b053da8795`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/76b053da8795) - [ux] Add fade in/out transition to AI prism border
8
+ - [#85227](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/85227) [`ceaf5b7ee00b`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/ceaf5b7ee00b) - [ux] Add new error message to hover card ai summary based on response from api
9
+
10
+ ## 26.50.10
11
+
12
+ ### Patch Changes
13
+
14
+ - [#83297](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/pull-requests/83297) [`6b1707c169e0`](https://stash.atlassian.com/projects/CONFCLOUD/repos/confluence-frontend/commits/6b1707c169e0) - The internal composition of this component has changed. There is no expected change in behaviour.
15
+
3
16
  ## 26.50.9
4
17
 
5
18
  ### Patch Changes
@@ -3,11 +3,12 @@
3
3
  Object.defineProperty(exports, "__esModule", {
4
4
  value: true
5
5
  });
6
- exports.SmartLinkWidth = exports.SmartLinkTheme = exports.SmartLinkStatus = exports.SmartLinkSize = exports.SmartLinkPosition = exports.SmartLinkInternalTheme = exports.SmartLinkDirection = exports.SmartLinkAlignment = exports.MediaType = exports.MediaPlacement = exports.IconType = exports.ElementName = exports.CardDisplay = exports.CONTENT_URL_SECURITY_AND_PERMISSIONS = exports.CONTENT_URL_AI_TROUBLESHOOTING = exports.CONTENT_URL_AI = exports.CONTENT_URL_3P_ACCOUNT_AUTH = exports.ActionName = void 0;
6
+ exports.SmartLinkWidth = exports.SmartLinkTheme = exports.SmartLinkStatus = exports.SmartLinkSize = exports.SmartLinkPosition = exports.SmartLinkInternalTheme = exports.SmartLinkDirection = exports.SmartLinkAlignment = exports.MediaType = exports.MediaPlacement = exports.IconType = exports.ElementName = exports.CardDisplay = exports.CONTENT_URL_SECURITY_AND_PERMISSIONS = exports.CONTENT_URL_AI_TROUBLESHOOTING = exports.CONTENT_URL_AI = exports.CONTENT_URL_ACCEPTABLE_USE_POLICY = exports.CONTENT_URL_3P_ACCOUNT_AUTH = exports.ActionName = void 0;
7
7
  var CONTENT_URL_SECURITY_AND_PERMISSIONS = exports.CONTENT_URL_SECURITY_AND_PERMISSIONS = 'https://support.atlassian.com/confluence-cloud/docs/insert-links-and-anchors/#Smart-links';
8
8
  var CONTENT_URL_3P_ACCOUNT_AUTH = exports.CONTENT_URL_3P_ACCOUNT_AUTH = 'https://support.atlassian.com/confluence-cloud/docs/what-data-is-sent-and-received-when-pasting-a-smart-link/';
9
9
  var CONTENT_URL_AI = exports.CONTENT_URL_AI = 'https://www.atlassian.com/trust/atlassian-intelligence';
10
10
  var CONTENT_URL_AI_TROUBLESHOOTING = exports.CONTENT_URL_AI_TROUBLESHOOTING = 'https://support.atlassian.com/organization-administration/docs/troubleshooting-for-atlassian-intelligence/';
11
+ var CONTENT_URL_ACCEPTABLE_USE_POLICY = exports.CONTENT_URL_ACCEPTABLE_USE_POLICY = 'https://www.atlassian.com/legal/acceptable-use-policy';
11
12
 
12
13
  /**
13
14
  * The alignment of Flexible UI component.
@@ -46,6 +46,11 @@ var messages = exports.messages = (0, _reactIntlNext.defineMessages)({
46
46
  defaultMessage: "Atlassian Intelligence can't provide a response right now. Read more <a>in our support documentation</a>.",
47
47
  description: 'Shown when AI summary is summarising the link resource content.'
48
48
  },
49
+ ai_summary_error_acceptable_use_violation: {
50
+ id: 'fabric.linking.ai_summary_error_acceptable_use_violation',
51
+ defaultMessage: "We cannot show the results of this summary as it goes against <a>Atlassian's Acceptable Use Policy</a>.",
52
+ description: 'Shown when AI summary is summarising the link resource content and the content violates atlassians acceptable use policy.'
53
+ },
49
54
  assigned_to: {
50
55
  id: 'fabric.linking.assigned_to',
51
56
  defaultMessage: 'Assigned to {context}',
@@ -11,6 +11,7 @@ var _classCallCheck2 = _interopRequireDefault(require("@babel/runtime/helpers/cl
11
11
  var _createClass2 = _interopRequireDefault(require("@babel/runtime/helpers/createClass"));
12
12
  var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
13
13
  var _uuid = _interopRequireDefault(require("uuid"));
14
+ var _types = require("./types");
14
15
  var _utils = require("./utils");
15
16
  function _createForOfIteratorHelper(o, allowArrayLike) { var it = typeof Symbol !== "undefined" && o[Symbol.iterator] || o["@@iterator"]; if (!it) { if (Array.isArray(o) || (it = _unsupportedIterableToArray(o)) || allowArrayLike && o && typeof o.length === "number") { if (it) o = it; var i = 0; var F = function F() {}; return { s: F, n: function n() { if (i >= o.length) return { done: true }; return { done: false, value: o[i++] }; }, e: function e(_e) { throw _e; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var normalCompletion = true, didErr = false, err; return { s: function s() { it = it.call(o); }, n: function n() { var step = it.next(); normalCompletion = step.done; return step; }, e: function e(_e2) { didErr = true; err = _e2; }, f: function f() { try { if (!normalCompletion && it.return != null) it.return(); } finally { if (didErr) throw err; } } }; }
16
17
  function _unsupportedIterableToArray(o, minLen) { if (!o) return; if (typeof o === "string") return _arrayLikeToArray(o, minLen); var n = Object.prototype.toString.call(o).slice(8, -1); if (n === "Object" && o.constructor) n = o.constructor.name; if (n === "Map" || n === "Set") return Array.from(o); if (n === "Arguments" || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(n)) return _arrayLikeToArray(o, minLen); }
@@ -111,6 +112,7 @@ var AISummaryService = exports.AISummaryService = /*#__PURE__*/function () {
111
112
  subscriber,
112
113
  _chunk$message,
113
114
  _this$onError,
115
+ message,
114
116
  _iterator4,
115
117
  _step4,
116
118
  _subscriber2,
@@ -219,17 +221,19 @@ var AISummaryService = exports.AISummaryService = /*#__PURE__*/function () {
219
221
  status: 'done',
220
222
  content: bufferContent
221
223
  };
222
- _context2.next = 50;
224
+ _context2.next = 51;
223
225
  break;
224
226
  case 46:
225
227
  _context2.prev = 46;
226
228
  _context2.t1 = _context2["catch"](5);
227
- (_this$onError = this.onError) === null || _this$onError === void 0 || _this$onError.call(this, id, 'generic');
229
+ message = _context2.t1 instanceof Error && this.isExpectedError(_context2.t1.message) ? _context2.t1.message : 'UNEXPECTED';
230
+ (_this$onError = this.onError) === null || _this$onError === void 0 || _this$onError.call(this, id, message);
228
231
  this.state = {
229
232
  status: 'error',
230
- content: ''
233
+ content: '',
234
+ error: message
231
235
  };
232
- case 50:
236
+ case 51:
233
237
  _iterator4 = _createForOfIteratorHelper(this.subscribedStateSetters);
234
238
  try {
235
239
  for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
@@ -241,7 +245,7 @@ var AISummaryService = exports.AISummaryService = /*#__PURE__*/function () {
241
245
  } finally {
242
246
  _iterator4.f();
243
247
  }
244
- case 52:
248
+ case 53:
245
249
  case "end":
246
250
  return _context2.stop();
247
251
  }
@@ -252,6 +256,13 @@ var AISummaryService = exports.AISummaryService = /*#__PURE__*/function () {
252
256
  }
253
257
  return summariseUrl;
254
258
  }()
259
+ }, {
260
+ key: "isExpectedError",
261
+ value: function isExpectedError(value) {
262
+ return typeof value === 'string' && _types.errorMessages.some(function (a) {
263
+ return a === value;
264
+ });
265
+ }
255
266
  }, {
256
267
  key: "subscribe",
257
268
  value: function subscribe(stateSetter) {
@@ -1 +1,7 @@
1
- "use strict";
1
+ "use strict";
2
+
3
+ Object.defineProperty(exports, "__esModule", {
4
+ value: true
5
+ });
6
+ exports.errorMessages = void 0;
7
+ var errorMessages = exports.errorMessages = ['NETWORK_ERROR', 'NO_ANSWER', 'RATE_LIMIT', 'NO_AGENT', 'PLUGIN_ERRORED', 'OPENAI_RATE_LIMIT_USER_ABUSE', 'ACCEPTABLE_USE_VIOLATIONS', 'AI_DISABLED', 'UNEXPECTED'];
@@ -17,27 +17,27 @@ function readStream(_x) {
17
17
  }
18
18
  function _readStream() {
19
19
  _readStream = (0, _wrapAsyncGenerator2.default)( /*#__PURE__*/_regenerator.default.mark(function _callee(response) {
20
- var reader, doneStreaming, chunkBuffer, _yield$_awaitAsyncGen, value, done, processedChunks, _iterator, _step, chunk, error, _error;
20
+ var reader, doneStreaming, chunkBuffer, chunkTypeErrorMessage, _yield$_awaitAsyncGen, value, done, processedChunks, _iterator, _step, chunk, jsonChunk, error;
21
21
  return _regenerator.default.wrap(function _callee$(_context) {
22
22
  while (1) switch (_context.prev = _context.next) {
23
23
  case 0:
24
24
  reader = getBufferReader(response);
25
25
  doneStreaming = false;
26
26
  chunkBuffer = '';
27
- case 3:
28
- _context.prev = 3;
29
- _context.next = 6;
27
+ chunkTypeErrorMessage = 'jsonChunkType error';
28
+ case 4:
29
+ _context.prev = 4;
30
+ _context.next = 7;
30
31
  return (0, _awaitAsyncGenerator2.default)(reader.read());
31
- case 6:
32
+ case 7:
32
33
  _yield$_awaitAsyncGen = _context.sent;
33
34
  value = _yield$_awaitAsyncGen.value;
34
35
  done = _yield$_awaitAsyncGen.done;
35
36
  doneStreaming = done;
36
37
  if (!value) {
37
- _context.next = 43;
38
+ _context.next = 42;
38
39
  break;
39
40
  }
40
- _context.prev = 11;
41
41
  processedChunks = "".concat(chunkBuffer).concat(value).split('\n'); // assumes that all JSON chunks are separated by a new-line;
42
42
  chunkBuffer = '';
43
43
  _iterator = _createForOfIteratorHelper(processedChunks);
@@ -45,61 +45,67 @@ function _readStream() {
45
45
  _iterator.s();
46
46
  case 17:
47
47
  if ((_step = _iterator.n()).done) {
48
- _context.next = 29;
48
+ _context.next = 34;
49
49
  break;
50
50
  }
51
51
  chunk = _step.value;
52
52
  _context.prev = 19;
53
- _context.next = 22;
54
- return JSON.parse(chunk);
55
- case 22:
56
- _context.next = 27;
53
+ jsonChunk = JSON.parse(chunk);
54
+ if (!(jsonChunk.type === 'ERROR')) {
55
+ _context.next = 23;
56
+ break;
57
+ }
58
+ throw new Error(chunkTypeErrorMessage);
59
+ case 23:
60
+ _context.next = 25;
61
+ return jsonChunk;
62
+ case 25:
63
+ _context.next = 32;
57
64
  break;
58
- case 24:
59
- _context.prev = 24;
65
+ case 27:
66
+ _context.prev = 27;
60
67
  _context.t0 = _context["catch"](19);
68
+ if (!(_context.t0 instanceof Error && _context.t0.message === chunkTypeErrorMessage)) {
69
+ _context.next = 31;
70
+ break;
71
+ }
72
+ throw _context.t0;
73
+ case 31:
61
74
  // the chunk may be incomplete, so we'll save it for the next iteration.
62
75
  chunkBuffer = chunk;
63
- case 27:
76
+ case 32:
64
77
  _context.next = 17;
65
78
  break;
66
- case 29:
67
- _context.next = 34;
79
+ case 34:
80
+ _context.next = 39;
68
81
  break;
69
- case 31:
70
- _context.prev = 31;
82
+ case 36:
83
+ _context.prev = 36;
71
84
  _context.t1 = _context["catch"](15);
72
85
  _iterator.e(_context.t1);
73
- case 34:
74
- _context.prev = 34;
75
- _iterator.f();
76
- return _context.finish(34);
77
- case 37:
78
- _context.next = 43;
79
- break;
80
86
  case 39:
81
87
  _context.prev = 39;
82
- _context.t2 = _context["catch"](11);
83
- error = new Error("Error Processing Stream Data: ".concat(value));
84
- throw error;
85
- case 43:
88
+ _iterator.f();
89
+ return _context.finish(39);
90
+ case 42:
86
91
  _context.next = 52;
87
92
  break;
88
- case 45:
89
- _context.prev = 45;
90
- _context.t3 = _context["catch"](3);
91
- if (!(_context.t3 instanceof DOMException && _context.t3.name === 'AbortError')) {
92
- _context.next = 51;
93
+ case 44:
94
+ _context.prev = 44;
95
+ _context.t2 = _context["catch"](4);
96
+ if (!(_context.t2 instanceof DOMException && _context.t2.name === 'AbortError')) {
97
+ _context.next = 50;
93
98
  break;
94
99
  }
95
100
  doneStreaming = true;
96
101
  _context.next = 52;
97
102
  break;
98
- case 51:
99
- throw _context.t3;
103
+ case 50:
104
+ reader.cancel();
105
+ throw _context.t2;
100
106
  case 52:
101
107
  if (!doneStreaming) {
102
- _context.next = 3;
108
+ _context.next = 4;
103
109
  break;
104
110
  }
105
111
  case 53:
@@ -107,13 +113,13 @@ function _readStream() {
107
113
  _context.next = 56;
108
114
  break;
109
115
  }
110
- _error = new Error("Not all the data was processed: ".concat(chunkBuffer));
111
- throw _error;
116
+ error = new Error("Not all the data was processed: ".concat(chunkBuffer));
117
+ throw error;
112
118
  case 56:
113
119
  case "end":
114
120
  return _context.stop();
115
121
  }
116
- }, _callee, null, [[3, 45], [11, 39], [15, 31, 34, 37], [19, 24]]);
122
+ }, _callee, null, [[4, 44], [15, 36, 39, 42], [19, 27]]);
117
123
  }));
118
124
  return _readStream.apply(this, arguments);
119
125
  }
@@ -22,7 +22,7 @@ var ANALYTICS_CHANNEL = exports.ANALYTICS_CHANNEL = 'media';
22
22
  var context = exports.context = {
23
23
  componentName: 'smart-cards',
24
24
  packageName: "@atlaskit/smart-card",
25
- packageVersion: "26.50.9"
25
+ packageVersion: "26.50.11"
26
26
  };
27
27
  var TrackQuickActionType = exports.TrackQuickActionType = /*#__PURE__*/function (TrackQuickActionType) {
28
28
  TrackQuickActionType["StatusUpdate"] = "StatusUpdate";
@@ -86,7 +86,7 @@ var Wrapper = exports.Wrapper = _styled.default.div(function (props) {
86
86
  }, {
87
87
  // We are keeping this margin as a hardcoded variable as it is not a standard token size and needs
88
88
  // to be thoroughly checked with a designer so that we do not miss an unintended visual change
89
- // eslint-disable-next-line @atlaskit/design-system/ensure-design-token-usage/preview
89
+ // eslint-disable-next-line @atlaskit/design-system/use-tokens-space
90
90
  marginTop: '10px'
91
91
  });
92
92
  var embedHeaderHeight = exports.embedHeaderHeight = 32;
@@ -31,7 +31,7 @@ var styles = (0, _react2.css)({
31
31
  '> div': {
32
32
  alignItems: 'center',
33
33
  'button:focus-visible': {
34
- outlineOffset: '-2px'
34
+ outlineOffset: "var(--ds-space-negative-025, -2px)"
35
35
  }
36
36
  }
37
37
  });
@@ -6,12 +6,15 @@ Object.defineProperty(exports, "__esModule", {
6
6
  exports.default = void 0;
7
7
  var _react = require("react");
8
8
  var _useAnalyticsEvents2 = require("../../../../../../common/analytics/generated/use-analytics-events");
9
- var AIEventErrorViewed = function AIEventErrorViewed() {
9
+ var AIEventErrorViewed = function AIEventErrorViewed(_ref) {
10
+ var reason = _ref.reason;
10
11
  var _useAnalyticsEvents = (0, _useAnalyticsEvents2.useAnalyticsEvents)(),
11
12
  fireEvent = _useAnalyticsEvents.fireEvent;
12
13
  (0, _react.useEffect)(function () {
13
- fireEvent('ui.error.viewed.aiSummary', {});
14
- }, [fireEvent]);
14
+ fireEvent('ui.error.viewed.aiSummary', {
15
+ reason: reason
16
+ });
17
+ }, [fireEvent, reason]);
15
18
  return null;
16
19
  };
17
20
  var _default = exports.default = AIEventErrorViewed;
@@ -21,9 +21,40 @@ var contentStyles = (0, _primitives.xcss)({
21
21
  fontWeight: '400',
22
22
  lineHeight: '14px'
23
23
  });
24
- var AIStateError = function AIStateError(_ref) {
25
- var appearance = _ref.appearance,
26
- testId = _ref.testId;
24
+ var MessageWithAnchor = function MessageWithAnchor(_ref) {
25
+ var message = _ref.message,
26
+ url = _ref.url;
27
+ return /*#__PURE__*/_react.default.createElement(_reactIntlNext.FormattedMessage, (0, _extends2.default)({}, message, {
28
+ values: {
29
+ a: function a(chunks) {
30
+ return /*#__PURE__*/_react.default.createElement(_aiLearnMoreAnchor.default, {
31
+ href: url
32
+ }, chunks);
33
+ }
34
+ }
35
+ }));
36
+ };
37
+ var getErrorMesssageProps = function getErrorMesssageProps(error) {
38
+ switch (error) {
39
+ case 'ACCEPTABLE_USE_VIOLATIONS':
40
+ return {
41
+ message: _messages.messages.ai_summary_error_acceptable_use_violation,
42
+ url: _constants.CONTENT_URL_ACCEPTABLE_USE_POLICY
43
+ };
44
+ default:
45
+ return {
46
+ message: _messages.messages.ai_summary_error_generic,
47
+ url: _constants.CONTENT_URL_AI_TROUBLESHOOTING
48
+ };
49
+ }
50
+ };
51
+ var AIStateError = function AIStateError(_ref2) {
52
+ var appearance = _ref2.appearance,
53
+ testId = _ref2.testId,
54
+ error = _ref2.error;
55
+ var _getErrorMesssageProp = getErrorMesssageProps(error),
56
+ message = _getErrorMesssageProp.message,
57
+ url = _getErrorMesssageProp.url;
27
58
  switch (appearance) {
28
59
  case 'icon-only':
29
60
  return null;
@@ -38,15 +69,10 @@ var AIStateError = function AIStateError(_ref) {
38
69
  content: /*#__PURE__*/_react.default.createElement(_primitives.Box, {
39
70
  testId: "".concat(testId, "-error-message"),
40
71
  xcss: contentStyles
41
- }, /*#__PURE__*/_react.default.createElement(_reactIntlNext.FormattedMessage, (0, _extends2.default)({}, _messages.messages.ai_summary_error_generic, {
42
- values: {
43
- a: function a(chunks) {
44
- return /*#__PURE__*/_react.default.createElement(_aiLearnMoreAnchor.default, {
45
- href: _constants.CONTENT_URL_AI_TROUBLESHOOTING
46
- }, chunks);
47
- }
48
- }
49
- }))),
72
+ }, /*#__PURE__*/_react.default.createElement(MessageWithAnchor, {
73
+ message: message,
74
+ url: url
75
+ })),
50
76
  testId: "".concat(testId, "-error")
51
77
  });
52
78
  }
@@ -17,12 +17,14 @@ var AIStateIndicator = function AIStateIndicator(_ref) {
17
17
  _ref$appearance = _ref.appearance,
18
18
  appearance = _ref$appearance === void 0 ? 'default' : _ref$appearance,
19
19
  _ref$testId = _ref.testId,
20
- testId = _ref$testId === void 0 ? 'ai-state-indicator' : _ref$testId;
20
+ testId = _ref$testId === void 0 ? 'ai-state-indicator' : _ref$testId,
21
+ error = _ref.error;
21
22
  switch (state) {
22
23
  case 'error':
23
24
  return (0, _react.jsx)(_aiStateError.default, {
24
25
  appearance: appearance,
25
- testId: testId
26
+ testId: testId,
27
+ error: error
26
28
  });
27
29
  case 'loading':
28
30
  return (0, _react.jsx)(_aiStateLoading.default, {
@@ -48,7 +48,8 @@ var AISummaryBlockResolvedView = function AISummaryBlockResolvedView(props) {
48
48
  summariseUrl = _useAISummary.summariseUrl,
49
49
  _useAISummary$state = _useAISummary.state,
50
50
  content = _useAISummary$state.content,
51
- status = _useAISummary$state.status;
51
+ status = _useAISummary$state.status,
52
+ error = _useAISummary$state.error;
52
53
  var showAISummary = status === 'done' ||
53
54
  // We want to display the AI Summary component only when there is content available during the loading process.
54
55
  status === 'loading' && !!content;
@@ -119,7 +120,10 @@ var AISummaryBlockResolvedView = function AISummaryBlockResolvedView(props) {
119
120
  size: size
120
121
  }))), showAISummaryErrorMessage && /*#__PURE__*/_react.default.createElement(_primitives.Inline, {
121
122
  grow: "fill"
122
- }, /*#__PURE__*/_react.default.createElement(_aiEventErrorViewed.default, null), /*#__PURE__*/_react.default.createElement(_aiStateIndicator.default, {
123
+ }, /*#__PURE__*/_react.default.createElement(_aiEventErrorViewed.default, {
124
+ reason: error
125
+ }), /*#__PURE__*/_react.default.createElement(_aiStateIndicator.default, {
126
+ error: error,
123
127
  state: status,
124
128
  testId: testId
125
129
  })));
@@ -18,7 +18,7 @@ var dropdownItemGroupStyles = exports.dropdownItemGroupStyles = (0, _react.css)(
18
18
  });
19
19
  var sharedBlockStyles = (0, _react.css)({
20
20
  display: 'flex',
21
- gap: '0.5rem',
21
+ gap: "var(--ds-space-100, 0.5rem)",
22
22
  lineHeight: '1rem',
23
23
  minWidth: 0,
24
24
  overflow: 'hidden',
@@ -43,7 +43,7 @@ var ConnectedAIPrismContainer = function ConnectedAIPrismContainer(_ref) {
43
43
  }, [status]);
44
44
  var container = (0, _react.jsx)("div", (0, _extends2.default)({
45
45
  className: _HoverCardContent.hoverCardClassName,
46
- css: [_styled.HoverCardContainer, isAIEnabled && showPrism ? undefined : _styled.popupContainerStyles],
46
+ css: [_styled.HoverCardContainer, !isAIEnabled ? _styled.popupContainerStyles : undefined],
47
47
  "data-testid": testId
48
48
  }, props), children);
49
49
  return isAIEnabled ? (0, _react.jsx)(_aiPrism.default, {
@@ -11,7 +11,7 @@ var _index = require("../../index");
11
11
  var _constants = require("../../constants");
12
12
  var _constants2 = require("@atlaskit/theme/constants");
13
13
  var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
14
- var _templateObject, _templateObject2, _templateObject3, _templateObject4, _templateObject5, _templateObject6;
14
+ var _templateObject, _templateObject2;
15
15
  // Temporary fix for Confluence inline comment on editor mod has z-index of 500, Jira issue view has z-index of 510
16
16
  var HOVER_CARD_Z_INDEX = exports.HOVER_CARD_Z_INDEX = _constants2.layers.modal();
17
17
  var flexibleUiOptions = exports.flexibleUiOptions = {
@@ -22,18 +22,33 @@ var flexibleUiOptions = exports.flexibleUiOptions = {
22
22
  zIndex: HOVER_CARD_Z_INDEX + 1
23
23
  };
24
24
  var CARD_WIDTH_REM = exports.CARD_WIDTH_REM = 24;
25
- var NEW_CARD_WIDTH_REM = exports.NEW_CARD_WIDTH_REM = 28;
25
+ var NEW_CARD_WIDTH_REM = exports.NEW_CARD_WIDTH_REM = 25;
26
26
  // gap between mouse cursor and hover card
27
27
  var CARD_GAP_PX = exports.CARD_GAP_PX = 10;
28
28
  var blockGap = '0.5rem';
29
29
  var elementGap = '0.5rem';
30
- var separatorCss = exports.separatorCss = (0, _react.css)(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2.default)(["\n [data-separator] + [data-separator]:before {\n margin-right: ", ";\n }\n"])), elementGap);
31
- var HoverCardContainer = exports.HoverCardContainer = (0, _react.css)(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2.default)(["\n background: none;\n border-width: 0;\n box-sizing: border-box;\n width: ", "rem;\n\n .", " {\n display: none;\n }\n"])), (0, _platformFeatureFlags.getBooleanFF)('platform.linking-platform.smart-card.hover-card-ai-summaries') ? NEW_CARD_WIDTH_REM : CARD_WIDTH_REM, _index.loadingPlaceholderClassName);
32
- var titleBlockCss = exports.titleBlockCss = (0, _react.css)(_templateObject3 || (_templateObject3 = (0, _taggedTemplateLiteral2.default)(["\n gap: ", ";\n\n ", "\n\n // title and subtitle element group\n [data-smart-element-group] {\n // gap between title and subtitle\n gap: 0.06rem;\n display: flex;\n /* subtitle element group */\n > [data-smart-element-group] {\n > span {\n margin-right: ", ";\n }\n }\n }\n\n [data-smart-element='Title'] {\n font-weight: 600;\n }\n"])), blockGap, separatorCss, elementGap);
30
+ var separatorCss = exports.separatorCss = (0, _react.css)({
31
+ '[data-separator] + [data-separator]:before': {
32
+ marginRight: elementGap
33
+ }
34
+ });
35
+ var HoverCardContainer = exports.HoverCardContainer = (0, _react.css)(_templateObject || (_templateObject = (0, _taggedTemplateLiteral2.default)(["\n background: none;\n border-width: 0;\n box-sizing: border-box;\n width: ", "rem;\n\n .", " {\n display: none;\n }\n"])), (0, _platformFeatureFlags.getBooleanFF)('platform.linking-platform.smart-card.hover-card-ai-summaries') ? NEW_CARD_WIDTH_REM : CARD_WIDTH_REM, _index.loadingPlaceholderClassName);
36
+ var titleBlockCss = exports.titleBlockCss = (0, _react.css)(_templateObject2 || (_templateObject2 = (0, _taggedTemplateLiteral2.default)(["\n gap: ", ";\n\n ", "\n\n // title and subtitle element group\n [data-smart-element-group] {\n // gap between title and subtitle\n gap: 0.06rem;\n display: flex;\n /* subtitle element group */\n > [data-smart-element-group] {\n > span {\n margin-right: ", ";\n }\n }\n }\n\n [data-smart-element='Title'] {\n font-weight: 600;\n }\n"])), blockGap, separatorCss, elementGap);
33
37
  var getTransitionStyles = exports.getTransitionStyles = function getTransitionStyles(snippetHeight) {
34
- return (0, _react.css)(_templateObject4 || (_templateObject4 = (0, _taggedTemplateLiteral2.default)(["\n transition: height 300ms ease-in-out;\n height: ", "px;\n"])), snippetHeight);
38
+ return (0, _react.css)({
39
+ transition: 'height 300ms ease-in-out',
40
+ height: "".concat(snippetHeight, "px")
41
+ });
35
42
  };
36
- var popupContainerStyles = exports.popupContainerStyles = (0, _react.css)(_templateObject5 || (_templateObject5 = (0, _taggedTemplateLiteral2.default)(["\n border-radius: ", ";\n background-color: ", ";\n box-shadow: ", ";\n"])), "var(--ds-border-radius-200, 8px)", "var(--ds-surface-raised, white)", "var(--ds-shadow-overlay, 0px 8px 12px rgba(9, 30, 66, 0.15),0px 0px 1px rgba(9, 30, 66, 0.31))");
43
+ var popupContainerStyles = exports.popupContainerStyles = (0, _react.css)({
44
+ borderRadius: "var(--ds-border-radius-200, 8px)",
45
+ backgroundColor: "var(--ds-surface-raised, white)",
46
+ boxShadow: "var(--ds-shadow-overlay, 0px 8px 12px rgba(9, 30, 66, 0.15),0px 0px 1px rgba(9, 30, 66, 0.31))"
47
+ });
37
48
  var getPreviewBlockStyles = exports.getPreviewBlockStyles = function getPreviewBlockStyles(previewHeight) {
38
- return (0, _react.css)(_templateObject6 || (_templateObject6 = (0, _taggedTemplateLiteral2.default)(["\n ", "\n border-top-left-radius: ", ";\n border-top-right-radius: ", ";\n margin-bottom: ", ";\n"])), previewHeight ? "height: ".concat(previewHeight, "px;") : '', "var(--ds-border-radius-200, 8px)", "var(--ds-border-radius-200, 8px)", blockGap);
49
+ return (0, _react.css)(previewHeight ? "height: ".concat(previewHeight, "px;") : '', {
50
+ borderTopLeftRadius: "var(--ds-border-radius-200, 8px)",
51
+ borderTopRightRadius: "var(--ds-border-radius-200, 8px)",
52
+ marginBottom: blockGap
53
+ });
39
54
  };
@@ -17,7 +17,7 @@ var _excluded = ["href", "children", "checkSafety", "onClick", "testId"],
17
17
  _excluded2 = ["isLinkSafe", "showSafetyWarningModal"];
18
18
  var PACKAGE_DATA = {
19
19
  packageName: "@atlaskit/smart-card",
20
- packageVersion: "26.50.9",
20
+ packageVersion: "26.50.11",
21
21
  componentName: 'linkUrl'
22
22
  };
23
23
  var Link = (0, _click.withLinkClickedEvent)('a');
@@ -9,11 +9,17 @@ var _react = require("@emotion/react");
9
9
  var _tokens = require("@atlaskit/tokens");
10
10
  var _constants = require("./constants");
11
11
  var _aiGlowingBorder = _interopRequireDefault(require("./ai-glowing-border"));
12
+ var _styled = require("../../HoverCard/styled");
12
13
  /** @jsx jsx */
13
14
 
14
15
  var contentStyles = (0, _react.css)({
15
- backgroundColor: "var(--ds-surface-raised, white)",
16
- borderRadius: _constants.INNER_BORDER_RADIUS
16
+ transition: 'box-shadow 0.5s ease'
17
+ });
18
+ var contentStylesPrismVisible = (0, _react.css)({
19
+ // intentionally set opacity to 0 to remove the shadow with fade out animation
20
+ boxShadow:
21
+ // eslint-disable-next-line @atlaskit/design-system/ensure-design-token-usage
22
+ '0px 8px 12px rgba(9, 30, 66, 0),0px 0px 1px rgba(9, 30, 66, 0)'
17
23
  });
18
24
  var AIPrism = function AIPrism(_ref) {
19
25
  var _AI_BORDER_PALETTE$co;
@@ -30,7 +36,8 @@ var AIPrism = function AIPrism(_ref) {
30
36
  return (0, _react.jsx)(_aiGlowingBorder.default, {
31
37
  additionalCss: {
32
38
  animatedSvgContainer: (0, _react.css)({
33
- opacity: isVisible ? 1 : 0
39
+ opacity: isVisible ? 1 : 0,
40
+ transition: 'opacity 0.5s ease'
34
41
  })
35
42
  },
36
43
  palette: (_AI_BORDER_PALETTE$co = _constants.AI_BORDER_PALETTE[colorMode]) !== null && _AI_BORDER_PALETTE$co !== void 0 ? _AI_BORDER_PALETTE$co : _constants.AI_BORDER_PALETTE.light,
@@ -38,7 +45,7 @@ var AIPrism = function AIPrism(_ref) {
38
45
  isMoving: isMoving,
39
46
  testId: testId
40
47
  }, (0, _react.jsx)("div", {
41
- css: contentStyles
48
+ css: [_styled.popupContainerStyles, contentStyles, isVisible ? contentStylesPrismVisible : undefined]
42
49
  }, children));
43
50
  };
44
51
  var _default = exports.default = AIPrism;
@@ -2,6 +2,7 @@ export const CONTENT_URL_SECURITY_AND_PERMISSIONS = 'https://support.atlassian.c
2
2
  export const CONTENT_URL_3P_ACCOUNT_AUTH = 'https://support.atlassian.com/confluence-cloud/docs/what-data-is-sent-and-received-when-pasting-a-smart-link/';
3
3
  export const CONTENT_URL_AI = 'https://www.atlassian.com/trust/atlassian-intelligence';
4
4
  export const CONTENT_URL_AI_TROUBLESHOOTING = 'https://support.atlassian.com/organization-administration/docs/troubleshooting-for-atlassian-intelligence/';
5
+ export const CONTENT_URL_ACCEPTABLE_USE_POLICY = 'https://www.atlassian.com/legal/acceptable-use-policy';
5
6
 
6
7
  /**
7
8
  * The alignment of Flexible UI component.
@@ -40,6 +40,11 @@ export const messages = defineMessages({
40
40
  defaultMessage: "Atlassian Intelligence can't provide a response right now. Read more <a>in our support documentation</a>.",
41
41
  description: 'Shown when AI summary is summarising the link resource content.'
42
42
  },
43
+ ai_summary_error_acceptable_use_violation: {
44
+ id: 'fabric.linking.ai_summary_error_acceptable_use_violation',
45
+ defaultMessage: "We cannot show the results of this summary as it goes against <a>Atlassian's Acceptable Use Policy</a>.",
46
+ description: 'Shown when AI summary is summarising the link resource content and the content violates atlassians acceptable use policy.'
47
+ },
43
48
  assigned_to: {
44
49
  id: 'fabric.linking.assigned_to',
45
50
  defaultMessage: 'Assigned to {context}',
@@ -1,5 +1,6 @@
1
1
  import _defineProperty from "@babel/runtime/helpers/defineProperty";
2
2
  import uuid from 'uuid';
3
+ import { errorMessages } from './types';
3
4
  import { readStream, addPath } from './utils';
4
5
  export class AISummaryService {
5
6
  constructor(props) {
@@ -91,16 +92,21 @@ export class AISummaryService {
91
92
  };
92
93
  } catch (err) {
93
94
  var _this$onError;
94
- (_this$onError = this.onError) === null || _this$onError === void 0 ? void 0 : _this$onError.call(this, id, 'generic');
95
+ let message = err instanceof Error && this.isExpectedError(err.message) ? err.message : 'UNEXPECTED';
96
+ (_this$onError = this.onError) === null || _this$onError === void 0 ? void 0 : _this$onError.call(this, id, message);
95
97
  this.state = {
96
98
  status: 'error',
97
- content: ''
99
+ content: '',
100
+ error: message
98
101
  };
99
102
  }
100
103
  for (const subscriber of this.subscribedStateSetters) {
101
104
  subscriber(this.state);
102
105
  }
103
106
  }
107
+ isExpectedError(value) {
108
+ return typeof value === 'string' && errorMessages.some(a => a === value);
109
+ }
104
110
  subscribe(stateSetter) {
105
111
  this.subscribedStateSetters.add(stateSetter);
106
112
  return () => {
@@ -0,0 +1 @@
1
+ export const errorMessages = ['NETWORK_ERROR', 'NO_ANSWER', 'RATE_LIMIT', 'NO_AGENT', 'PLUGIN_ERRORED', 'OPENAI_RATE_LIMIT_USER_ABUSE', 'ACCEPTABLE_USE_VIOLATIONS', 'AI_DISABLED', 'UNEXPECTED'];