UNPKG

reduxen-react-dom

Version:

React bindings for reduxen, a redux-first router

98 lines (77 loc) 2.83 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); var _react = require("react"); var _react2 = _interopRequireDefault(_react); var _propTypes = require("prop-types"); var _propTypes2 = _interopRequireDefault(_propTypes); var _match = require("reduxen/match"); var _match2 = _interopRequireDefault(_match); var _parseUrl = require("reduxen/parseUrl"); var _parseUrl2 = _interopRequireDefault(_parseUrl); var _RouterProvider = require("./RouterProvider.js"); function _interopRequireDefault(obj) { return obj && obj.__esModule ? obj : { default: obj }; } var Link = function Link(_ref) { var style = _ref.style, className = _ref.className, activeClassName = _ref.activeClassName, activePattern = _ref.activePattern, to = _ref.to, replace = _ref.replace, children = _ref.children; return _react2.default.createElement( _RouterProvider.Consumer, null, function (_ref2) { var router = _ref2.router, dispatch = _ref2.dispatch, prefix = _ref2.prefix; var linkPath = (0, _parseUrl2.default)(to).path; var currentPath = router.path; var finalActivePattern = activePattern || linkPath; var isActive = finalActivePattern ? (0, _match2.default)(finalActivePattern, currentPath) : false; var finalClassName = [className, isActive ? activeClassName : ""].filter(function (item) { return item; }).join(" "); return _react2.default.createElement( "a", { href: to, style: style, className: finalClassName, onClick: function onClick(event) { if (event.defaultPrevented || event.metaKey || event.altKey || event.ctrlKey || event.shiftKey || event.button !== 0) { return true; } event.preventDefault(); if (to[0] === "/" || to[0] === "?" || to[0] === "#") { dispatch({ type: replace ? prefix + "REPLACE" : prefix + "PUSH", payload: (0, _parseUrl2.default)(to) }); } } }, children ); } ); }; Link.propTypes = { style: _propTypes2.default.object, className: _propTypes2.default.string, activeClassName: _propTypes2.default.string, activePattern: _propTypes2.default.string, to: process.env.NODE_ENV === "production" ? function () {} : function (props) { if (typeof props.to !== "string") { return new Error("Non-string prop `to` supplied to Link"); } if (!["/", "?", "#"].includes(props.to[0])) { return new Error("Invalid prop `to` supplied to Link: `to` prop should start with '/', '?' or '#'."); } }, replace: _propTypes2.default.bool, children: _propTypes2.default.node }; exports.default = Link;