UNPKG

@helpscout/hsds-react

Version:

React component library for Help Scout's Design System

121 lines (93 loc) 5.15 kB
"use strict"; var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault"); exports.__esModule = true; exports.wordHasSpaces = wordHasSpaces; exports.default = void 0; var _extends2 = _interopRequireDefault(require("@babel/runtime/helpers/extends")); var _objectWithoutPropertiesLoose2 = _interopRequireDefault(require("@babel/runtime/helpers/objectWithoutPropertiesLoose")); var _react = _interopRequireWildcard(require("react")); var _propTypes = _interopRequireDefault(require("prop-types")); var _getValidProps = _interopRequireDefault(require("@helpscout/react-utils/dist/getValidProps")); var _classnames = _interopRequireDefault(require("classnames")); var _lodash = _interopRequireDefault(require("lodash.isstring")); var _lodash2 = _interopRequireDefault(require("lodash.isnil")); var _Link = require("./Link.css"); var _reactRouterDom = require("react-router-dom"); var _jsxRuntime = require("react/jsx-runtime"); function _getRequireWildcardCache(nodeInterop) { if (typeof WeakMap !== "function") return null; var cacheBabelInterop = new WeakMap(); var cacheNodeInterop = new WeakMap(); return (_getRequireWildcardCache = function _getRequireWildcardCache(nodeInterop) { return nodeInterop ? cacheNodeInterop : cacheBabelInterop; })(nodeInterop); } function _interopRequireWildcard(obj, nodeInterop) { if (!nodeInterop && obj && obj.__esModule) { return obj; } if (obj === null || typeof obj !== "object" && typeof obj !== "function") { return { default: obj }; } var cache = _getRequireWildcardCache(nodeInterop); if (cache && cache.has(obj)) { return cache.get(obj); } var newObj = {}; var hasPropertyDescriptor = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var key in obj) { if (key !== "default" && Object.prototype.hasOwnProperty.call(obj, key)) { var desc = hasPropertyDescriptor ? Object.getOwnPropertyDescriptor(obj, key) : null; if (desc && (desc.get || desc.set)) { Object.defineProperty(newObj, key, desc); } else { newObj[key] = obj[key]; } } } newObj.default = obj; if (cache) { cache.set(obj, newObj); } return newObj; } function noop() {} var WrappedLink = /*#__PURE__*/(0, _react.forwardRef)(function Link(props, ref) { var autoWordWrap = props.autoWordWrap, block = props.block, children = props.children, className = props.className, external = props.external, target = props.target, nodeRef = props.nodeRef, noUnderline = props.noUnderline, wordWrap = props.wordWrap, href = props.href, voidOnClick = props.voidOnClick, to = props.to, rest = (0, _objectWithoutPropertiesLoose2.default)(props, ["autoWordWrap", "block", "children", "className", "external", "target", "nodeRef", "noUnderline", "wordWrap", "href", "voidOnClick", "to"]); var forceWordWrap = wordWrap || autoWordWrap && !wordHasSpaces(children); var componentClassName = (0, _classnames.default)('c-Link', block && 'is-block', forceWordWrap && 'is-word-wrap', noUnderline && 'is-no-underline', className); var isTargetExternal = target && target === '_blank' || external; var linkTarget = target || external ? '_blank' : undefined; var rel = isTargetExternal ? 'noopener noreferrer' : undefined; // eslint-disable-next-line no-script-url var linkHref = voidOnClick ? 'javascript:void(0);' : href; return /*#__PURE__*/(0, _jsxRuntime.jsx)(_Link.LinkUI, (0, _extends2.default)({}, (0, _getValidProps.default)(rest), { className: componentClassName, target: linkTarget, rel: rel, ref: ref || nodeRef, href: linkHref, to: to, as: to ? _reactRouterDom.Link : 'a', children: children })); }); WrappedLink.defaultProps = { autoWordWrap: true, block: false, 'data-cy': 'Link', external: false, href: '#', onBlur: noop, onClick: noop, onFocus: noop, voidOnClick: false }; WrappedLink.propTypes = { /** Custom class names to be added to the component. */ className: _propTypes.default.string, /** Opens link in a new tab. */ external: _propTypes.default.bool, /** Address for the link. Default is `#`. */ href: _propTypes.default.oneOfType([_propTypes.default.string, _propTypes.default.object]), /** Callback function when the component is blurred. */ onBlur: _propTypes.default.func, /** Callback function when the component is clicked. */ onClick: _propTypes.default.func, /** Callback function when the component is focused. */ onFocus: _propTypes.default.func, /** React Router path to navigate on click. */ to: _propTypes.default.string, /** Disables click event. */ voidOnClick: _propTypes.default.bool, autoWordWrap: _propTypes.default.bool, block: _propTypes.default.bool, rel: _propTypes.default.string, noUnderline: _propTypes.default.bool, target: _propTypes.default.string, wordWrap: _propTypes.default.bool, /** Data attr for Cypress tests. */ 'data-cy': _propTypes.default.string }; function wordHasSpaces(word) { if ((0, _lodash2.default)(word) || !(0, _lodash.default)(word)) return false; return word.trim().indexOf(' ') > 0; } var _default = WrappedLink; exports.default = _default;