react-navigation-redux-helpers
Advanced tools
Comparing version 1.0.1 to 1.0.2
{ | ||
"name": "react-navigation-redux-helpers", | ||
"description": "Redux middleware and utils for React Navigation", | ||
"version": "1.0.1", | ||
"version": "1.0.2", | ||
"main": "src/index.js", | ||
@@ -18,3 +18,8 @@ "author": "Ashoat Tevosyan (https://github.com/ashoat)", | ||
}, | ||
"files": [ "src" ] | ||
"files": [ | ||
"src" | ||
], | ||
"peerDependencies": { | ||
"react-navigation": "^1.1.2" | ||
} | ||
} |
// @flow | ||
import type { | ||
NavigationEventCallback, | ||
NavigationState, | ||
} from 'react-navigation'; | ||
import type { Middleware } from 'redux'; | ||
import { createNavigationReducer } from './reducer'; | ||
import invariant from 'invariant'; | ||
const reduxSubscribers = new Map(); | ||
function createReactNavigationReduxMiddleware<State: {}>( | ||
key: string, | ||
navStateSelector: (state: State) => NavigationState, | ||
): Middleware<State, *, *> { | ||
reduxSubscribers.set(key, new Set()); | ||
return store => next => action => { | ||
const oldState = store.getState(); | ||
const result = next(action); | ||
const newState = store.getState(); | ||
const subscribers = reduxSubscribers.get(key); | ||
invariant(subscribers, `subscribers set should exist for ${key}`); | ||
subscribers.forEach(subscriber => | ||
subscriber({ | ||
type: 'action', | ||
action, | ||
state: navStateSelector(newState), | ||
lastState: navStateSelector(oldState), | ||
}) | ||
); | ||
return result; | ||
}; | ||
} | ||
function createReduxBoundAddListener(key: string) { | ||
invariant( | ||
reduxSubscribers.has(key), | ||
"Cannot listen for a key that isn't associated with a Redux store. " + | ||
'First call `createReactNavigationReduxMiddleware` so that we know ' + | ||
'when to trigger your listener.' | ||
); | ||
return (eventName: string, handler: NavigationEventCallback) => { | ||
if (eventName !== 'action') { | ||
return { remove: () => {} }; | ||
} | ||
const subscribers = reduxSubscribers.get(key); | ||
invariant(subscribers, `subscribers set should exist for ${key}`); | ||
subscribers.add(handler); | ||
return { | ||
remove: () => { | ||
subscribers.delete(handler); | ||
}, | ||
}; | ||
}; | ||
} | ||
export { | ||
createReactNavigationReduxMiddleware, | ||
createReduxBoundAddListener, | ||
}; | ||
export * from './types'; | ||
export * from './middleware'; | ||
export { createNavigationReducer }; |
7
111
5785
2