@atlaskit/smart-card 20.0.0 → 20.0.3

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.
package/CHANGELOG.md CHANGED
@@ -1,5 +1,25 @@
1
1
  # @atlaskit/smart-card
2
2
 
3
+ ## 20.0.3
4
+
5
+ ### Patch Changes
6
+
7
+ - [`4c2c26ca270`](https://bitbucket.org/atlassian/atlassian-frontend/commits/4c2c26ca270) - Fix regression in logos in BlockCard footers in preview mode cuased by the `appearance` prop.
8
+ - [`d4133fe0edc`](https://bitbucket.org/atlassian/atlassian-frontend/commits/d4133fe0edc) - Fix regression in logos in BlockCard footers caused by inheriting ProseMirror styles after a change in @atlaskit/logo internals.
9
+ - Updated dependencies
10
+
11
+ ## 20.0.2
12
+
13
+ ### Patch Changes
14
+
15
+ - [`12950ccea1b`](https://bitbucket.org/atlassian/atlassian-frontend/commits/12950ccea1b) - Hover Preview: Stop hover preview from propagating click event to parent element
16
+
17
+ ## 20.0.1
18
+
19
+ ### Patch Changes
20
+
21
+ - [`3e4f8e1490a`](https://bitbucket.org/atlassian/atlassian-frontend/commits/3e4f8e1490a) - Hover Preview: Fix Hover Preview shows on top of Preview modal
22
+
3
23
  ## 20.0.0
4
24
 
5
25
  ### Patch Changes
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/smart-card",
3
- "version": "20.0.0",
3
+ "version": "20.0.3",
4
4
  "sideEffects": false
5
5
  }
@@ -33,11 +33,12 @@ var Provider = function Provider(_ref) {
33
33
  return (0, _core.jsx)("div", {
34
34
  css: {
35
35
  display: 'flex',
36
- alignItems: 'center'
36
+ alignItems: 'center',
37
+ fontSize: (0, _utils.gs)(1.5),
38
+ whiteSpace: 'normal'
37
39
  }
38
40
  }, iconToRender, (0, _core.jsx)("span", {
39
41
  css: {
40
- fontSize: (0, _utils.gs)(1.5),
41
42
  color: (0, _tokens.token)('color.text.subtlest', _colors.N300),
42
43
  margin: 0,
43
44
  marginLeft: (0, _utils.gs)(0.5),
@@ -13,6 +13,8 @@ var _objectWithoutProperties2 = _interopRequireDefault(require("@babel/runtime/h
13
13
 
14
14
  var _taggedTemplateLiteral2 = _interopRequireDefault(require("@babel/runtime/helpers/taggedTemplateLiteral"));
15
15
 
16
+ var _react = require("react");
17
+
16
18
  var _reactIntlNext = require("react-intl-next");
17
19
 
18
20
  var _core = require("@emotion/core");
@@ -62,10 +64,15 @@ var ActionGroup = function ActionGroup(_ref) {
62
64
  testId = _ref.testId;
63
65
  var isMoreThenTwoItems = items.length > visibleButtonsNum;
64
66
  var firstActions = isMoreThenTwoItems ? items.slice(0, visibleButtonsNum - 1) : items;
65
- var restActions = isMoreThenTwoItems ? items.slice(visibleButtonsNum - 1) : [];
67
+ var restActions = isMoreThenTwoItems ? items.slice(visibleButtonsNum - 1) : []; // Stop AK dropdown menu to propagate event on click.
68
+
69
+ var onClick = (0, _react.useCallback)(function (e) {
70
+ return e.stopPropagation();
71
+ }, []);
66
72
  return (0, _core.jsx)("div", {
67
73
  css: styles,
68
- className: "actions-button-group"
74
+ className: "actions-button-group",
75
+ onClick: onClick
69
76
  }, (0, _core.jsx)(_buttonGroup.default, null, (0, _utils.renderActionItems)(firstActions, size, appearance), restActions.length > 0 ? (0, _core.jsx)(_dropdownMenu.default, {
70
77
  onOpenChange: function onOpenChange(_ref2) {
71
78
  var isOpen = _ref2.isOpen;
@@ -45,7 +45,7 @@ var flexibleUiOptions = {
45
45
  hidePadding: true
46
46
  };
47
47
 
48
- var getOpenAction = function getOpenAction(url, analytics) {
48
+ var getOpenAction = function getOpenAction(url, analytics, onActionClick) {
49
49
  return {
50
50
  name: _constants.ActionName.CustomAction,
51
51
  icon: /*#__PURE__*/_react.default.createElement(_shortcut.default, {
@@ -54,6 +54,10 @@ var getOpenAction = function getOpenAction(url, analytics) {
54
54
  }),
55
55
  iconPosition: 'before',
56
56
  onClick: function onClick() {
57
+ if (onActionClick) {
58
+ onActionClick('open-content');
59
+ }
60
+
57
61
  window.open(url, '_blank');
58
62
  analytics.ui.hoverCardOpenLinkClickedEvent('card');
59
63
  },
@@ -61,12 +65,16 @@ var getOpenAction = function getOpenAction(url, analytics) {
61
65
  };
62
66
  };
63
67
 
64
- var toFooterActions = function toFooterActions(cardActions) {
68
+ var toFooterActions = function toFooterActions(cardActions, onActionClick) {
65
69
  return cardActions.map(function (action) {
66
70
  return {
67
71
  content: action.text,
68
72
  name: _constants.ActionName.CustomAction,
69
73
  onClick: function onClick() {
74
+ if (onActionClick) {
75
+ onActionClick(action.id);
76
+ }
77
+
70
78
  return action.invoke();
71
79
  },
72
80
  testId: action.id
@@ -81,6 +89,7 @@ var HoverCardContent = function HoverCardContent(_ref) {
81
89
  _ref$cardActions = _ref.cardActions,
82
90
  cardActions = _ref$cardActions === void 0 ? [] : _ref$cardActions,
83
91
  cardState = _ref.cardState,
92
+ onActionClick = _ref.onActionClick,
84
93
  onResolve = _ref.onResolve,
85
94
  renderers = _ref.renderers,
86
95
  url = _ref.url;
@@ -97,11 +106,11 @@ var HoverCardContent = function HoverCardContent(_ref) {
97
106
  analytics.ui.cardClickedEvent(undefined, _utils.HOVER_CARD_ANALYTICS_DISPLAY, cardState.status, undefined, undefined, isModifierKeyPressed, undefined, undefined, undefined, 'titleGoToLink');
98
107
  }, [cardState.status, analytics.ui]);
99
108
  var titleActions = (0, _react.useMemo)(function () {
100
- return [getOpenAction(url, analytics)];
101
- }, [url, analytics]);
109
+ return [getOpenAction(url, analytics, onActionClick)];
110
+ }, [url, analytics, onActionClick]);
102
111
  var footerActions = (0, _react.useMemo)(function () {
103
- return toFooterActions(cardActions);
104
- }, [cardActions]);
112
+ return toFooterActions(cardActions, onActionClick);
113
+ }, [cardActions, onActionClick]);
105
114
  var data = (_cardState$details = cardState.details) === null || _cardState$details === void 0 ? void 0 : _cardState$details.data;
106
115
  var types = data ? (0, _extractors.extractType)(data) : undefined; //TODO: EDM-3224 deleted simulated and use real JsonLd
107
116
 
@@ -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.HoverCardComponent = exports.HoverCard = void 0;
10
+ exports.hoverCardClassName = exports.HoverCardComponent = exports.HoverCard = void 0;
11
11
 
12
12
  var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
13
13
 
@@ -42,6 +42,9 @@ function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "functio
42
42
  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; }
43
43
 
44
44
  /** @jsx jsx */
45
+ var hoverCardClassName = 'smart-links-hover-preview';
46
+ exports.hoverCardClassName = hoverCardClassName;
47
+
45
48
  var HoverCardComponent = function HoverCardComponent(_ref) {
46
49
  var children = _ref.children,
47
50
  id = _ref.id,
@@ -63,21 +66,24 @@ var HoverCardComponent = function HoverCardComponent(_ref) {
63
66
  var renderers = (0, _renderers.useSmartLinkRenderers)();
64
67
  var linkState = (0, _store.useSmartCardState)(url);
65
68
  var analytics = (0, _analytics2.useSmartLinkAnalytics)(url, analyticsHandler, id);
69
+ var hideCard = (0, _react.useCallback)(function () {
70
+ //Check its previously open to avoid firing events when moving between the child and hover card components
71
+ if (isOpen === true && cardOpenTime.current) {
72
+ var hoverTime = Date.now() - cardOpenTime.current;
73
+ analytics.ui.hoverCardDismissedEvent('card', hoverTime, 'mouse_hover');
74
+ }
75
+
76
+ setIsOpen(false);
77
+ }, [analytics.ui, isOpen]);
66
78
  var initHideCard = (0, _react.useCallback)(function () {
67
79
  if (fadeInTimeoutId.current) {
68
80
  clearTimeout(fadeInTimeoutId.current);
69
81
  }
70
82
 
71
83
  fadeOutTimeoutId.current = setTimeout(function () {
72
- //Check its previously open to avoid firing events when moving between the child and hover card components
73
- if (isOpen === true && cardOpenTime.current) {
74
- var hoverTime = Date.now() - cardOpenTime.current;
75
- analytics.ui.hoverCardDismissedEvent('card', hoverTime, 'mouse_hover');
76
- }
77
-
78
- setIsOpen(false);
84
+ return hideCard();
79
85
  }, delay);
80
- }, [delay, isOpen, analytics.ui]);
86
+ }, [hideCard]);
81
87
  var initShowCard = (0, _react.useCallback)(function () {
82
88
  if (fadeOutTimeoutId.current) {
83
89
  clearTimeout(fadeOutTimeoutId.current);
@@ -98,24 +104,33 @@ var HoverCardComponent = function HoverCardComponent(_ref) {
98
104
  appearance: _utils.HOVER_CARD_ANALYTICS_DISPLAY,
99
105
  analyticsHandler: analyticsHandler
100
106
  });
101
- var onClose = (0, _react.useCallback)(function () {
102
- return setIsOpen(false);
107
+ var onActionClick = (0, _react.useCallback)(function (actionId) {
108
+ if (actionId === 'preview-content') {
109
+ hideCard();
110
+ }
111
+ }, [hideCard]); // Stop hover preview content to propagate event to parent.
112
+
113
+ var onClick = (0, _react.useCallback)(function (e) {
114
+ return e.stopPropagation();
103
115
  }, []);
104
116
  return (0, _core.jsx)(_popup.default, {
105
117
  testId: "hover-card",
106
118
  isOpen: isOpen,
107
- onClose: onClose,
119
+ onClose: hideCard,
108
120
  placement: "bottom-start",
109
121
  content: function content(_ref2) {
110
122
  var update = _ref2.update;
111
123
  return (0, _core.jsx)("div", {
112
124
  onMouseEnter: initShowCard,
113
125
  onMouseLeave: initHideCard,
114
- css: _styled.HoverCardContainer
126
+ className: hoverCardClassName,
127
+ css: _styled.HoverCardContainer,
128
+ onClick: onClick
115
129
  }, (0, _core.jsx)(_hoverCardContent.default, {
116
130
  analytics: analytics,
117
131
  cardActions: linkActions,
118
132
  cardState: linkState,
133
+ onActionClick: onActionClick,
119
134
  onResolve: update,
120
135
  renderers: renderers,
121
136
  url: url
@@ -72,7 +72,8 @@ var Modal = function Modal(_ref) {
72
72
  var onClose = _ref.onClose,
73
73
  onOpen = _ref.onOpen,
74
74
  src = _ref.src,
75
- testId = _ref.testId,
75
+ _ref$testId = _ref.testId,
76
+ testId = _ref$testId === void 0 ? 'smart-links-preview-modal' : _ref$testId,
76
77
  showModal = _ref.showModal,
77
78
  providerName = _ref.providerName,
78
79
  metadata = _ref.metadata,
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/smart-card",
3
- "version": "20.0.0",
3
+ "version": "20.0.3",
4
4
  "sideEffects": false
5
5
  }
@@ -23,11 +23,12 @@ export const Provider = ({
23
23
  return jsx("div", {
24
24
  css: {
25
25
  display: 'flex',
26
- alignItems: 'center'
26
+ alignItems: 'center',
27
+ fontSize: gs(1.5),
28
+ whiteSpace: 'normal'
27
29
  }
28
30
  }, iconToRender, jsx("span", {
29
31
  css: {
30
- fontSize: gs(1.5),
31
32
  color: token('color.text.subtlest', N300),
32
33
  margin: 0,
33
34
  marginLeft: gs(0.5),
@@ -1,6 +1,7 @@
1
1
  import _extends from "@babel/runtime/helpers/extends";
2
2
 
3
3
  /** @jsx jsx */
4
+ import { useCallback } from 'react';
4
5
  import { FormattedMessage } from 'react-intl-next';
5
6
  import { css, jsx } from '@emotion/core';
6
7
  import ButtonGroup from '@atlaskit/button/button-group';
@@ -47,10 +48,13 @@ const ActionGroup = ({
47
48
  }) => {
48
49
  const isMoreThenTwoItems = items.length > visibleButtonsNum;
49
50
  const firstActions = isMoreThenTwoItems ? items.slice(0, visibleButtonsNum - 1) : items;
50
- const restActions = isMoreThenTwoItems ? items.slice(visibleButtonsNum - 1) : [];
51
+ const restActions = isMoreThenTwoItems ? items.slice(visibleButtonsNum - 1) : []; // Stop AK dropdown menu to propagate event on click.
52
+
53
+ const onClick = useCallback(e => e.stopPropagation(), []);
51
54
  return jsx("div", {
52
55
  css: styles,
53
- className: "actions-button-group"
56
+ className: "actions-button-group",
57
+ onClick: onClick
54
58
  }, jsx(ButtonGroup, null, renderActionItems(firstActions, size, appearance), restActions.length > 0 ? jsx(DropdownMenu, {
55
59
  onOpenChange: ({
56
60
  isOpen
@@ -18,7 +18,7 @@ const flexibleUiOptions = {
18
18
  hidePadding: true
19
19
  };
20
20
 
21
- const getOpenAction = (url, analytics) => ({
21
+ const getOpenAction = (url, analytics, onActionClick) => ({
22
22
  name: ActionName.CustomAction,
23
23
  icon: /*#__PURE__*/React.createElement(ShortcutIcon, {
24
24
  label: "open in new tab",
@@ -26,16 +26,26 @@ const getOpenAction = (url, analytics) => ({
26
26
  }),
27
27
  iconPosition: 'before',
28
28
  onClick: () => {
29
+ if (onActionClick) {
30
+ onActionClick('open-content');
31
+ }
32
+
29
33
  window.open(url, '_blank');
30
34
  analytics.ui.hoverCardOpenLinkClickedEvent('card');
31
35
  },
32
36
  testId: 'hover-card-open-button'
33
37
  });
34
38
 
35
- const toFooterActions = cardActions => cardActions.map(action => ({
39
+ const toFooterActions = (cardActions, onActionClick) => cardActions.map(action => ({
36
40
  content: action.text,
37
41
  name: ActionName.CustomAction,
38
- onClick: () => action.invoke(),
42
+ onClick: () => {
43
+ if (onActionClick) {
44
+ onActionClick(action.id);
45
+ }
46
+
47
+ return action.invoke();
48
+ },
39
49
  testId: action.id
40
50
  }));
41
51
 
@@ -43,6 +53,7 @@ const HoverCardContent = ({
43
53
  analytics,
44
54
  cardActions = [],
45
55
  cardState,
56
+ onActionClick,
46
57
  onResolve,
47
58
  renderers,
48
59
  url
@@ -59,8 +70,8 @@ const HoverCardContent = ({
59
70
  const isModifierKeyPressed = isSpecialEvent(event);
60
71
  analytics.ui.cardClickedEvent(undefined, HOVER_CARD_ANALYTICS_DISPLAY, cardState.status, undefined, undefined, isModifierKeyPressed, undefined, undefined, undefined, 'titleGoToLink');
61
72
  }, [cardState.status, analytics.ui]);
62
- const titleActions = useMemo(() => [getOpenAction(url, analytics)], [url, analytics]);
63
- const footerActions = useMemo(() => toFooterActions(cardActions), [cardActions]);
73
+ const titleActions = useMemo(() => [getOpenAction(url, analytics, onActionClick)], [url, analytics, onActionClick]);
74
+ const footerActions = useMemo(() => toFooterActions(cardActions, onActionClick), [cardActions, onActionClick]);
64
75
  const data = (_cardState$details = cardState.details) === null || _cardState$details === void 0 ? void 0 : _cardState$details.data;
65
76
  const types = data ? extractType(data) : undefined; //TODO: EDM-3224 deleted simulated and use real JsonLd
66
77
 
@@ -13,6 +13,7 @@ import { useSmartLinkAnalytics } from '../../state/analytics';
13
13
  import { useSmartLinkRenderers } from '../../state/renderers';
14
14
  import HoverCardContent from './components/hover-card-content';
15
15
  import { HOVER_CARD_ANALYTICS_DISPLAY } from './utils';
16
+ export const hoverCardClassName = 'smart-links-hover-preview';
16
17
  export const HoverCardComponent = ({
17
18
  children,
18
19
  id,
@@ -30,21 +31,22 @@ export const HoverCardComponent = ({
30
31
  const renderers = useSmartLinkRenderers();
31
32
  const linkState = useLinkState(url);
32
33
  const analytics = useSmartLinkAnalytics(url, analyticsHandler, id);
34
+ const hideCard = useCallback(() => {
35
+ //Check its previously open to avoid firing events when moving between the child and hover card components
36
+ if (isOpen === true && cardOpenTime.current) {
37
+ const hoverTime = Date.now() - cardOpenTime.current;
38
+ analytics.ui.hoverCardDismissedEvent('card', hoverTime, 'mouse_hover');
39
+ }
40
+
41
+ setIsOpen(false);
42
+ }, [analytics.ui, isOpen]);
33
43
  const initHideCard = useCallback(() => {
34
44
  if (fadeInTimeoutId.current) {
35
45
  clearTimeout(fadeInTimeoutId.current);
36
46
  }
37
47
 
38
- fadeOutTimeoutId.current = setTimeout(() => {
39
- //Check its previously open to avoid firing events when moving between the child and hover card components
40
- if (isOpen === true && cardOpenTime.current) {
41
- const hoverTime = Date.now() - cardOpenTime.current;
42
- analytics.ui.hoverCardDismissedEvent('card', hoverTime, 'mouse_hover');
43
- }
44
-
45
- setIsOpen(false);
46
- }, delay);
47
- }, [delay, isOpen, analytics.ui]);
48
+ fadeOutTimeoutId.current = setTimeout(() => hideCard(), delay);
49
+ }, [hideCard]);
48
50
  const initShowCard = useCallback(() => {
49
51
  if (fadeOutTimeoutId.current) {
50
52
  clearTimeout(fadeOutTimeoutId.current);
@@ -65,22 +67,31 @@ export const HoverCardComponent = ({
65
67
  appearance: HOVER_CARD_ANALYTICS_DISPLAY,
66
68
  analyticsHandler
67
69
  });
68
- const onClose = useCallback(() => setIsOpen(false), []);
70
+ const onActionClick = useCallback(actionId => {
71
+ if (actionId === 'preview-content') {
72
+ hideCard();
73
+ }
74
+ }, [hideCard]); // Stop hover preview content to propagate event to parent.
75
+
76
+ const onClick = useCallback(e => e.stopPropagation(), []);
69
77
  return jsx(Popup, {
70
78
  testId: "hover-card",
71
79
  isOpen: isOpen,
72
- onClose: onClose,
80
+ onClose: hideCard,
73
81
  placement: "bottom-start",
74
82
  content: ({
75
83
  update
76
84
  }) => jsx("div", {
77
85
  onMouseEnter: initShowCard,
78
86
  onMouseLeave: initHideCard,
79
- css: HoverCardContainer
87
+ className: hoverCardClassName,
88
+ css: HoverCardContainer,
89
+ onClick: onClick
80
90
  }, jsx(HoverCardContent, {
81
91
  analytics: analytics,
82
92
  cardActions: linkActions,
83
93
  cardState: linkState,
94
+ onActionClick: onActionClick,
84
95
  onResolve: update,
85
96
  renderers: renderers,
86
97
  url: url
@@ -40,7 +40,7 @@ const Modal = ({
40
40
  onClose,
41
41
  onOpen,
42
42
  src,
43
- testId,
43
+ testId = 'smart-links-preview-modal',
44
44
  showModal,
45
45
  providerName,
46
46
  metadata,
@@ -1,5 +1,5 @@
1
1
  {
2
2
  "name": "@atlaskit/smart-card",
3
- "version": "20.0.0",
3
+ "version": "20.0.3",
4
4
  "sideEffects": false
5
5
  }
@@ -22,11 +22,12 @@ export var Provider = function Provider(_ref) {
22
22
  return jsx("div", {
23
23
  css: {
24
24
  display: 'flex',
25
- alignItems: 'center'
25
+ alignItems: 'center',
26
+ fontSize: gs(1.5),
27
+ whiteSpace: 'normal'
26
28
  }
27
29
  }, iconToRender, jsx("span", {
28
30
  css: {
29
- fontSize: gs(1.5),
30
31
  color: token('color.text.subtlest', N300),
31
32
  margin: 0,
32
33
  marginLeft: gs(0.5),
@@ -6,6 +6,7 @@ var _excluded = ["triggerRef"];
6
6
  var _templateObject;
7
7
 
8
8
  /** @jsx jsx */
9
+ import { useCallback } from 'react';
9
10
  import { FormattedMessage } from 'react-intl-next';
10
11
  import { css, jsx } from '@emotion/core';
11
12
  import ButtonGroup from '@atlaskit/button/button-group';
@@ -39,10 +40,15 @@ var ActionGroup = function ActionGroup(_ref) {
39
40
  testId = _ref.testId;
40
41
  var isMoreThenTwoItems = items.length > visibleButtonsNum;
41
42
  var firstActions = isMoreThenTwoItems ? items.slice(0, visibleButtonsNum - 1) : items;
42
- var restActions = isMoreThenTwoItems ? items.slice(visibleButtonsNum - 1) : [];
43
+ var restActions = isMoreThenTwoItems ? items.slice(visibleButtonsNum - 1) : []; // Stop AK dropdown menu to propagate event on click.
44
+
45
+ var onClick = useCallback(function (e) {
46
+ return e.stopPropagation();
47
+ }, []);
43
48
  return jsx("div", {
44
49
  css: styles,
45
- className: "actions-button-group"
50
+ className: "actions-button-group",
51
+ onClick: onClick
46
52
  }, jsx(ButtonGroup, null, renderActionItems(firstActions, size, appearance), restActions.length > 0 ? jsx(DropdownMenu, {
47
53
  onOpenChange: function onOpenChange(_ref2) {
48
54
  var isOpen = _ref2.isOpen;
@@ -18,7 +18,7 @@ var flexibleUiOptions = {
18
18
  hidePadding: true
19
19
  };
20
20
 
21
- var getOpenAction = function getOpenAction(url, analytics) {
21
+ var getOpenAction = function getOpenAction(url, analytics, onActionClick) {
22
22
  return {
23
23
  name: ActionName.CustomAction,
24
24
  icon: /*#__PURE__*/React.createElement(ShortcutIcon, {
@@ -27,6 +27,10 @@ var getOpenAction = function getOpenAction(url, analytics) {
27
27
  }),
28
28
  iconPosition: 'before',
29
29
  onClick: function onClick() {
30
+ if (onActionClick) {
31
+ onActionClick('open-content');
32
+ }
33
+
30
34
  window.open(url, '_blank');
31
35
  analytics.ui.hoverCardOpenLinkClickedEvent('card');
32
36
  },
@@ -34,12 +38,16 @@ var getOpenAction = function getOpenAction(url, analytics) {
34
38
  };
35
39
  };
36
40
 
37
- var toFooterActions = function toFooterActions(cardActions) {
41
+ var toFooterActions = function toFooterActions(cardActions, onActionClick) {
38
42
  return cardActions.map(function (action) {
39
43
  return {
40
44
  content: action.text,
41
45
  name: ActionName.CustomAction,
42
46
  onClick: function onClick() {
47
+ if (onActionClick) {
48
+ onActionClick(action.id);
49
+ }
50
+
43
51
  return action.invoke();
44
52
  },
45
53
  testId: action.id
@@ -54,6 +62,7 @@ var HoverCardContent = function HoverCardContent(_ref) {
54
62
  _ref$cardActions = _ref.cardActions,
55
63
  cardActions = _ref$cardActions === void 0 ? [] : _ref$cardActions,
56
64
  cardState = _ref.cardState,
65
+ onActionClick = _ref.onActionClick,
57
66
  onResolve = _ref.onResolve,
58
67
  renderers = _ref.renderers,
59
68
  url = _ref.url;
@@ -70,11 +79,11 @@ var HoverCardContent = function HoverCardContent(_ref) {
70
79
  analytics.ui.cardClickedEvent(undefined, HOVER_CARD_ANALYTICS_DISPLAY, cardState.status, undefined, undefined, isModifierKeyPressed, undefined, undefined, undefined, 'titleGoToLink');
71
80
  }, [cardState.status, analytics.ui]);
72
81
  var titleActions = useMemo(function () {
73
- return [getOpenAction(url, analytics)];
74
- }, [url, analytics]);
82
+ return [getOpenAction(url, analytics, onActionClick)];
83
+ }, [url, analytics, onActionClick]);
75
84
  var footerActions = useMemo(function () {
76
- return toFooterActions(cardActions);
77
- }, [cardActions]);
85
+ return toFooterActions(cardActions, onActionClick);
86
+ }, [cardActions, onActionClick]);
78
87
  var data = (_cardState$details = cardState.details) === null || _cardState$details === void 0 ? void 0 : _cardState$details.data;
79
88
  var types = data ? extractType(data) : undefined; //TODO: EDM-3224 deleted simulated and use real JsonLd
80
89
 
@@ -14,6 +14,7 @@ import { useSmartLinkAnalytics } from '../../state/analytics';
14
14
  import { useSmartLinkRenderers } from '../../state/renderers';
15
15
  import HoverCardContent from './components/hover-card-content';
16
16
  import { HOVER_CARD_ANALYTICS_DISPLAY } from './utils';
17
+ export var hoverCardClassName = 'smart-links-hover-preview';
17
18
  export var HoverCardComponent = function HoverCardComponent(_ref) {
18
19
  var children = _ref.children,
19
20
  id = _ref.id,
@@ -35,21 +36,24 @@ export var HoverCardComponent = function HoverCardComponent(_ref) {
35
36
  var renderers = useSmartLinkRenderers();
36
37
  var linkState = useLinkState(url);
37
38
  var analytics = useSmartLinkAnalytics(url, analyticsHandler, id);
39
+ var hideCard = useCallback(function () {
40
+ //Check its previously open to avoid firing events when moving between the child and hover card components
41
+ if (isOpen === true && cardOpenTime.current) {
42
+ var hoverTime = Date.now() - cardOpenTime.current;
43
+ analytics.ui.hoverCardDismissedEvent('card', hoverTime, 'mouse_hover');
44
+ }
45
+
46
+ setIsOpen(false);
47
+ }, [analytics.ui, isOpen]);
38
48
  var initHideCard = useCallback(function () {
39
49
  if (fadeInTimeoutId.current) {
40
50
  clearTimeout(fadeInTimeoutId.current);
41
51
  }
42
52
 
43
53
  fadeOutTimeoutId.current = setTimeout(function () {
44
- //Check its previously open to avoid firing events when moving between the child and hover card components
45
- if (isOpen === true && cardOpenTime.current) {
46
- var hoverTime = Date.now() - cardOpenTime.current;
47
- analytics.ui.hoverCardDismissedEvent('card', hoverTime, 'mouse_hover');
48
- }
49
-
50
- setIsOpen(false);
54
+ return hideCard();
51
55
  }, delay);
52
- }, [delay, isOpen, analytics.ui]);
56
+ }, [hideCard]);
53
57
  var initShowCard = useCallback(function () {
54
58
  if (fadeOutTimeoutId.current) {
55
59
  clearTimeout(fadeOutTimeoutId.current);
@@ -70,24 +74,33 @@ export var HoverCardComponent = function HoverCardComponent(_ref) {
70
74
  appearance: HOVER_CARD_ANALYTICS_DISPLAY,
71
75
  analyticsHandler: analyticsHandler
72
76
  });
73
- var onClose = useCallback(function () {
74
- return setIsOpen(false);
77
+ var onActionClick = useCallback(function (actionId) {
78
+ if (actionId === 'preview-content') {
79
+ hideCard();
80
+ }
81
+ }, [hideCard]); // Stop hover preview content to propagate event to parent.
82
+
83
+ var onClick = useCallback(function (e) {
84
+ return e.stopPropagation();
75
85
  }, []);
76
86
  return jsx(Popup, {
77
87
  testId: "hover-card",
78
88
  isOpen: isOpen,
79
- onClose: onClose,
89
+ onClose: hideCard,
80
90
  placement: "bottom-start",
81
91
  content: function content(_ref2) {
82
92
  var update = _ref2.update;
83
93
  return jsx("div", {
84
94
  onMouseEnter: initShowCard,
85
95
  onMouseLeave: initHideCard,
86
- css: HoverCardContainer
96
+ className: hoverCardClassName,
97
+ css: HoverCardContainer,
98
+ onClick: onClick
87
99
  }, jsx(HoverCardContent, {
88
100
  analytics: analytics,
89
101
  cardActions: linkActions,
90
102
  cardState: linkState,
103
+ onActionClick: onActionClick,
91
104
  onResolve: update,
92
105
  renderers: renderers,
93
106
  url: url
@@ -66,7 +66,8 @@ var Modal = function Modal(_ref) {
66
66
  var onClose = _ref.onClose,
67
67
  onOpen = _ref.onOpen,
68
68
  src = _ref.src,
69
- testId = _ref.testId,
69
+ _ref$testId = _ref.testId,
70
+ testId = _ref$testId === void 0 ? 'smart-links-preview-modal' : _ref$testId,
70
71
  showModal = _ref.showModal,
71
72
  providerName = _ref.providerName,
72
73
  metadata = _ref.metadata,
@@ -1,4 +1,5 @@
1
1
  import React, { FC } from 'react';
2
2
  import { HoverCardProps } from './types';
3
+ export declare const hoverCardClassName = "smart-links-hover-preview";
3
4
  export declare const HoverCardComponent: FC<HoverCardProps>;
4
5
  export declare const HoverCard: React.ForwardRefExoticComponent<Pick<Omit<React.PropsWithChildren<HoverCardProps>, keyof import("@atlaskit/analytics-next").WithAnalyticsEventsProps> & React.RefAttributes<any> & import("@atlaskit/analytics-next").WithContextProps, "children" | "id" | "analyticsContext" | "key" | "url"> & React.RefAttributes<any>>;
@@ -20,6 +20,7 @@ export declare type HoverCardContentProps = {
20
20
  cardActions?: LinkAction[];
21
21
  cardState: CardState;
22
22
  renderers?: CardProviderRenderers;
23
+ onActionClick: (actionId: string) => void;
23
24
  onResolve: () => void;
24
25
  url: string;
25
26
  };