@atlaskit/smart-card 23.8.2 → 23.9.1

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 (62) hide show
  1. package/CHANGELOG.md +12 -0
  2. package/dist/cjs/utils/flexible.js +8 -2
  3. package/dist/cjs/utils/mocks.js +38 -0
  4. package/dist/cjs/version.json +1 -1
  5. package/dist/cjs/view/BlockCard/actions/flexible/AuthorizeAction.js +2 -1
  6. package/dist/cjs/view/BlockCard/actions/flexible/ForbiddenAction.js +2 -1
  7. package/dist/cjs/view/BlockCard/actions/flexible/RetryAction.js +2 -1
  8. package/dist/cjs/view/BlockCard/index.js +24 -0
  9. package/dist/cjs/view/BlockCard/views/flexible/FlexibleResolvedView.js +3 -1
  10. package/dist/cjs/view/CardWithUrl/component.js +1 -6
  11. package/dist/cjs/view/FlexibleCard/components/actions/action/action-button/index.js +1 -6
  12. package/dist/cjs/view/FlexibleCard/components/blocks/action-group/index.js +2 -7
  13. package/dist/cjs/view/FlexibleCard/components/blocks/footer-block/index.js +17 -2
  14. package/dist/cjs/view/FlexibleCard/components/container/index.js +34 -3
  15. package/dist/cjs/view/FlexibleCard/index.js +3 -1
  16. package/dist/cjs/view/HoverCard/components/HoverCardComponent.js +15 -3
  17. package/dist/cjs/view/InlineCard/index.js +7 -0
  18. package/dist/es2019/utils/flexible.js +3 -2
  19. package/dist/es2019/utils/mocks.js +38 -0
  20. package/dist/es2019/version.json +1 -1
  21. package/dist/es2019/view/BlockCard/actions/flexible/AuthorizeAction.js +2 -1
  22. package/dist/es2019/view/BlockCard/actions/flexible/ForbiddenAction.js +2 -1
  23. package/dist/es2019/view/BlockCard/actions/flexible/RetryAction.js +2 -1
  24. package/dist/es2019/view/BlockCard/index.js +24 -0
  25. package/dist/es2019/view/BlockCard/views/flexible/FlexibleResolvedView.js +3 -1
  26. package/dist/es2019/view/CardWithUrl/component.js +1 -6
  27. package/dist/es2019/view/FlexibleCard/components/actions/action/action-button/index.js +1 -6
  28. package/dist/es2019/view/FlexibleCard/components/blocks/action-group/index.js +2 -5
  29. package/dist/es2019/view/FlexibleCard/components/blocks/footer-block/index.js +11 -2
  30. package/dist/es2019/view/FlexibleCard/components/container/index.js +25 -5
  31. package/dist/es2019/view/FlexibleCard/index.js +3 -1
  32. package/dist/es2019/view/HoverCard/components/HoverCardComponent.js +13 -3
  33. package/dist/es2019/view/InlineCard/index.js +6 -0
  34. package/dist/esm/utils/flexible.js +4 -1
  35. package/dist/esm/utils/mocks.js +38 -0
  36. package/dist/esm/version.json +1 -1
  37. package/dist/esm/view/BlockCard/actions/flexible/AuthorizeAction.js +2 -1
  38. package/dist/esm/view/BlockCard/actions/flexible/ForbiddenAction.js +2 -1
  39. package/dist/esm/view/BlockCard/actions/flexible/RetryAction.js +2 -1
  40. package/dist/esm/view/BlockCard/index.js +24 -0
  41. package/dist/esm/view/BlockCard/views/flexible/FlexibleResolvedView.js +3 -1
  42. package/dist/esm/view/CardWithUrl/component.js +1 -6
  43. package/dist/esm/view/FlexibleCard/components/actions/action/action-button/index.js +1 -6
  44. package/dist/esm/view/FlexibleCard/components/blocks/action-group/index.js +2 -7
  45. package/dist/esm/view/FlexibleCard/components/blocks/footer-block/index.js +11 -2
  46. package/dist/esm/view/FlexibleCard/components/container/index.js +34 -5
  47. package/dist/esm/view/FlexibleCard/index.js +3 -1
  48. package/dist/esm/view/HoverCard/components/HoverCardComponent.js +15 -3
  49. package/dist/esm/view/InlineCard/index.js +6 -0
  50. package/dist/types/utils/flexible.d.ts +1 -0
  51. package/dist/types/utils/mocks.d.ts +2 -0
  52. package/dist/types/view/BlockCard/views/flexible/FlexibleResolvedView.d.ts +1 -1
  53. package/dist/types/view/Card/index.d.ts +1 -1
  54. package/dist/types/view/FlexibleCard/components/blocks/action-group/types.d.ts +1 -1
  55. package/dist/types/view/FlexibleCard/components/blocks/footer-block/types.d.ts +5 -0
  56. package/dist/types/view/FlexibleCard/components/container/types.d.ts +5 -0
  57. package/dist/types/view/FlexibleCard/types.d.ts +5 -0
  58. package/dist/types/view/HoverCard/index.d.ts +1 -1
  59. package/dist/types/view/HoverCard/types.d.ts +24 -0
  60. package/package.json +1 -1
  61. package/report.api.md +1 -0
  62. package/tmp/api-report-tmp.d.ts +1 -0
package/CHANGELOG.md CHANGED
@@ -1,5 +1,17 @@
1
1
  # @atlaskit/smart-card
2
2
 
3
+ ## 23.9.1
4
+
5
+ ### Patch Changes
6
+
7
+ - [`484be3ed430`](https://bitbucket.org/atlassian/atlassian-frontend/commits/484be3ed430) - This adds onResolve back to Flexible Block Card
8
+
9
+ ## 23.9.0
10
+
11
+ ### Minor Changes
12
+
13
+ - [`5c7c532de88`](https://bitbucket.org/atlassian/atlassian-frontend/commits/5c7c532de88) - [ux] Add showHoverPreview as a ui parameter to allow hover cards on flex ui links.
14
+
3
15
  ## 23.8.2
4
16
 
5
17
  ### Patch Changes
@@ -7,7 +7,7 @@ var _typeof = require("@babel/runtime/helpers/typeof");
7
7
  Object.defineProperty(exports, "__esModule", {
8
8
  value: true
9
9
  });
10
- exports.isFlexibleUiTitleBlock = exports.isFlexibleUiPreviewBlock = exports.isFlexibleUiElement = exports.isFlexibleUiCard = exports.isFlexibleUiBlock = void 0;
10
+ exports.isFlexibleUiTitleBlock = exports.isFlexibleUiPreviewBlock = exports.isFlexibleUiFooterBlock = exports.isFlexibleUiElement = exports.isFlexibleUiCard = exports.isFlexibleUiBlock = void 0;
11
11
 
12
12
  var _react = _interopRequireDefault(require("react"));
13
13
 
@@ -57,4 +57,10 @@ var isFlexibleUiPreviewBlock = function isFlexibleUiPreviewBlock(node) {
57
57
  return /*#__PURE__*/_react.default.isValidElement(node) && node.type === Blocks.PreviewBlock;
58
58
  };
59
59
 
60
- exports.isFlexibleUiPreviewBlock = isFlexibleUiPreviewBlock;
60
+ exports.isFlexibleUiPreviewBlock = isFlexibleUiPreviewBlock;
61
+
62
+ var isFlexibleUiFooterBlock = function isFlexibleUiFooterBlock(node) {
63
+ return /*#__PURE__*/_react.default.isValidElement(node) && node.type === Blocks.FooterBlock;
64
+ };
65
+
66
+ exports.isFlexibleUiFooterBlock = isFlexibleUiFooterBlock;
@@ -139,6 +139,25 @@ var mocks = {
139
139
  url: 'https://some.url'
140
140
  }
141
141
  },
142
+ forbiddenWithNoAuth: {
143
+ meta: {
144
+ visibility: 'restricted',
145
+ access: 'forbidden',
146
+ auth: [],
147
+ definitionId: 'd1',
148
+ key: 'object-provider'
149
+ },
150
+ data: {
151
+ '@context': {
152
+ '@vocab': 'https://www.w3.org/ns/activitystreams#',
153
+ atlassian: 'https://schema.atlassian.com/ns/vocabulary#',
154
+ schema: 'http://schema.org/'
155
+ },
156
+ '@type': 'Object',
157
+ name: 'I love cheese',
158
+ url: 'https://some.url'
159
+ }
160
+ },
142
161
  unauthorized: {
143
162
  meta: {
144
163
  visibility: 'restricted',
@@ -162,6 +181,25 @@ var mocks = {
162
181
  url: 'https://some.url'
163
182
  }
164
183
  },
184
+ unauthorizedWithNoAuth: {
185
+ meta: {
186
+ visibility: 'restricted',
187
+ access: 'unauthorized',
188
+ auth: [],
189
+ definitionId: 'd1',
190
+ key: 'object-provider'
191
+ },
192
+ data: {
193
+ '@context': {
194
+ '@vocab': 'https://www.w3.org/ns/activitystreams#',
195
+ atlassian: 'https://schema.atlassian.com/ns/vocabulary#',
196
+ schema: 'http://schema.org/'
197
+ },
198
+ '@type': 'Object',
199
+ name: 'I love cheese',
200
+ url: 'https://some.url'
201
+ }
202
+ },
165
203
  actionSuccess: {
166
204
  meta: {
167
205
  visibility: 'public',
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/smart-card",
3
- "version": "23.8.2",
3
+ "version": "23.9.1",
4
4
  "sideEffects": false
5
5
  }
@@ -32,7 +32,8 @@ var AuthorizeAction = function AuthorizeAction(onAuthorize, providerName) {
32
32
  context: providerName
33
33
  }
34
34
  })) : /*#__PURE__*/_react.default.createElement(_reactIntlNext.FormattedMessage, _messages.messages.connect_link_account_card),
35
- onClick: onAuthorize
35
+ onClick: onAuthorize,
36
+ testId: 'smart-action-connect-account'
36
37
  };
37
38
  };
38
39
 
@@ -33,7 +33,8 @@ var ForbiddenAction = function ForbiddenAction(onClick, content, context) {
33
33
  context: context
34
34
  }
35
35
  })),
36
- onClick: onClick
36
+ onClick: onClick,
37
+ testId: 'smart-action-connect-other-account'
37
38
  };
38
39
  };
39
40
 
@@ -25,7 +25,8 @@ var RetryAction = function RetryAction(onRetry) {
25
25
  return {
26
26
  name: _constants.ActionName.CustomAction,
27
27
  onClick: onRetry,
28
- content: /*#__PURE__*/_react.default.createElement(_reactIntlNext.FormattedMessage, _messages.messages.try_again)
28
+ content: /*#__PURE__*/_react.default.createElement(_reactIntlNext.FormattedMessage, _messages.messages.try_again),
29
+ testId: 'smart-action-try-again'
29
30
  };
30
31
  };
31
32
 
@@ -153,6 +153,7 @@ var BlockCard = function BlockCard(_ref) {
153
153
  url: url,
154
154
  testId: testId,
155
155
  onError: onError,
156
+ onResolve: onResolve,
156
157
  renderers: renderers,
157
158
  ui: ui,
158
159
  analytics: analytics,
@@ -162,6 +163,12 @@ var BlockCard = function BlockCard(_ref) {
162
163
  switch (status) {
163
164
  case 'pending':
164
165
  case 'resolving':
166
+ return (0, _react.jsx)("div", {
167
+ css: flexibleBlockCardElevationStyle
168
+ }, (0, _react.jsx)(_FlexibleResolvedView.default, (0, _extends2.default)({}, flexibleProps, {
169
+ testId: 'smart-block-resolving-view'
170
+ })));
171
+
165
172
  case 'resolved':
166
173
  return (0, _react.jsx)("div", {
167
174
  css: flexibleBlockCardElevationStyle
@@ -190,6 +197,23 @@ var BlockCard = function BlockCard(_ref) {
190
197
 
191
198
  case 'fallback':
192
199
  case 'errored':
200
+ default:
201
+ if (onError) {
202
+ onError({
203
+ url: url,
204
+ status: status
205
+ });
206
+ }
207
+
208
+ if (authFlow && authFlow === 'disabled') {
209
+ return (0, _react.jsx)(_LinkView.CardLinkView, {
210
+ link: url,
211
+ isSelected: isSelected,
212
+ onClick: handleFrameClick,
213
+ testId: "".concat(testId, "-").concat(status)
214
+ });
215
+ }
216
+
193
217
  return (0, _react.jsx)("div", {
194
218
  css: flexibleBlockCardElevationStyle
195
219
  }, (0, _react.jsx)(_FlexibleErroredView.default, (0, _extends2.default)({}, flexibleProps, {
@@ -37,6 +37,7 @@ var FlexibleResolvedView = function FlexibleResolvedView(_ref) {
37
37
  cardState = _ref.cardState,
38
38
  onClick = _ref.onClick,
39
39
  onError = _ref.onError,
40
+ onResolve = _ref.onResolve,
40
41
  _ref$testId = _ref.testId,
41
42
  testId = _ref$testId === void 0 ? 'smart-block-resolved-view' : _ref$testId,
42
43
  ui = _ref.ui,
@@ -63,6 +64,7 @@ var FlexibleResolvedView = function FlexibleResolvedView(_ref) {
63
64
  cardState: cardState,
64
65
  onClick: onClick,
65
66
  onError: onError,
67
+ onResolve: onResolve,
66
68
  testId: testId,
67
69
  ui: ui,
68
70
  url: url
@@ -98,7 +100,7 @@ var FlexibleResolvedView = function FlexibleResolvedView(_ref) {
98
100
  name: _constants.ElementName.DueOn
99
101
  }],
100
102
  maxLines: 1
101
- }), /*#__PURE__*/_react.default.createElement(_blocks.MetadataBlock, null), /*#__PURE__*/_react.default.createElement(_blocks.SnippetBlock, null), !isPreviewBlockErrored ? /*#__PURE__*/_react.default.createElement(_blocks.PreviewBlock, {
103
+ }), /*#__PURE__*/_react.default.createElement(_blocks.SnippetBlock, null), !isPreviewBlockErrored ? /*#__PURE__*/_react.default.createElement(_blocks.PreviewBlock, {
102
104
  placement: _constants.MediaPlacement.Right,
103
105
  ignoreContainerPadding: true,
104
106
  onError: function onError() {
@@ -79,12 +79,6 @@ function CardWithUrlContent(_ref) {
79
79
  var isFlexibleUi = (0, _react.useMemo)(function () {
80
80
  return (0, _flexible.isFlexibleUiCard)(children);
81
81
  }, [children]);
82
- var showHoverPreviewFlag = (0, _linkProvider.useFeatureFlag)('showHoverPreview');
83
-
84
- if (showHoverPreview === undefined && showHoverPreviewFlag !== undefined) {
85
- showHoverPreview = Boolean(showHoverPreviewFlag);
86
- }
87
-
88
82
  var showAuthTooltipValue = (0, _linkProvider.useFeatureFlag)('showAuthTooltip');
89
83
  var showAuthTooltip = !!showAuthTooltipValue && showAuthTooltipValue === 'experiment';
90
84
  var enableFlexibleBlockCardFlag = Boolean((0, _linkProvider.useFeatureFlag)('enableFlexibleBlockCard')); // Setup UI handlers.
@@ -174,6 +168,7 @@ function CardWithUrlContent(_ref) {
174
168
  onClick: handleClickWrapper,
175
169
  renderers: renderers,
176
170
  ui: ui,
171
+ showHoverPreview: showHoverPreview,
177
172
  url: url,
178
173
  testId: testId,
179
174
  onResolve: onResolve,
@@ -61,14 +61,9 @@ var ActionButton = function ActionButton(_ref) {
61
61
  handler();
62
62
  };
63
63
  }, []);
64
- var onContainerClick = (0, _react.useCallback)(function (e) {
65
- // Stop button on click event from propagate into parent container.
66
- e.stopPropagation();
67
- }, []);
68
64
  return (0, _react2.jsx)("div", {
69
65
  css: [getButtonStyle(size, iconOnly), overrideCss],
70
- "data-testid": "".concat(testId, "-button-wrapper"),
71
- onClick: onContainerClick
66
+ "data-testid": "".concat(testId, "-button-wrapper")
72
67
  }, (0, _react2.jsx)(_tooltip.default, {
73
68
  content: tooltipMessage,
74
69
  hideTooltipOnClick: true,
@@ -68,12 +68,8 @@ var ActionGroup = function ActionGroup(_ref) {
68
68
  var _useState = (0, _react.useState)(false),
69
69
  _useState2 = (0, _slicedToArray2.default)(_useState, 2),
70
70
  isOpen = _useState2[0],
71
- setIsOpen = _useState2[1]; // Stop AK dropdown menu to propagate event on click.
71
+ setIsOpen = _useState2[1];
72
72
 
73
-
74
- var onClick = (0, _react.useCallback)(function (e) {
75
- return e.stopPropagation();
76
- }, []);
77
73
  var onOpenChange = (0, _react.useCallback)(function (attrs) {
78
74
  setIsOpen(attrs.isOpen);
79
75
 
@@ -106,8 +102,7 @@ var ActionGroup = function ActionGroup(_ref) {
106
102
  var buttonGroupElement = (0, _utils.renderActionItems)(buttonActions, size, appearance, false, onActionClick);
107
103
  return (0, _react2.jsx)("div", {
108
104
  css: styles,
109
- className: "actions-button-group",
110
- onClick: onClick
105
+ className: "actions-button-group"
111
106
  }, (0, _react2.jsx)(_buttonGroup.default, null, buttonGroupElement, dropdownItemActions.length > 0 && dropdownMenuElement && dropdownMenuElement.length > 0 ? (0, _react2.jsx)(_dropdownMenu.default, {
112
107
  isOpen: isOpen,
113
108
  onOpenChange: onOpenChange,
@@ -2,6 +2,8 @@
2
2
 
3
3
  var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
4
 
5
+ var _typeof = require("@babel/runtime/helpers/typeof");
6
+
5
7
  Object.defineProperty(exports, "__esModule", {
6
8
  value: true
7
9
  });
@@ -11,7 +13,7 @@ var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")
11
13
 
12
14
  var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
13
15
 
14
- var _react = _interopRequireDefault(require("react"));
16
+ var _react = _interopRequireWildcard(require("react"));
15
17
 
16
18
  var _react2 = require("@emotion/react");
17
19
 
@@ -27,6 +29,10 @@ var _actionGroup = _interopRequireDefault(require("../action-group"));
27
29
 
28
30
  var _templateObject;
29
31
 
32
+ 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); }
33
+
34
+ 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; }
35
+
30
36
  var getActionGroupStyles = function getActionGroupStyles(size) {
31
37
  if (size === _constants.SmartLinkSize.XLarge) {
32
38
  // The biggest height of the action button exceeds the max line-height
@@ -50,7 +56,15 @@ var FooterBlock = function FooterBlock(props) {
50
56
  _props$size = props.size,
51
57
  size = _props$size === void 0 ? _constants.SmartLinkSize.Medium : _props$size,
52
58
  _props$testId = props.testId,
53
- testId = _props$testId === void 0 ? 'smart-footer-block' : _props$testId;
59
+ testId = _props$testId === void 0 ? 'smart-footer-block' : _props$testId,
60
+ onActionMenuOpenChange = props.onActionMenuOpenChange;
61
+ var onDropdownOpenChange = (0, _react.useCallback)(function (isOpen) {
62
+ if (onActionMenuOpenChange) {
63
+ onActionMenuOpenChange({
64
+ isOpen: isOpen
65
+ });
66
+ }
67
+ }, [onActionMenuOpenChange]);
54
68
 
55
69
  if (status !== _constants.SmartLinkStatus.Resolved) {
56
70
  return null;
@@ -67,6 +81,7 @@ var FooterBlock = function FooterBlock(props) {
67
81
  overrideCss: getActionGroupStyles(size),
68
82
  width: _constants.SmartLinkWidth.Flexible
69
83
  }, /*#__PURE__*/_react.default.createElement(_actionGroup.default, {
84
+ onDropdownOpenChange: onDropdownOpenChange,
70
85
  items: actions,
71
86
  appearance: "default"
72
87
  })) : null);
@@ -9,6 +9,8 @@ Object.defineProperty(exports, "__esModule", {
9
9
  });
10
10
  exports.getContainerStyles = exports.default = void 0;
11
11
 
12
+ var _slicedToArray2 = _interopRequireDefault(require("@babel/runtime/helpers/slicedToArray"));
13
+
12
14
  var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
13
15
 
14
16
  var _react = _interopRequireWildcard(require("react"));
@@ -25,6 +27,8 @@ var _flexibleUiContext = require("../../../../state/flexible-ui-context");
25
27
 
26
28
  var _layeredLink = _interopRequireDefault(require("./layered-link"));
27
29
 
30
+ var _HoverCard = require("../../../HoverCard");
31
+
28
32
  var _utils = require("../../../../state/flexible-ui-context/utils");
29
33
 
30
34
  var _templateObject, _templateObject2, _templateObject3, _templateObject4;
@@ -110,7 +114,7 @@ var getContainerStyles = function getContainerStyles(size, hideBackground, hideE
110
114
 
111
115
  exports.getContainerStyles = getContainerStyles;
112
116
 
113
- var renderChildren = function renderChildren(children, containerSize, containerTheme, status, retry, onClick) {
117
+ var renderChildren = function renderChildren(children, containerSize, containerTheme, status, retry, onClick, onActionMenuOpenChange) {
114
118
  return _react.default.Children.map(children, function (child) {
115
119
  if ( /*#__PURE__*/_react.default.isValidElement(child) && (0, _flexible.isFlexibleUiBlock)(child)) {
116
120
  var blockSize = child.props.size;
@@ -124,6 +128,12 @@ var renderChildren = function renderChildren(children, containerSize, containerT
124
128
  status: status,
125
129
  theme: containerTheme
126
130
  });
131
+ } else if (onActionMenuOpenChange && (0, _flexible.isFlexibleUiFooterBlock)(child)) {
132
+ return /*#__PURE__*/_react.default.cloneElement(child, {
133
+ size: size,
134
+ status: status,
135
+ onActionMenuOpenChange: onActionMenuOpenChange
136
+ });
127
137
  }
128
138
 
129
139
  return /*#__PURE__*/_react.default.cloneElement(child, {
@@ -182,6 +192,8 @@ var Container = function Container(_ref3) {
182
192
  hideElevation = _ref3$hideElevation === void 0 ? false : _ref3$hideElevation,
183
193
  _ref3$hidePadding = _ref3.hidePadding,
184
194
  hidePadding = _ref3$hidePadding === void 0 ? false : _ref3$hidePadding,
195
+ _ref3$showHoverPrevie = _ref3.showHoverPreview,
196
+ showHoverPreview = _ref3$showHoverPrevie === void 0 ? false : _ref3$showHoverPrevie,
185
197
  onClick = _ref3.onClick,
186
198
  retry = _ref3.retry,
187
199
  _ref3$size = _ref3.size,
@@ -193,11 +205,30 @@ var Container = function Container(_ref3) {
193
205
  theme = _ref3$theme === void 0 ? _constants.SmartLinkTheme.Link : _ref3$theme;
194
206
  var context = (0, _react.useContext)(_flexibleUiContext.FlexibleUiContext);
195
207
  var childrenOptions = getChildrenOptions(children, context);
196
- return (0, _react2.jsx)("div", {
208
+
209
+ var _useState = (0, _react.useState)(true),
210
+ _useState2 = (0, _slicedToArray2.default)(_useState, 2),
211
+ hoverCardCanOpen = _useState2[0],
212
+ setHoverCardCanOpen = _useState2[1];
213
+
214
+ var onActionMenuOpenChange = (0, _react.useCallback)(function (options) {
215
+ return setHoverCardCanOpen(!options.isOpen);
216
+ }, []);
217
+ var containerContent = (0, _react2.jsx)("div", {
197
218
  css: getContainerStyles(size, hideBackground, hideElevation, hidePadding, clickableContainer, childrenOptions),
198
219
  "data-smart-link-container": true,
199
220
  "data-testid": testId
200
- }, clickableContainer ? getLayeredLink(testId, context, children, onClick) : null, renderChildren(children, size, theme, status, retry, onClick));
221
+ }, clickableContainer ? getLayeredLink(testId, context, children, onClick) : null, renderChildren(children, size, theme, status, retry, onClick, showHoverPreview ? onActionMenuOpenChange : undefined));
222
+
223
+ if (showHoverPreview && context !== null && context !== void 0 && context.url) {
224
+ return (0, _react2.jsx)(_HoverCard.HoverCard, {
225
+ url: context === null || context === void 0 ? void 0 : context.url,
226
+ canOpen: hoverCardCanOpen,
227
+ closeOnChildClick: true
228
+ }, containerContent);
229
+ }
230
+
231
+ return containerContent;
201
232
  };
202
233
 
203
234
  var _default = Container;
@@ -42,7 +42,8 @@ var FlexibleCard = function FlexibleCard(_ref) {
42
42
  url = _ref.url,
43
43
  onClick = _ref.onClick,
44
44
  testId = _ref.testId,
45
- analytics = _ref.analytics;
45
+ analytics = _ref.analytics,
46
+ showHoverPreview = _ref.showHoverPreview;
46
47
  var cardType = cardState.status,
47
48
  details = cardState.details;
48
49
  var status = cardType;
@@ -86,6 +87,7 @@ var FlexibleCard = function FlexibleCard(_ref) {
86
87
  }, /*#__PURE__*/_react.default.createElement(_container.default, (0, _extends2.default)({
87
88
  testId: testId
88
89
  }, ui, {
90
+ showHoverPreview: showHoverPreview,
89
91
  onClick: onClick,
90
92
  retry: retry,
91
93
  status: status
@@ -40,7 +40,11 @@ var HoverCardComponent = function HoverCardComponent(_ref) {
40
40
  var children = _ref.children,
41
41
  url = _ref.url,
42
42
  analyticsHandler = _ref.analyticsHandler,
43
- analytics = _ref.analytics;
43
+ analytics = _ref.analytics,
44
+ _ref$canOpen = _ref.canOpen,
45
+ canOpen = _ref$canOpen === void 0 ? true : _ref$canOpen,
46
+ _ref$closeOnChildClic = _ref.closeOnChildClick,
47
+ closeOnChildClick = _ref$closeOnChildClic === void 0 ? false : _ref$closeOnChildClic;
44
48
  var delay = 300;
45
49
 
46
50
  var _React$useState = _react2.default.useState(false),
@@ -134,9 +138,16 @@ var HoverCardComponent = function HoverCardComponent(_ref) {
134
138
  }
135
139
  }, [hideCard]); // Stop hover preview content to propagate event to parent.
136
140
 
141
+ var onChildClick = (0, _react2.useCallback)(function (e) {
142
+ e.stopPropagation();
143
+
144
+ if (closeOnChildClick) {
145
+ hideCard();
146
+ }
147
+ }, [closeOnChildClick, hideCard]);
137
148
  return (0, _react.jsx)(_popup.default, {
138
149
  testId: "hover-card",
139
- isOpen: isOpen,
150
+ isOpen: isOpen && canOpen,
140
151
  onClose: hideCard,
141
152
  placement: "bottom-start",
142
153
  offset: popupOffset.current,
@@ -161,7 +172,8 @@ var HoverCardComponent = function HoverCardComponent(_ref) {
161
172
  }, (0, _react.jsx)("span", (0, _extends2.default)({}, triggerProps, {
162
173
  onMouseEnter: initShowCard,
163
174
  onMouseLeave: initHideCard,
164
- onMouseMove: setMousePosition
175
+ onMouseMove: setMousePosition,
176
+ onClick: onChildClick
165
177
  }), children));
166
178
  },
167
179
  zIndex: 511 // Temporary fix for Confluence inline comment on editor mod has z-index of 500, Jira issue view has z-index of 510
@@ -61,6 +61,8 @@ var _UnauthorisedView = require("./UnauthorisedView");
61
61
 
62
62
  var _extractors = require("@atlaskit/linking-common/extractors");
63
63
 
64
+ var _linkProvider = require("@atlaskit/link-provider");
65
+
64
66
  var InlineCard = function InlineCard(_ref) {
65
67
  var _details$meta;
66
68
 
@@ -81,6 +83,11 @@ var InlineCard = function InlineCard(_ref) {
81
83
  details = cardState.details;
82
84
  var cardDetails = details && details.data || (0, _jsonld.getEmptyJsonLd)();
83
85
  var testIdWithStatus = testId ? "".concat(testId, "-").concat(status, "-view") : undefined;
86
+ var showHoverPreviewFlag = (0, _linkProvider.useFeatureFlag)('showHoverPreview');
87
+
88
+ if (showHoverPreview === undefined && showHoverPreviewFlag !== undefined) {
89
+ showHoverPreview = Boolean(showHoverPreviewFlag);
90
+ }
84
91
 
85
92
  switch (status) {
86
93
  case 'pending':
@@ -1,6 +1,6 @@
1
1
  import React from 'react';
2
2
  import * as Blocks from '../view/FlexibleCard/components/blocks';
3
- import { PreviewBlock, TitleBlock } from '../view/FlexibleCard/components/blocks';
3
+ import { PreviewBlock, TitleBlock, FooterBlock } from '../view/FlexibleCard/components/blocks';
4
4
  import * as Elements from '../view/FlexibleCard/components/elements';
5
5
  export const isFlexibleUiCard = children => {
6
6
  if (children && React.Children.toArray(children).some(child => isFlexibleUiTitleBlock(child))) {
@@ -12,4 +12,5 @@ export const isFlexibleUiCard = children => {
12
12
  export const isFlexibleUiBlock = node => /*#__PURE__*/React.isValidElement(node) && Object.values(Blocks).some(type => type === node.type);
13
13
  export const isFlexibleUiElement = node => /*#__PURE__*/React.isValidElement(node) && Object.values(Elements).some(type => type === node.type);
14
14
  export const isFlexibleUiTitleBlock = node => /*#__PURE__*/React.isValidElement(node) && node.type === TitleBlock;
15
- export const isFlexibleUiPreviewBlock = node => /*#__PURE__*/React.isValidElement(node) && node.type === PreviewBlock;
15
+ export const isFlexibleUiPreviewBlock = node => /*#__PURE__*/React.isValidElement(node) && node.type === PreviewBlock;
16
+ export const isFlexibleUiFooterBlock = node => /*#__PURE__*/React.isValidElement(node) && node.type === FooterBlock;
@@ -107,6 +107,25 @@ export const mocks = {
107
107
  url: 'https://some.url'
108
108
  }
109
109
  },
110
+ forbiddenWithNoAuth: {
111
+ meta: {
112
+ visibility: 'restricted',
113
+ access: 'forbidden',
114
+ auth: [],
115
+ definitionId: 'd1',
116
+ key: 'object-provider'
117
+ },
118
+ data: {
119
+ '@context': {
120
+ '@vocab': 'https://www.w3.org/ns/activitystreams#',
121
+ atlassian: 'https://schema.atlassian.com/ns/vocabulary#',
122
+ schema: 'http://schema.org/'
123
+ },
124
+ '@type': 'Object',
125
+ name: 'I love cheese',
126
+ url: 'https://some.url'
127
+ }
128
+ },
110
129
  unauthorized: {
111
130
  meta: {
112
131
  visibility: 'restricted',
@@ -130,6 +149,25 @@ export const mocks = {
130
149
  url: 'https://some.url'
131
150
  }
132
151
  },
152
+ unauthorizedWithNoAuth: {
153
+ meta: {
154
+ visibility: 'restricted',
155
+ access: 'unauthorized',
156
+ auth: [],
157
+ definitionId: 'd1',
158
+ key: 'object-provider'
159
+ },
160
+ data: {
161
+ '@context': {
162
+ '@vocab': 'https://www.w3.org/ns/activitystreams#',
163
+ atlassian: 'https://schema.atlassian.com/ns/vocabulary#',
164
+ schema: 'http://schema.org/'
165
+ },
166
+ '@type': 'Object',
167
+ name: 'I love cheese',
168
+ url: 'https://some.url'
169
+ }
170
+ },
133
171
  actionSuccess: {
134
172
  meta: {
135
173
  visibility: 'public',
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/smart-card",
3
- "version": "23.8.2",
3
+ "version": "23.9.1",
4
4
  "sideEffects": false
5
5
  }
@@ -18,5 +18,6 @@ export const AuthorizeAction = (onAuthorize, providerName) => ({
18
18
  context: providerName
19
19
  }
20
20
  })) : /*#__PURE__*/React.createElement(FormattedMessage, messages.connect_link_account_card),
21
- onClick: onAuthorize
21
+ onClick: onAuthorize,
22
+ testId: 'smart-action-connect-account'
22
23
  });
@@ -19,5 +19,6 @@ export const ForbiddenAction = (onClick, content, context) => ({
19
19
  context
20
20
  }
21
21
  })),
22
- onClick: onClick
22
+ onClick,
23
+ testId: 'smart-action-connect-other-account'
23
24
  });
@@ -12,5 +12,6 @@ import { messages } from '../../../../messages';
12
12
  export const RetryAction = onRetry => ({
13
13
  name: ActionName.CustomAction,
14
14
  onClick: onRetry,
15
- content: /*#__PURE__*/React.createElement(FormattedMessage, messages.try_again)
15
+ content: /*#__PURE__*/React.createElement(FormattedMessage, messages.try_again),
16
+ testId: 'smart-action-try-again'
16
17
  });
@@ -73,6 +73,7 @@ export const BlockCard = ({
73
73
  url,
74
74
  testId,
75
75
  onError,
76
+ onResolve,
76
77
  renderers,
77
78
  ui,
78
79
  analytics,
@@ -82,6 +83,12 @@ export const BlockCard = ({
82
83
  switch (status) {
83
84
  case 'pending':
84
85
  case 'resolving':
86
+ return jsx("div", {
87
+ css: flexibleBlockCardElevationStyle
88
+ }, jsx(FlexibleResolvedView, _extends({}, flexibleProps, {
89
+ testId: 'smart-block-resolving-view'
90
+ })));
91
+
85
92
  case 'resolved':
86
93
  return jsx("div", {
87
94
  css: flexibleBlockCardElevationStyle
@@ -110,6 +117,23 @@ export const BlockCard = ({
110
117
 
111
118
  case 'fallback':
112
119
  case 'errored':
120
+ default:
121
+ if (onError) {
122
+ onError({
123
+ url,
124
+ status
125
+ });
126
+ }
127
+
128
+ if (authFlow && authFlow === 'disabled') {
129
+ return jsx(CardLinkView, {
130
+ link: url,
131
+ isSelected: isSelected,
132
+ onClick: handleFrameClick,
133
+ testId: `${testId}-${status}`
134
+ });
135
+ }
136
+
113
137
  return jsx("div", {
114
138
  css: flexibleBlockCardElevationStyle
115
139
  }, jsx(FlexibleErroredView, _extends({}, flexibleProps, {
@@ -15,6 +15,7 @@ const FlexibleResolvedView = ({
15
15
  cardState,
16
16
  onClick,
17
17
  onError,
18
+ onResolve,
18
19
  testId = 'smart-block-resolved-view',
19
20
  ui,
20
21
  url,
@@ -30,6 +31,7 @@ const FlexibleResolvedView = ({
30
31
  cardState: cardState,
31
32
  onClick: onClick,
32
33
  onError: onError,
34
+ onResolve: onResolve,
33
35
  testId: testId,
34
36
  ui: ui,
35
37
  url: url
@@ -65,7 +67,7 @@ const FlexibleResolvedView = ({
65
67
  name: ElementName.DueOn
66
68
  }],
67
69
  maxLines: 1
68
- }), /*#__PURE__*/React.createElement(MetadataBlock, null), /*#__PURE__*/React.createElement(SnippetBlock, null), !isPreviewBlockErrored ? /*#__PURE__*/React.createElement(PreviewBlock, {
70
+ }), /*#__PURE__*/React.createElement(SnippetBlock, null), !isPreviewBlockErrored ? /*#__PURE__*/React.createElement(PreviewBlock, {
69
71
  placement: MediaPlacement.Right,
70
72
  ignoreContainerPadding: true,
71
73
  onError: () => {