reduxen-react-dom
Version:
React bindings for reduxen, a redux-first router
98 lines (77 loc) • 2.83 kB
JavaScript
;
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;