2017-01-26 11:49:39 -08:00
|
|
|
|
|
|
|
import React from 'react';
|
|
|
|
|
2017-02-01 16:27:51 -05:00
|
|
|
import { NavigationActions, addNavigationHelpers } from 'react-navigation';
|
2017-01-26 11:49:39 -08:00
|
|
|
|
|
|
|
function getAction(router, path, params) {
|
|
|
|
const action = router.getActionForPathAndParams(path, params);
|
|
|
|
if (action) {
|
|
|
|
return action;
|
|
|
|
}
|
2017-02-01 16:27:51 -05:00
|
|
|
return NavigationActions.navigate({
|
2017-01-26 11:49:39 -08:00
|
|
|
params: { path },
|
|
|
|
routeName: 'NotFound',
|
2017-02-01 16:27:51 -05:00
|
|
|
});
|
2017-01-26 11:49:39 -08:00
|
|
|
}
|
|
|
|
|
|
|
|
module.exports = (NavigationAwareView) => {
|
|
|
|
const initialAction = getAction(NavigationAwareView.router, window.location.pathname.substr(1));
|
|
|
|
const initialState = NavigationAwareView.router.getStateForAction(initialAction);
|
|
|
|
console.log({initialAction, initialState});
|
|
|
|
|
|
|
|
class NavigationContainer extends React.Component {
|
|
|
|
state = initialState;
|
|
|
|
componentDidMount() {
|
2017-04-13 00:49:08 +02:00
|
|
|
const navigation = addNavigationHelpers({state: this.state.routes[this.state.index], dispatch: this.dispatch});
|
|
|
|
document.title = NavigationAwareView.router.getScreenOptions(navigation).title;
|
2017-01-26 11:49:39 -08:00
|
|
|
window.onpopstate = (e) => {
|
|
|
|
e.preventDefault();
|
|
|
|
const action = getAction(NavigationAwareView.router, window.location.pathname.substr(1));
|
|
|
|
if (action) this.dispatch(action);
|
|
|
|
};
|
|
|
|
}
|
|
|
|
componentWillUpdate(props, state) {
|
2017-04-18 15:25:12 +02:00
|
|
|
const {path, params} = NavigationAwareView.router.getPathAndParamsForState(state);
|
|
|
|
const maybeHash = params && params.hash ? `#${params.hash}` : '';
|
|
|
|
const uri = `/${path}${maybeHash}`;
|
2017-01-26 11:49:39 -08:00
|
|
|
if (window.location.pathname !== uri) {
|
|
|
|
window.history.pushState({}, state.title, uri);
|
|
|
|
}
|
2017-04-13 00:49:08 +02:00
|
|
|
const navigation = addNavigationHelpers({state: state.routes[state.index], dispatch: this.dispatch});
|
|
|
|
document.title = NavigationAwareView.router.getScreenOptions(navigation).title;
|
2017-01-26 11:49:39 -08:00
|
|
|
}
|
2017-04-18 15:25:12 +02:00
|
|
|
componentDidUpdate() {
|
|
|
|
const {params} = NavigationAwareView.router.getPathAndParamsForState(this.state);
|
|
|
|
if (params && params.hash) {
|
|
|
|
document.getElementById(params.hash).scrollIntoView();
|
|
|
|
}
|
|
|
|
}
|
2017-01-26 11:49:39 -08:00
|
|
|
dispatch = (action) => {
|
|
|
|
const state = NavigationAwareView.router.getStateForAction(action, this.state);
|
|
|
|
|
|
|
|
if (!state) {
|
|
|
|
console.log('Dispatched action did not change state: ', {action});
|
|
|
|
} else if (console.group) {
|
|
|
|
console.group('Navigation Dispatch: ');
|
|
|
|
console.log('Action: ', action);
|
|
|
|
console.log('New State: ', state);
|
|
|
|
console.log('Last State: ', this.state);
|
|
|
|
console.groupEnd();
|
|
|
|
} else {
|
|
|
|
console.log('Navigation Dispatch: ', {action, newState: state, lastState: this.state});
|
|
|
|
}
|
|
|
|
|
|
|
|
if (!state) {
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
|
|
|
|
if (state !== this.state) {
|
|
|
|
this.setState(state);
|
|
|
|
return true;
|
|
|
|
}
|
|
|
|
return false;
|
|
|
|
};
|
|
|
|
render() {
|
|
|
|
return <NavigationAwareView navigation={addNavigationHelpers({state: this.state, dispatch: this.dispatch})} />
|
|
|
|
}
|
|
|
|
getURIForAction = (action) => {
|
|
|
|
const state = NavigationAwareView.router.getStateForAction(action, this.state) || this.state;
|
|
|
|
const {path} = NavigationAwareView.router.getPathAndParamsForState(state);
|
|
|
|
return `/${path}`;
|
|
|
|
}
|
|
|
|
getActionForPathAndParams = (path, params) => {
|
|
|
|
return NavigationAwareView.router.getActionForPathAndParams(path, params);
|
|
|
|
}
|
|
|
|
static childContextTypes = {
|
|
|
|
getActionForPathAndParams: React.PropTypes.func.isRequired,
|
|
|
|
getURIForAction: React.PropTypes.func.isRequired,
|
|
|
|
dispatch: React.PropTypes.func.isRequired,
|
|
|
|
};
|
|
|
|
getChildContext() {
|
|
|
|
return {
|
|
|
|
getActionForPathAndParams: this.getActionForPathAndParams,
|
|
|
|
getURIForAction: this.getURIForAction,
|
|
|
|
dispatch: this.dispatch,
|
|
|
|
};
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return NavigationContainer;
|
|
|
|
};
|