196 lines
6.9 KiB
JavaScript
196 lines
6.9 KiB
JavaScript
(function (global, factory) {
|
|
typeof exports === 'object' && typeof module !== 'undefined' ? factory(exports, require('react'), require('prop-types'), require('react-router')) :
|
|
typeof define === 'function' && define.amd ? define(['exports', 'react', 'prop-types', 'react-router'], factory) :
|
|
(factory((global.ReactRouterRedux = {}),global.React,global.PropTypes,global.ReactRouter));
|
|
}(this, (function (exports,React,PropTypes,reactRouter) { 'use strict';
|
|
|
|
var React__default = 'default' in React ? React['default'] : React;
|
|
PropTypes = PropTypes && PropTypes.hasOwnProperty('default') ? PropTypes['default'] : PropTypes;
|
|
|
|
var _extends = Object.assign || function (target) { for (var i = 1; i < arguments.length; i++) { var source = arguments[i]; for (var key in source) { if (Object.prototype.hasOwnProperty.call(source, key)) { target[key] = source[key]; } } } return target; };
|
|
|
|
/**
|
|
* This action type will be dispatched when your history
|
|
* receives a location change.
|
|
*/
|
|
var LOCATION_CHANGE = '@@router/LOCATION_CHANGE';
|
|
|
|
var initialState = {
|
|
location: null
|
|
|
|
/**
|
|
* This reducer will update the state with the most recent location history
|
|
* has transitioned to. This may not be in sync with the router, particularly
|
|
* if you have asynchronously-loaded routes, so reading from and relying on
|
|
* this state is discouraged.
|
|
*/
|
|
};function routerReducer() {
|
|
var state = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : initialState;
|
|
|
|
var _ref = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {},
|
|
type = _ref.type,
|
|
payload = _ref.payload;
|
|
|
|
if (type === LOCATION_CHANGE) {
|
|
return _extends({}, state, { location: payload });
|
|
}
|
|
|
|
return state;
|
|
}
|
|
|
|
function _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError("Cannot call a class as a function"); } }
|
|
|
|
function _possibleConstructorReturn(self, call) { if (!self) { throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); } return call && (typeof call === "object" || typeof call === "function") ? call : self; }
|
|
|
|
function _inherits(subClass, superClass) { if (typeof superClass !== "function" && superClass !== null) { throw new TypeError("Super expression must either be null or a function, not " + typeof superClass); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, enumerable: false, writable: true, configurable: true } }); if (superClass) Object.setPrototypeOf ? Object.setPrototypeOf(subClass, superClass) : subClass.__proto__ = superClass; }
|
|
|
|
var ConnectedRouter = function (_Component) {
|
|
_inherits(ConnectedRouter, _Component);
|
|
|
|
function ConnectedRouter() {
|
|
var _temp, _this, _ret;
|
|
|
|
_classCallCheck(this, ConnectedRouter);
|
|
|
|
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
|
|
args[_key] = arguments[_key];
|
|
}
|
|
|
|
return _ret = (_temp = (_this = _possibleConstructorReturn(this, _Component.call.apply(_Component, [this].concat(args))), _this), _this.handleLocationChange = function (location) {
|
|
_this.store.dispatch({
|
|
type: LOCATION_CHANGE,
|
|
payload: location
|
|
});
|
|
}, _temp), _possibleConstructorReturn(_this, _ret);
|
|
}
|
|
|
|
ConnectedRouter.prototype.componentWillMount = function componentWillMount() {
|
|
var _props = this.props,
|
|
propsStore = _props.store,
|
|
history = _props.history,
|
|
isSSR = _props.isSSR;
|
|
|
|
this.store = propsStore || this.context.store;
|
|
this.handleLocationChange(history.location);
|
|
|
|
if (!isSSR) this.unsubscribeFromHistory = history.listen(this.handleLocationChange);
|
|
};
|
|
|
|
ConnectedRouter.prototype.componentWillUnmount = function componentWillUnmount() {
|
|
if (this.unsubscribeFromHistory) this.unsubscribeFromHistory();
|
|
};
|
|
|
|
ConnectedRouter.prototype.render = function render() {
|
|
return React__default.createElement(reactRouter.Router, this.props);
|
|
};
|
|
|
|
return ConnectedRouter;
|
|
}(React.Component);
|
|
|
|
ConnectedRouter.propTypes = {
|
|
store: PropTypes.object,
|
|
history: PropTypes.object.isRequired,
|
|
children: PropTypes.node,
|
|
isSSR: PropTypes.bool
|
|
};
|
|
ConnectedRouter.contextTypes = {
|
|
store: PropTypes.object
|
|
};
|
|
|
|
var getLocation = function getLocation(state) {
|
|
return state.router.location;
|
|
};
|
|
|
|
var createMatchSelector = function createMatchSelector(path) {
|
|
var lastPathname = null;
|
|
var lastMatch = null;
|
|
return function (state) {
|
|
var _ref = getLocation(state) || {},
|
|
pathname = _ref.pathname;
|
|
|
|
if (pathname === lastPathname) {
|
|
return lastMatch;
|
|
}
|
|
lastPathname = pathname;
|
|
var match = reactRouter.matchPath(pathname, path);
|
|
if (!match || !lastMatch || match.url !== lastMatch.url) {
|
|
lastMatch = match;
|
|
}
|
|
return lastMatch;
|
|
};
|
|
};
|
|
|
|
/**
|
|
* This action type will be dispatched by the history actions below.
|
|
* If you're writing a middleware to watch for navigation events, be sure to
|
|
* look for actions of this type.
|
|
*/
|
|
var CALL_HISTORY_METHOD = '@@router/CALL_HISTORY_METHOD';
|
|
|
|
function updateLocation(method) {
|
|
return function () {
|
|
for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) {
|
|
args[_key] = arguments[_key];
|
|
}
|
|
|
|
return {
|
|
type: CALL_HISTORY_METHOD,
|
|
payload: { method: method, args: args }
|
|
};
|
|
};
|
|
}
|
|
|
|
/**
|
|
* These actions correspond to the history API.
|
|
* The associated routerMiddleware will capture these events before they get to
|
|
* your reducer and reissue them as the matching function on your history.
|
|
*/
|
|
var push = updateLocation('push');
|
|
var replace = updateLocation('replace');
|
|
var go = updateLocation('go');
|
|
var goBack = updateLocation('goBack');
|
|
var goForward = updateLocation('goForward');
|
|
|
|
var routerActions = { push: push, replace: replace, go: go, goBack: goBack, goForward: goForward };
|
|
|
|
/**
|
|
* This middleware captures CALL_HISTORY_METHOD actions to redirect to the
|
|
* provided history object. This will prevent these actions from reaching your
|
|
* reducer or any middleware that comes after this one.
|
|
*/
|
|
function routerMiddleware(history) {
|
|
return function () {
|
|
return function (next) {
|
|
return function (action) {
|
|
if (action.type !== CALL_HISTORY_METHOD) {
|
|
return next(action);
|
|
}
|
|
|
|
var _action$payload = action.payload,
|
|
method = _action$payload.method,
|
|
args = _action$payload.args;
|
|
|
|
history[method].apply(history, args);
|
|
};
|
|
};
|
|
};
|
|
}
|
|
|
|
exports.ConnectedRouter = ConnectedRouter;
|
|
exports.routerMiddleware = routerMiddleware;
|
|
exports.getLocation = getLocation;
|
|
exports.createMatchSelector = createMatchSelector;
|
|
exports.LOCATION_CHANGE = LOCATION_CHANGE;
|
|
exports.routerReducer = routerReducer;
|
|
exports.CALL_HISTORY_METHOD = CALL_HISTORY_METHOD;
|
|
exports.push = push;
|
|
exports.replace = replace;
|
|
exports.go = go;
|
|
exports.goBack = goBack;
|
|
exports.goForward = goForward;
|
|
exports.routerActions = routerActions;
|
|
|
|
Object.defineProperty(exports, '__esModule', { value: true });
|
|
|
|
})));
|