UNPKG

react-router

Version:

A complete routing library for React.js

87 lines (68 loc) 1.94 kB
var _activeRoutes = []; var _activeParams = {}; var _activeQuery = {}; function routeIsActive(routeName) { return _activeRoutes.some(function (route) { return route.props.name === routeName; }); } function paramsAreActive(params) { for (var property in params) { if (_activeParams[property] !== String(params[property])) return false; } return true; } function queryIsActive(query) { for (var property in query) { if (_activeQuery[property] !== String(query[property])) return false; } return true; } var EventEmitter = require('event-emitter'); var _events = EventEmitter(); function notifyChange() { _events.emit('change'); } /** * The ActiveStore keeps track of which routes, URL and query parameters are * currently active on a page. <Link>s subscribe to the ActiveStore to know * whether or not they are active. */ var ActiveStore = { /** * Adds a listener that will be called when this store changes. */ addChangeListener: function (listener) { _events.on('change', listener); }, /** * Removes the given change listener. */ removeChangeListener: function (listener) { _events.off('change', listener); }, /** * Updates the currently active state and notifies all listeners. * This is automatically called by routes as they become active. */ updateState: function (state) { state = state || {}; _activeRoutes = state.activeRoutes || []; _activeParams = state.activeParams || {}; _activeQuery = state.activeQuery || {}; notifyChange(); }, /** * Returns true if the route with the given name, URL parameters, and query * are all currently active. */ isActive: function (routeName, params, query) { var isActive = routeIsActive(routeName) && paramsAreActive(params); if (query) return isActive && queryIsActive(query); return isActive; } }; module.exports = ActiveStore;