UNPKG

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