Вот как бы я это сделал. Прежде всего, вам не нужно подключать ваш app.js для хранения, так как он не использует никакое состояние или диспетчерское действие. Сделайте это функциональным компонентом.
const App = () => {
render() {
return (
<BrowserRouter>
<Root>
<Route exact path="/" component={Home}/>
<Route exact path="/login" component={Login}/>
<Route exact path="/register" component={Register}/>
<Route exact path='/books' component={Books}/>
<Route path='/books/:id' component={BookDetail}/>
</Root>
</BrowserRouter>
);
};
}
export default App;
Рекомендуется добавлять регистр по умолчанию в оператор switch.
const saveUserData = (state = {
user: {},
display_errors: false,
errors: {}
}, action) => {
switch (action.type) {
case "UPDATE_USER":
state = {
...state,
user: action.payload
};
case "DISPLAY_ERRORS":
state = {
...state,
errors: action.payload,
display_errors: true
};
default:
return state;
}
};
Создайте отдельный файл действий и переместите запрос на выборку в файле actions.js
export default updateUser = (email, password, remember_me) => dispatch => {
fetch(url, {
method: 'POST',
headers: new Headers({
Accept: 'application/json',
'Content-Type': 'application/json',
}),
body: JSON.stringify({
email: email,
password: password,
remember_me: remember_me
}),
})
.then(res => res.json()).
.then(response => {
if (typeof response.access_token == "undefined")
dispatch({type: DISPLAY_ERRORS, payload: response.error.user_authentication });
else{
localStorage.setItem('jwtToken', response.access_token);
}
});
.catch(error => console.error('Error:', error))
}
Затем вы можете импортировать этот файл действия и получить доступ к updateUser, где бы вы ни захотели его использовать.
import { updateUser } from "action.js";
//now you have access to this function
this.props.updateUser(email, password, remember_me);
const mapStateToProps = state => ({
//state.....
})
export default connect(mapStateToProps, { updateUser })(Login);