@atlaskit/smart-card 26.5.12 → 26.5.14
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 +12 -0
- package/dist/cjs/version.json +1 -1
- package/dist/cjs/view/LinkUrl/LinkWarningModal/hooks/use-link-warning-modal.js +36 -19
- package/dist/cjs/view/LinkUrl/index.js +23 -4
- package/dist/es2019/version.json +1 -1
- package/dist/es2019/view/LinkUrl/LinkWarningModal/hooks/use-link-warning-modal.js +36 -19
- package/dist/es2019/view/LinkUrl/index.js +22 -3
- package/dist/esm/version.json +1 -1
- package/dist/esm/view/LinkUrl/LinkWarningModal/hooks/use-link-warning-modal.js +36 -19
- package/dist/esm/view/LinkUrl/index.js +23 -4
- package/dist/types/view/LinkUrl/LinkWarningModal/hooks/use-link-warning-modal.d.ts +4 -3
- package/dist/types-ts4.5/view/LinkUrl/LinkWarningModal/hooks/use-link-warning-modal.d.ts +4 -3
- package/package.json +6 -3
package/CHANGELOG.md
CHANGED
|
@@ -1,5 +1,17 @@
|
|
|
1
1
|
# @atlaskit/smart-card
|
|
2
2
|
|
|
3
|
+
## 26.5.14
|
|
4
|
+
|
|
5
|
+
### Patch Changes
|
|
6
|
+
|
|
7
|
+
- [`fd2375e6f26`](https://bitbucket.org/atlassian/atlassian-frontend/commits/fd2375e6f26) - [ux] Prevent skipping of warning modal when onClick callback programatically opens a window. OnClick function is no longer called if the warning modal is shown. This will prevent link click analytics from firing but there is no easy way to distinguish the effects of what happens within onClick. Additionally, clicking continue in the warning modal will always open the link in a new tab.
|
|
8
|
+
|
|
9
|
+
## 26.5.13
|
|
10
|
+
|
|
11
|
+
### Patch Changes
|
|
12
|
+
|
|
13
|
+
- [`2d2b6b23bec`](https://bitbucket.org/atlassian/atlassian-frontend/commits/2d2b6b23bec) - Updated dependencies
|
|
14
|
+
|
|
3
15
|
## 26.5.12
|
|
4
16
|
|
|
5
17
|
### Patch Changes
|
package/dist/cjs/version.json
CHANGED
|
@@ -25,37 +25,46 @@ var useLinkWarningModal = function useLinkWarningModal() {
|
|
|
25
25
|
setIsOpen = _useState6[1];
|
|
26
26
|
var _useAnalyticsEvents = (0, _analyticsNext.useAnalyticsEvents)(),
|
|
27
27
|
createAnalyticsEvent = _useAnalyticsEvents.createAnalyticsEvent;
|
|
28
|
-
var
|
|
28
|
+
var sendWarningModalViewedEvent = function sendWarningModalViewedEvent() {
|
|
29
29
|
createAnalyticsEvent({
|
|
30
|
-
action: '
|
|
31
|
-
actionSubject: '
|
|
32
|
-
|
|
33
|
-
|
|
30
|
+
action: 'viewed',
|
|
31
|
+
actionSubject: 'linkSafetyWarningModal',
|
|
32
|
+
eventType: 'screen',
|
|
33
|
+
name: 'linkSafetyWarningModal'
|
|
34
|
+
}).fire(_analytics.ANALYTICS_CHANNEL);
|
|
35
|
+
};
|
|
36
|
+
var sendContinueClickedEvent = function sendContinueClickedEvent() {
|
|
37
|
+
createAnalyticsEvent({
|
|
38
|
+
action: 'clicked',
|
|
39
|
+
actionSubject: 'button',
|
|
40
|
+
actionSubjectId: 'linkSafetyWarningModalContinue',
|
|
41
|
+
eventType: 'ui',
|
|
42
|
+
screen: 'linkSafetyWarningModal'
|
|
34
43
|
}).fire(_analytics.ANALYTICS_CHANNEL);
|
|
35
44
|
};
|
|
36
45
|
|
|
37
46
|
/**
|
|
38
47
|
* It checks and warns if a link text is a URL and different from an actual link destination
|
|
39
48
|
*/
|
|
40
|
-
var
|
|
49
|
+
var isLinkSafe = function isLinkSafe(event, href) {
|
|
41
50
|
if (!href) {
|
|
42
|
-
return;
|
|
51
|
+
return true;
|
|
43
52
|
}
|
|
44
53
|
var anchor = event.currentTarget;
|
|
45
54
|
var linkText = anchor.innerText;
|
|
46
55
|
var normalisedUrlFromLinkText = (0, _url.normalizeUrl)(linkText);
|
|
47
56
|
if (!normalisedUrlFromLinkText) {
|
|
48
|
-
return;
|
|
57
|
+
return true;
|
|
49
58
|
}
|
|
50
59
|
var anchorLinkRegex = new RegExp(/^#/im);
|
|
51
60
|
var isAnchorLink = anchorLinkRegex.test(linkText);
|
|
52
61
|
if (isAnchorLink) {
|
|
53
|
-
return;
|
|
62
|
+
return true;
|
|
54
63
|
}
|
|
55
64
|
var relativeLinkRegex = new RegExp(/^\//im);
|
|
56
65
|
var isRelativeHrefLink = relativeLinkRegex.test(href);
|
|
57
66
|
if (isRelativeHrefLink) {
|
|
58
|
-
return;
|
|
67
|
+
return true;
|
|
59
68
|
}
|
|
60
69
|
var hrefUrl = new URL(href, window.location.origin);
|
|
61
70
|
var linkTextUrl = new URL(normalisedUrlFromLinkText, hrefUrl.origin);
|
|
@@ -69,12 +78,18 @@ var useLinkWarningModal = function useLinkWarningModal() {
|
|
|
69
78
|
}
|
|
70
79
|
var areEquivalentLinks = linkTextUrl.hostname === hrefUrl.hostname && linkTextUrl.pathname === hrefUrl.pathname && linkTextUrl.search === hrefUrl.search && linkTextUrl.username === hrefUrl.username && linkTextUrl.password === hrefUrl.password && areProtocolsEquivalent;
|
|
71
80
|
if (!areEquivalentLinks) {
|
|
72
|
-
|
|
73
|
-
setUnsafeLinkText(linkText);
|
|
74
|
-
href && setUrl(href);
|
|
75
|
-
setIsOpen(true);
|
|
76
|
-
sendAnalyticsEvent();
|
|
81
|
+
return false;
|
|
77
82
|
}
|
|
83
|
+
return true;
|
|
84
|
+
};
|
|
85
|
+
var showSafetyWarningModal = function showSafetyWarningModal(event, href) {
|
|
86
|
+
event.preventDefault();
|
|
87
|
+
var anchor = event.currentTarget;
|
|
88
|
+
var linkText = anchor.innerText;
|
|
89
|
+
setUnsafeLinkText(linkText);
|
|
90
|
+
href && setUrl(href);
|
|
91
|
+
setIsOpen(true);
|
|
92
|
+
sendWarningModalViewedEvent();
|
|
78
93
|
};
|
|
79
94
|
var onClose = function onClose() {
|
|
80
95
|
setIsOpen(false);
|
|
@@ -83,14 +98,16 @@ var useLinkWarningModal = function useLinkWarningModal() {
|
|
|
83
98
|
};
|
|
84
99
|
var onContinue = function onContinue() {
|
|
85
100
|
onClose();
|
|
86
|
-
|
|
101
|
+
sendContinueClickedEvent();
|
|
102
|
+
url && window.open(url, '_blank', 'noopener noreferrer');
|
|
87
103
|
};
|
|
88
104
|
return {
|
|
89
|
-
|
|
90
|
-
|
|
105
|
+
isLinkSafe: isLinkSafe,
|
|
106
|
+
isOpen: isOpen,
|
|
91
107
|
onClose: onClose,
|
|
92
108
|
onContinue: onContinue,
|
|
93
|
-
|
|
109
|
+
showSafetyWarningModal: showSafetyWarningModal,
|
|
110
|
+
unsafeLinkText: unsafeLinkText,
|
|
94
111
|
url: url
|
|
95
112
|
};
|
|
96
113
|
};
|
|
@@ -14,8 +14,9 @@ var _click = require("../../utils/analytics/click");
|
|
|
14
14
|
var _LinkAnalyticsContext = require("../../utils/analytics/LinkAnalyticsContext");
|
|
15
15
|
var _useLinkWarningModal2 = require("./LinkWarningModal/hooks/use-link-warning-modal");
|
|
16
16
|
var _LinkWarningModal = _interopRequireDefault(require("./LinkWarningModal"));
|
|
17
|
+
var _platformFeatureFlags = require("@atlaskit/platform-feature-flags");
|
|
17
18
|
var _excluded = ["href", "children", "checkSafety", "onClick", "testId"],
|
|
18
|
-
_excluded2 = ["
|
|
19
|
+
_excluded2 = ["isLinkSafe", "showSafetyWarningModal"];
|
|
19
20
|
var PACKAGE_DATA = {
|
|
20
21
|
packageName: _version.name,
|
|
21
22
|
packageVersion: _version.version,
|
|
@@ -32,7 +33,8 @@ var LinkUrl = function LinkUrl(_ref) {
|
|
|
32
33
|
testId = _ref$testId === void 0 ? 'link-with-safety' : _ref$testId,
|
|
33
34
|
props = (0, _objectWithoutProperties2.default)(_ref, _excluded);
|
|
34
35
|
var _useLinkWarningModal = (0, _useLinkWarningModal2.useLinkWarningModal)(),
|
|
35
|
-
|
|
36
|
+
isLinkSafe = _useLinkWarningModal.isLinkSafe,
|
|
37
|
+
showSafetyWarningModal = _useLinkWarningModal.showSafetyWarningModal,
|
|
36
38
|
linkWarningModalProps = (0, _objectWithoutProperties2.default)(_useLinkWarningModal, _excluded2);
|
|
37
39
|
return /*#__PURE__*/_react.default.createElement(_react.default.Fragment, null, /*#__PURE__*/_react.default.createElement(_LinkAnalyticsContext.LinkAnalyticsContext, {
|
|
38
40
|
url: href,
|
|
@@ -41,8 +43,25 @@ var LinkUrl = function LinkUrl(_ref) {
|
|
|
41
43
|
"data-testid": testId,
|
|
42
44
|
href: href,
|
|
43
45
|
onClick: function onClick(e) {
|
|
44
|
-
|
|
45
|
-
|
|
46
|
+
if ((0, _platformFeatureFlags.getBooleanFF)('platform.linking-platform.smart-card.should-call-onclick-in-warning-modal-only-when-safe')) {
|
|
47
|
+
if (!checkSafety) {
|
|
48
|
+
_onClick && _onClick(e);
|
|
49
|
+
return;
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
// Only call the onClick if the link is safe
|
|
53
|
+
if (isLinkSafe(e, href)) {
|
|
54
|
+
_onClick && _onClick(e);
|
|
55
|
+
} else {
|
|
56
|
+
showSafetyWarningModal(e, href);
|
|
57
|
+
}
|
|
58
|
+
} else {
|
|
59
|
+
if (checkSafety && !isLinkSafe(e, href)) {
|
|
60
|
+
showSafetyWarningModal(e, href);
|
|
61
|
+
}
|
|
62
|
+
// Call the onClick regardless of the link safety
|
|
63
|
+
_onClick && _onClick(e);
|
|
64
|
+
}
|
|
46
65
|
}
|
|
47
66
|
}, props), children)), checkSafety && /*#__PURE__*/_react.default.createElement(_LinkWarningModal.default, linkWarningModalProps));
|
|
48
67
|
};
|
package/dist/es2019/version.json
CHANGED
|
@@ -9,37 +9,46 @@ export const useLinkWarningModal = () => {
|
|
|
9
9
|
const {
|
|
10
10
|
createAnalyticsEvent
|
|
11
11
|
} = useAnalyticsEvents();
|
|
12
|
-
const
|
|
12
|
+
const sendWarningModalViewedEvent = () => {
|
|
13
13
|
createAnalyticsEvent({
|
|
14
|
-
action: '
|
|
15
|
-
actionSubject: '
|
|
16
|
-
|
|
17
|
-
|
|
14
|
+
action: 'viewed',
|
|
15
|
+
actionSubject: 'linkSafetyWarningModal',
|
|
16
|
+
eventType: 'screen',
|
|
17
|
+
name: 'linkSafetyWarningModal'
|
|
18
|
+
}).fire(ANALYTICS_CHANNEL);
|
|
19
|
+
};
|
|
20
|
+
const sendContinueClickedEvent = () => {
|
|
21
|
+
createAnalyticsEvent({
|
|
22
|
+
action: 'clicked',
|
|
23
|
+
actionSubject: 'button',
|
|
24
|
+
actionSubjectId: 'linkSafetyWarningModalContinue',
|
|
25
|
+
eventType: 'ui',
|
|
26
|
+
screen: 'linkSafetyWarningModal'
|
|
18
27
|
}).fire(ANALYTICS_CHANNEL);
|
|
19
28
|
};
|
|
20
29
|
|
|
21
30
|
/**
|
|
22
31
|
* It checks and warns if a link text is a URL and different from an actual link destination
|
|
23
32
|
*/
|
|
24
|
-
const
|
|
33
|
+
const isLinkSafe = (event, href) => {
|
|
25
34
|
if (!href) {
|
|
26
|
-
return;
|
|
35
|
+
return true;
|
|
27
36
|
}
|
|
28
37
|
const anchor = event.currentTarget;
|
|
29
38
|
const linkText = anchor.innerText;
|
|
30
39
|
const normalisedUrlFromLinkText = normalizeUrl(linkText);
|
|
31
40
|
if (!normalisedUrlFromLinkText) {
|
|
32
|
-
return;
|
|
41
|
+
return true;
|
|
33
42
|
}
|
|
34
43
|
const anchorLinkRegex = new RegExp(/^#/im);
|
|
35
44
|
const isAnchorLink = anchorLinkRegex.test(linkText);
|
|
36
45
|
if (isAnchorLink) {
|
|
37
|
-
return;
|
|
46
|
+
return true;
|
|
38
47
|
}
|
|
39
48
|
const relativeLinkRegex = new RegExp(/^\//im);
|
|
40
49
|
const isRelativeHrefLink = relativeLinkRegex.test(href);
|
|
41
50
|
if (isRelativeHrefLink) {
|
|
42
|
-
return;
|
|
51
|
+
return true;
|
|
43
52
|
}
|
|
44
53
|
const hrefUrl = new URL(href, window.location.origin);
|
|
45
54
|
const linkTextUrl = new URL(normalisedUrlFromLinkText, hrefUrl.origin);
|
|
@@ -53,12 +62,18 @@ export const useLinkWarningModal = () => {
|
|
|
53
62
|
}
|
|
54
63
|
const areEquivalentLinks = linkTextUrl.hostname === hrefUrl.hostname && linkTextUrl.pathname === hrefUrl.pathname && linkTextUrl.search === hrefUrl.search && linkTextUrl.username === hrefUrl.username && linkTextUrl.password === hrefUrl.password && areProtocolsEquivalent;
|
|
55
64
|
if (!areEquivalentLinks) {
|
|
56
|
-
|
|
57
|
-
setUnsafeLinkText(linkText);
|
|
58
|
-
href && setUrl(href);
|
|
59
|
-
setIsOpen(true);
|
|
60
|
-
sendAnalyticsEvent();
|
|
65
|
+
return false;
|
|
61
66
|
}
|
|
67
|
+
return true;
|
|
68
|
+
};
|
|
69
|
+
const showSafetyWarningModal = (event, href) => {
|
|
70
|
+
event.preventDefault();
|
|
71
|
+
const anchor = event.currentTarget;
|
|
72
|
+
const linkText = anchor.innerText;
|
|
73
|
+
setUnsafeLinkText(linkText);
|
|
74
|
+
href && setUrl(href);
|
|
75
|
+
setIsOpen(true);
|
|
76
|
+
sendWarningModalViewedEvent();
|
|
62
77
|
};
|
|
63
78
|
const onClose = () => {
|
|
64
79
|
setIsOpen(false);
|
|
@@ -67,14 +82,16 @@ export const useLinkWarningModal = () => {
|
|
|
67
82
|
};
|
|
68
83
|
const onContinue = () => {
|
|
69
84
|
onClose();
|
|
70
|
-
|
|
85
|
+
sendContinueClickedEvent();
|
|
86
|
+
url && window.open(url, '_blank', 'noopener noreferrer');
|
|
71
87
|
};
|
|
72
88
|
return {
|
|
73
|
-
|
|
74
|
-
|
|
89
|
+
isLinkSafe,
|
|
90
|
+
isOpen,
|
|
75
91
|
onClose,
|
|
76
92
|
onContinue,
|
|
77
|
-
|
|
93
|
+
showSafetyWarningModal,
|
|
94
|
+
unsafeLinkText,
|
|
78
95
|
url
|
|
79
96
|
};
|
|
80
97
|
};
|
|
@@ -6,6 +6,7 @@ import { withLinkClickedEvent } from '../../utils/analytics/click';
|
|
|
6
6
|
import { LinkAnalyticsContext } from '../../utils/analytics/LinkAnalyticsContext';
|
|
7
7
|
import { useLinkWarningModal } from './LinkWarningModal/hooks/use-link-warning-modal';
|
|
8
8
|
import LinkWarningModal from './LinkWarningModal';
|
|
9
|
+
import { getBooleanFF } from '@atlaskit/platform-feature-flags';
|
|
9
10
|
const PACKAGE_DATA = {
|
|
10
11
|
packageName,
|
|
11
12
|
packageVersion,
|
|
@@ -21,7 +22,8 @@ const LinkUrl = ({
|
|
|
21
22
|
...props
|
|
22
23
|
}) => {
|
|
23
24
|
const {
|
|
24
|
-
|
|
25
|
+
isLinkSafe,
|
|
26
|
+
showSafetyWarningModal,
|
|
25
27
|
...linkWarningModalProps
|
|
26
28
|
} = useLinkWarningModal();
|
|
27
29
|
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(LinkAnalyticsContext, {
|
|
@@ -31,8 +33,25 @@ const LinkUrl = ({
|
|
|
31
33
|
"data-testid": testId,
|
|
32
34
|
href: href,
|
|
33
35
|
onClick: e => {
|
|
34
|
-
|
|
35
|
-
|
|
36
|
+
if (getBooleanFF('platform.linking-platform.smart-card.should-call-onclick-in-warning-modal-only-when-safe')) {
|
|
37
|
+
if (!checkSafety) {
|
|
38
|
+
onClick && onClick(e);
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
|
|
42
|
+
// Only call the onClick if the link is safe
|
|
43
|
+
if (isLinkSafe(e, href)) {
|
|
44
|
+
onClick && onClick(e);
|
|
45
|
+
} else {
|
|
46
|
+
showSafetyWarningModal(e, href);
|
|
47
|
+
}
|
|
48
|
+
} else {
|
|
49
|
+
if (checkSafety && !isLinkSafe(e, href)) {
|
|
50
|
+
showSafetyWarningModal(e, href);
|
|
51
|
+
}
|
|
52
|
+
// Call the onClick regardless of the link safety
|
|
53
|
+
onClick && onClick(e);
|
|
54
|
+
}
|
|
36
55
|
}
|
|
37
56
|
}, props), children)), checkSafety && /*#__PURE__*/React.createElement(LinkWarningModal, linkWarningModalProps));
|
|
38
57
|
};
|
package/dist/esm/version.json
CHANGED
|
@@ -18,37 +18,46 @@ export var useLinkWarningModal = function useLinkWarningModal() {
|
|
|
18
18
|
setIsOpen = _useState6[1];
|
|
19
19
|
var _useAnalyticsEvents = useAnalyticsEvents(),
|
|
20
20
|
createAnalyticsEvent = _useAnalyticsEvents.createAnalyticsEvent;
|
|
21
|
-
var
|
|
21
|
+
var sendWarningModalViewedEvent = function sendWarningModalViewedEvent() {
|
|
22
22
|
createAnalyticsEvent({
|
|
23
|
-
action: '
|
|
24
|
-
actionSubject: '
|
|
25
|
-
|
|
26
|
-
|
|
23
|
+
action: 'viewed',
|
|
24
|
+
actionSubject: 'linkSafetyWarningModal',
|
|
25
|
+
eventType: 'screen',
|
|
26
|
+
name: 'linkSafetyWarningModal'
|
|
27
|
+
}).fire(ANALYTICS_CHANNEL);
|
|
28
|
+
};
|
|
29
|
+
var sendContinueClickedEvent = function sendContinueClickedEvent() {
|
|
30
|
+
createAnalyticsEvent({
|
|
31
|
+
action: 'clicked',
|
|
32
|
+
actionSubject: 'button',
|
|
33
|
+
actionSubjectId: 'linkSafetyWarningModalContinue',
|
|
34
|
+
eventType: 'ui',
|
|
35
|
+
screen: 'linkSafetyWarningModal'
|
|
27
36
|
}).fire(ANALYTICS_CHANNEL);
|
|
28
37
|
};
|
|
29
38
|
|
|
30
39
|
/**
|
|
31
40
|
* It checks and warns if a link text is a URL and different from an actual link destination
|
|
32
41
|
*/
|
|
33
|
-
var
|
|
42
|
+
var isLinkSafe = function isLinkSafe(event, href) {
|
|
34
43
|
if (!href) {
|
|
35
|
-
return;
|
|
44
|
+
return true;
|
|
36
45
|
}
|
|
37
46
|
var anchor = event.currentTarget;
|
|
38
47
|
var linkText = anchor.innerText;
|
|
39
48
|
var normalisedUrlFromLinkText = normalizeUrl(linkText);
|
|
40
49
|
if (!normalisedUrlFromLinkText) {
|
|
41
|
-
return;
|
|
50
|
+
return true;
|
|
42
51
|
}
|
|
43
52
|
var anchorLinkRegex = new RegExp(/^#/im);
|
|
44
53
|
var isAnchorLink = anchorLinkRegex.test(linkText);
|
|
45
54
|
if (isAnchorLink) {
|
|
46
|
-
return;
|
|
55
|
+
return true;
|
|
47
56
|
}
|
|
48
57
|
var relativeLinkRegex = new RegExp(/^\//im);
|
|
49
58
|
var isRelativeHrefLink = relativeLinkRegex.test(href);
|
|
50
59
|
if (isRelativeHrefLink) {
|
|
51
|
-
return;
|
|
60
|
+
return true;
|
|
52
61
|
}
|
|
53
62
|
var hrefUrl = new URL(href, window.location.origin);
|
|
54
63
|
var linkTextUrl = new URL(normalisedUrlFromLinkText, hrefUrl.origin);
|
|
@@ -62,12 +71,18 @@ export var useLinkWarningModal = function useLinkWarningModal() {
|
|
|
62
71
|
}
|
|
63
72
|
var areEquivalentLinks = linkTextUrl.hostname === hrefUrl.hostname && linkTextUrl.pathname === hrefUrl.pathname && linkTextUrl.search === hrefUrl.search && linkTextUrl.username === hrefUrl.username && linkTextUrl.password === hrefUrl.password && areProtocolsEquivalent;
|
|
64
73
|
if (!areEquivalentLinks) {
|
|
65
|
-
|
|
66
|
-
setUnsafeLinkText(linkText);
|
|
67
|
-
href && setUrl(href);
|
|
68
|
-
setIsOpen(true);
|
|
69
|
-
sendAnalyticsEvent();
|
|
74
|
+
return false;
|
|
70
75
|
}
|
|
76
|
+
return true;
|
|
77
|
+
};
|
|
78
|
+
var showSafetyWarningModal = function showSafetyWarningModal(event, href) {
|
|
79
|
+
event.preventDefault();
|
|
80
|
+
var anchor = event.currentTarget;
|
|
81
|
+
var linkText = anchor.innerText;
|
|
82
|
+
setUnsafeLinkText(linkText);
|
|
83
|
+
href && setUrl(href);
|
|
84
|
+
setIsOpen(true);
|
|
85
|
+
sendWarningModalViewedEvent();
|
|
71
86
|
};
|
|
72
87
|
var onClose = function onClose() {
|
|
73
88
|
setIsOpen(false);
|
|
@@ -76,14 +91,16 @@ export var useLinkWarningModal = function useLinkWarningModal() {
|
|
|
76
91
|
};
|
|
77
92
|
var onContinue = function onContinue() {
|
|
78
93
|
onClose();
|
|
79
|
-
|
|
94
|
+
sendContinueClickedEvent();
|
|
95
|
+
url && window.open(url, '_blank', 'noopener noreferrer');
|
|
80
96
|
};
|
|
81
97
|
return {
|
|
82
|
-
|
|
83
|
-
|
|
98
|
+
isLinkSafe: isLinkSafe,
|
|
99
|
+
isOpen: isOpen,
|
|
84
100
|
onClose: onClose,
|
|
85
101
|
onContinue: onContinue,
|
|
86
|
-
|
|
102
|
+
showSafetyWarningModal: showSafetyWarningModal,
|
|
103
|
+
unsafeLinkText: unsafeLinkText,
|
|
87
104
|
url: url
|
|
88
105
|
};
|
|
89
106
|
};
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import _extends from "@babel/runtime/helpers/extends";
|
|
2
2
|
import _objectWithoutProperties from "@babel/runtime/helpers/objectWithoutProperties";
|
|
3
3
|
var _excluded = ["href", "children", "checkSafety", "onClick", "testId"],
|
|
4
|
-
_excluded2 = ["
|
|
4
|
+
_excluded2 = ["isLinkSafe", "showSafetyWarningModal"];
|
|
5
5
|
import React from 'react';
|
|
6
6
|
import { withAnalyticsContext } from '@atlaskit/analytics-next';
|
|
7
7
|
import { name as packageName, version as packageVersion } from '../../version.json';
|
|
@@ -9,6 +9,7 @@ import { withLinkClickedEvent } from '../../utils/analytics/click';
|
|
|
9
9
|
import { LinkAnalyticsContext } from '../../utils/analytics/LinkAnalyticsContext';
|
|
10
10
|
import { useLinkWarningModal } from './LinkWarningModal/hooks/use-link-warning-modal';
|
|
11
11
|
import LinkWarningModal from './LinkWarningModal';
|
|
12
|
+
import { getBooleanFF } from '@atlaskit/platform-feature-flags';
|
|
12
13
|
var PACKAGE_DATA = {
|
|
13
14
|
packageName: packageName,
|
|
14
15
|
packageVersion: packageVersion,
|
|
@@ -25,7 +26,8 @@ var LinkUrl = function LinkUrl(_ref) {
|
|
|
25
26
|
testId = _ref$testId === void 0 ? 'link-with-safety' : _ref$testId,
|
|
26
27
|
props = _objectWithoutProperties(_ref, _excluded);
|
|
27
28
|
var _useLinkWarningModal = useLinkWarningModal(),
|
|
28
|
-
|
|
29
|
+
isLinkSafe = _useLinkWarningModal.isLinkSafe,
|
|
30
|
+
showSafetyWarningModal = _useLinkWarningModal.showSafetyWarningModal,
|
|
29
31
|
linkWarningModalProps = _objectWithoutProperties(_useLinkWarningModal, _excluded2);
|
|
30
32
|
return /*#__PURE__*/React.createElement(React.Fragment, null, /*#__PURE__*/React.createElement(LinkAnalyticsContext, {
|
|
31
33
|
url: href,
|
|
@@ -34,8 +36,25 @@ var LinkUrl = function LinkUrl(_ref) {
|
|
|
34
36
|
"data-testid": testId,
|
|
35
37
|
href: href,
|
|
36
38
|
onClick: function onClick(e) {
|
|
37
|
-
|
|
38
|
-
|
|
39
|
+
if (getBooleanFF('platform.linking-platform.smart-card.should-call-onclick-in-warning-modal-only-when-safe')) {
|
|
40
|
+
if (!checkSafety) {
|
|
41
|
+
_onClick && _onClick(e);
|
|
42
|
+
return;
|
|
43
|
+
}
|
|
44
|
+
|
|
45
|
+
// Only call the onClick if the link is safe
|
|
46
|
+
if (isLinkSafe(e, href)) {
|
|
47
|
+
_onClick && _onClick(e);
|
|
48
|
+
} else {
|
|
49
|
+
showSafetyWarningModal(e, href);
|
|
50
|
+
}
|
|
51
|
+
} else {
|
|
52
|
+
if (checkSafety && !isLinkSafe(e, href)) {
|
|
53
|
+
showSafetyWarningModal(e, href);
|
|
54
|
+
}
|
|
55
|
+
// Call the onClick regardless of the link safety
|
|
56
|
+
_onClick && _onClick(e);
|
|
57
|
+
}
|
|
39
58
|
}
|
|
40
59
|
}, props), children)), checkSafety && /*#__PURE__*/React.createElement(LinkWarningModal, linkWarningModalProps));
|
|
41
60
|
};
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { MouseEvent } from 'react';
|
|
2
2
|
export declare const useLinkWarningModal: () => {
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
isLinkSafe: (event: MouseEvent<HTMLAnchorElement>, href: string | undefined) => boolean;
|
|
4
|
+
isOpen: boolean;
|
|
5
5
|
onClose: () => void;
|
|
6
6
|
onContinue: () => void;
|
|
7
|
-
|
|
7
|
+
showSafetyWarningModal: (event: MouseEvent<HTMLAnchorElement>, href: string | undefined) => void;
|
|
8
|
+
unsafeLinkText: string | null;
|
|
8
9
|
url: string | null;
|
|
9
10
|
};
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { MouseEvent } from 'react';
|
|
2
2
|
export declare const useLinkWarningModal: () => {
|
|
3
|
-
|
|
4
|
-
|
|
3
|
+
isLinkSafe: (event: MouseEvent<HTMLAnchorElement>, href: string | undefined) => boolean;
|
|
4
|
+
isOpen: boolean;
|
|
5
5
|
onClose: () => void;
|
|
6
6
|
onContinue: () => void;
|
|
7
|
-
|
|
7
|
+
showSafetyWarningModal: (event: MouseEvent<HTMLAnchorElement>, href: string | undefined) => void;
|
|
8
|
+
unsafeLinkText: string | null;
|
|
8
9
|
url: string | null;
|
|
9
10
|
};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@atlaskit/smart-card",
|
|
3
|
-
"version": "26.5.
|
|
3
|
+
"version": "26.5.14",
|
|
4
4
|
"description": "Smart card component",
|
|
5
5
|
"publishConfig": {
|
|
6
6
|
"registry": "https://registry.npmjs.org/"
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
"@atlaskit/icon-priority": "^6.3.0",
|
|
44
44
|
"@atlaskit/in-product-testing": "^0.2.0",
|
|
45
45
|
"@atlaskit/link-analytics": "^8.0.2",
|
|
46
|
-
"@atlaskit/link-client-extension": "^1.2.
|
|
46
|
+
"@atlaskit/link-client-extension": "^1.2.1",
|
|
47
47
|
"@atlaskit/linking-common": "^2.15.0",
|
|
48
48
|
"@atlaskit/linking-types": "^6.0.0",
|
|
49
49
|
"@atlaskit/logo": "^13.14.0",
|
|
@@ -55,7 +55,7 @@
|
|
|
55
55
|
"@atlaskit/popup": "^1.7.0",
|
|
56
56
|
"@atlaskit/spinner": "^15.5.0",
|
|
57
57
|
"@atlaskit/theme": "^12.5.0",
|
|
58
|
-
"@atlaskit/tokens": "^1.
|
|
58
|
+
"@atlaskit/tokens": "^1.6.0",
|
|
59
59
|
"@atlaskit/tooltip": "^17.8.0",
|
|
60
60
|
"@atlaskit/ufo": "^0.2.0",
|
|
61
61
|
"@babel/runtime": "^7.0.0",
|
|
@@ -149,6 +149,9 @@
|
|
|
149
149
|
},
|
|
150
150
|
"platform.linking-platform.smart-card.enable-block-card-clicks-opening-in-same-tab": {
|
|
151
151
|
"type": "boolean"
|
|
152
|
+
},
|
|
153
|
+
"platform.linking-platform.smart-card.should-call-onclick-in-warning-modal-only-when-safe": {
|
|
154
|
+
"type": "boolean"
|
|
152
155
|
}
|
|
153
156
|
},
|
|
154
157
|
"prettier": "@atlassian/atlassian-frontend-prettier-config-1.0.1",
|