import _extends from "@babel/runtime-corejs2/helpers/esm/extends"; import _objectWithoutPropertiesLoose from "@babel/runtime-corejs2/helpers/esm/objectWithoutPropertiesLoose"; import _inheritsLoose from "@babel/runtime-corejs2/helpers/esm/inheritsLoose"; import _assertThisInitialized from "@babel/runtime-corejs2/helpers/esm/assertThisInitialized"; import React from 'react'; import PropTypes from 'prop-types'; import elementType from 'prop-types-extra/lib/elementType'; import createChainedFunction from './utils/createChainedFunction'; var propTypes = { href: PropTypes.string, onClick: PropTypes.func, onKeyDown: PropTypes.func, disabled: PropTypes.bool, role: PropTypes.string, tabIndex: PropTypes.oneOfType([PropTypes.number, PropTypes.string]), /** * this is sort of silly but needed for Button */ componentClass: elementType }; var defaultProps = { componentClass: 'a' }; function isTrivialHref(href) { return !href || href.trim() === '#'; } /** * There are situations due to browser quirks or Bootstrap CSS where * an anchor tag is needed, when semantically a button tag is the * better choice. SafeAnchor ensures that when an anchor is used like a * button its accessible. It also emulates input `disabled` behavior for * links, which is usually desirable for Buttons, NavItems, MenuItems, etc. */ var SafeAnchor = /*#__PURE__*/ function (_React$Component) { _inheritsLoose(SafeAnchor, _React$Component); function SafeAnchor(props, context) { var _this; _this = _React$Component.call(this, props, context) || this; _this.handleClick = _this.handleClick.bind(_assertThisInitialized(_assertThisInitialized(_this))); _this.handleKeyDown = _this.handleKeyDown.bind(_assertThisInitialized(_assertThisInitialized(_this))); return _this; } var _proto = SafeAnchor.prototype; _proto.handleClick = function handleClick(event) { var _this$props = this.props, disabled = _this$props.disabled, href = _this$props.href, onClick = _this$props.onClick; if (disabled || isTrivialHref(href)) { event.preventDefault(); } if (disabled) { event.stopPropagation(); return; } if (onClick) { onClick(event); } }; _proto.handleKeyDown = function handleKeyDown(event) { if (event.key === ' ') { event.preventDefault(); this.handleClick(event); } }; _proto.render = function render() { var _this$props2 = this.props, Component = _this$props2.componentClass, disabled = _this$props2.disabled, onKeyDown = _this$props2.onKeyDown, props = _objectWithoutPropertiesLoose(_this$props2, ["componentClass", "disabled", "onKeyDown"]); if (isTrivialHref(props.href)) { props.role = props.role || 'button'; // we want to make sure there is a href attribute on the node // otherwise, the cursor incorrectly styled (except with role='button') props.href = props.href || '#'; } if (disabled) { props.tabIndex = -1; props.style = _extends({ pointerEvents: 'none' }, props.style); } return React.createElement(Component, _extends({}, props, { onClick: this.handleClick, onKeyDown: createChainedFunction(this.handleKeyDown, onKeyDown) })); }; return SafeAnchor; }(React.Component); SafeAnchor.propTypes = propTypes; SafeAnchor.defaultProps = defaultProps; export default SafeAnchor;