UNPKG

2.42 kBJavaScriptView Raw
1"use strict";
2
3var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
4
5exports.__esModule = true;
6exports.default = void 0;
7
8var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends"));
9
10var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose"));
11
12var _react = _interopRequireDefault(require("react"));
13
14var _createChainedFunction = _interopRequireDefault(require("./createChainedFunction"));
15
16function isTrivialHref(href) {
17 return !href || href.trim() === '#';
18}
19/**
20 * There are situations due to browser quirks or Bootstrap CSS where
21 * an anchor tag is needed, when semantically a button tag is the
22 * better choice. SafeAnchor ensures that when an anchor is used like a
23 * button its accessible. It also emulates input `disabled` behavior for
24 * links, which is usually desirable for Buttons, NavItems, DropdownItems, etc.
25 */
26
27
28var SafeAnchor = _react.default.forwardRef(function (_ref, ref) {
29 var _ref$as = _ref.as,
30 Component = _ref$as === void 0 ? 'a' : _ref$as,
31 disabled = _ref.disabled,
32 onKeyDown = _ref.onKeyDown,
33 props = (0, _objectWithoutPropertiesLoose2.default)(_ref, ["as", "disabled", "onKeyDown"]);
34
35 var handleClick = function handleClick(event) {
36 var href = props.href,
37 onClick = props.onClick;
38
39 if (disabled || isTrivialHref(href)) {
40 event.preventDefault();
41 }
42
43 if (disabled) {
44 event.stopPropagation();
45 return;
46 }
47
48 if (onClick) {
49 onClick(event);
50 }
51 };
52
53 var handleKeyDown = function handleKeyDown(event) {
54 if (event.key === ' ') {
55 event.preventDefault();
56 handleClick(event);
57 }
58 };
59
60 if (isTrivialHref(props.href)) {
61 props.role = props.role || 'button'; // we want to make sure there is a href attribute on the node
62 // otherwise, the cursor incorrectly styled (except with role='button')
63
64 props.href = props.href || '#';
65 }
66
67 if (disabled) {
68 props.tabIndex = -1;
69 props['aria-disabled'] = true;
70 }
71
72 return _react.default.createElement(Component, (0, _extends2.default)({
73 ref: ref
74 }, props, {
75 onClick: handleClick,
76 onKeyDown: (0, _createChainedFunction.default)(handleKeyDown, onKeyDown)
77 }));
78});
79
80SafeAnchor.displayName = 'SafeAnchor';
81var _default = SafeAnchor;
82exports.default = _default;
83module.exports = exports["default"];
\No newline at end of file