Redux Saga

Instalação

$ yarn add redux-saga

Modelo de Configuração

Arquivo exemplo src/store/modules/cart/sagas.js

import { call, put, all, takeLatest } from 'redux-saga/effects';
import api from '../../../services/api';
import { addToCartSuccess } from './actions';
function* addToCart({ id }) { // O asterisco seria como um "async function addToCart"
const response = yield call(api.get, `/products/${id}`); // O yield seria como um "await call"
yield put(addToCartSuccess(response.data));
}
export default all([takeLatest('@cart/ADD_REQUEST', addToCart)]);

Arquivo de configuração do Redux

Arquivo src/store/index.js

import { createStore, applyMiddleware, compose } from 'redux';
import createSagaMiddleware from 'redux-saga';
import rootReducer from './modules/rootReducer';
import rootSaga from './modules/rootSaga';
const sagaMiddleware = createSagaMiddleware();
const enhancer =
process.env.NODE_ENV === 'development'
? compose(console.tron.createEnhancer(), applyMiddleware(sagaMiddleware))
: applyMiddleware(sagaMiddleware);
const store = createStore(rootReducer, enhancer);
sagaMiddleware.run(rootSaga);
export default store;

History

Instalação

$ yarn add history

Arquivo service/history.js

import { createBrowserHistory } from 'history';
const history = createBrowserHistory();
export default history;

Arquivo App.js

A importação BrowserRouter vira apenas Router

import { Router } from 'react-router-dom';

Importação da configuração de serviço do history

import history from './services/history';

Substituição dos BrowserRouter por router passando o parâmetro history

<Router history={history}>
...
</Router>