UNPKG

4.13 kBJavaScriptView Raw
1"use strict";
2
3var _interopRequireDefault = require("@babel/runtime-corejs2/helpers/interopRequireDefault");
4
5exports.__esModule = true;
6exports.default = void 0;
7
8var _extends2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/extends"));
9
10var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/objectWithoutPropertiesLoose"));
11
12var _inheritsLoose2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/inheritsLoose"));
13
14var _assertThisInitialized2 = _interopRequireDefault(require("@babel/runtime-corejs2/helpers/assertThisInitialized"));
15
16var _react = _interopRequireDefault(require("react"));
17
18var _propTypes = _interopRequireDefault(require("prop-types"));
19
20var _elementType = _interopRequireDefault(require("prop-types-extra/lib/elementType"));
21
22var _createChainedFunction = _interopRequireDefault(require("./utils/createChainedFunction"));
23
24var propTypes = {
25 href: _propTypes.default.string,
26 onClick: _propTypes.default.func,
27 onKeyDown: _propTypes.default.func,
28 disabled: _propTypes.default.bool,
29 role: _propTypes.default.string,
30 tabIndex: _propTypes.default.oneOfType([_propTypes.default.number, _propTypes.default.string]),
31
32 /**
33 * this is sort of silly but needed for Button
34 */
35 componentClass: _elementType.default
36};
37var defaultProps = {
38 componentClass: 'a'
39};
40
41function isTrivialHref(href) {
42 return !href || href.trim() === '#';
43}
44/**
45 * There are situations due to browser quirks or Bootstrap CSS where
46 * an anchor tag is needed, when semantically a button tag is the
47 * better choice. SafeAnchor ensures that when an anchor is used like a
48 * button its accessible. It also emulates input `disabled` behavior for
49 * links, which is usually desirable for Buttons, NavItems, MenuItems, etc.
50 */
51
52
53var SafeAnchor =
54/*#__PURE__*/
55function (_React$Component) {
56 (0, _inheritsLoose2.default)(SafeAnchor, _React$Component);
57
58 function SafeAnchor(props, context) {
59 var _this;
60
61 _this = _React$Component.call(this, props, context) || this;
62 _this.handleClick = _this.handleClick.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)));
63 _this.handleKeyDown = _this.handleKeyDown.bind((0, _assertThisInitialized2.default)((0, _assertThisInitialized2.default)(_this)));
64 return _this;
65 }
66
67 var _proto = SafeAnchor.prototype;
68
69 _proto.handleClick = function handleClick(event) {
70 var _this$props = this.props,
71 disabled = _this$props.disabled,
72 href = _this$props.href,
73 onClick = _this$props.onClick;
74
75 if (disabled || isTrivialHref(href)) {
76 event.preventDefault();
77 }
78
79 if (disabled) {
80 event.stopPropagation();
81 return;
82 }
83
84 if (onClick) {
85 onClick(event);
86 }
87 };
88
89 _proto.handleKeyDown = function handleKeyDown(event) {
90 if (event.key === ' ') {
91 event.preventDefault();
92 this.handleClick(event);
93 }
94 };
95
96 _proto.render = function render() {
97 var _this$props2 = this.props,
98 Component = _this$props2.componentClass,
99 disabled = _this$props2.disabled,
100 onKeyDown = _this$props2.onKeyDown,
101 props = (0, _objectWithoutPropertiesLoose2.default)(_this$props2, ["componentClass", "disabled", "onKeyDown"]);
102
103 if (isTrivialHref(props.href)) {
104 props.role = props.role || 'button'; // we want to make sure there is a href attribute on the node
105 // otherwise, the cursor incorrectly styled (except with role='button')
106
107 props.href = props.href || '#';
108 }
109
110 if (disabled) {
111 props.tabIndex = -1;
112 props.style = (0, _extends2.default)({
113 pointerEvents: 'none'
114 }, props.style);
115 }
116
117 return _react.default.createElement(Component, (0, _extends2.default)({}, props, {
118 onClick: this.handleClick,
119 onKeyDown: (0, _createChainedFunction.default)(this.handleKeyDown, onKeyDown)
120 }));
121 };
122
123 return SafeAnchor;
124}(_react.default.Component);
125
126SafeAnchor.propTypes = propTypes;
127SafeAnchor.defaultProps = defaultProps;
128var _default = SafeAnchor;
129exports.default = _default;
130module.exports = exports["default"];
\No newline at end of file