B-S-F
This is easy way to dispatch
We even don't need to separate those three action status for each action request.
something like:
โโโโโโ export const ORDER_DETAILS_REQUEST = 'ORDER_DETAILS_REQUEST';
โโโโโโ export const ORDER_DETAILS_SUCCESS = 'ORDER_DETAILS_SUCCESS';
โโโโโโ export const ORDER_DETAILS_FAIL = 'ORDER_DETAILS_FAIL';
In below, we using @reduxjs/toolkit as redux framework
store/api.js
โโโโimport { createAction } from "@reduxjs/toolkit";
โโโโexport const apiCallBegan = createAction("api/CallBegan");
โโโโexport const apiCallSuccess = createAction("api/CallSuccess");
โโโโexport const apiCallFaild = createAction("api/CallFaild");
store/middleware/api.js
โโโโimport axios from 'axios';
โโโโimport * as actions from '../api';
โโโโconst api = ({ dispatch }) => (next) => async (action) => {
โโโโ if (action.type !== actions.apiCallBegan.type) return next(action);
โโโโ const { url, method, onStart, data, onSuccess, onError } = action.payload;
โโโโ if (onStart) dispatch({ type: onStart });
โโโโ next(action);
โโโโ try {
โโโโ const response = await axios.request({
โโโโ baseURL: 'http://localhost:9001/api',
โโโโ url,
โโโโ method,
โโโโ data,
โโโโ });
โโโโ // General
โโโโ dispatch(actions.apiCallSuccess(response.data));
โโโโ // Specific
โโโโ if (onSuccess) dispatch({ type: onSuccess, payload: response.data });
โโโโ } catch (error) {
โโโโ // General
โโโโ dispatch(actions.apiCallFaild(error.message));
โโโโ // Specific
โโโโ if (onError) dispatch({ type: onError, payload: error.message });
โโโโ }
โโโโ};
โโโโexport default api;
store/configureStore.js
โโโโimport { configureStore, getDefaultMiddleware } from '@reduxjs/toolkit';
โโโโimport reducer from './reducer';
โโโโimport api from './middleware/api';
โโโโexport default function () {
โโโโ return configureStore({
โโโโ reducer,
โโโโ middleware: [
โโโโ ...getDefaultMiddleware(),
โโโโ api,
โโโโ ],
โโโโ });
โโโโ}
implement
store/bug.js
โโโโconst slice = createSlice({
โโโโ name: 'bugs',
โโโโ initialState: {
โโโโ list: [],
โโโโ loading: false,
โโโโ lastFetch: null,
โโโโ },
โโโโ reducers: {
โโโโ bugAdded: (bugs, action) => {
โโโโ bugs.list.push(action.payload);
โโโโ }
โโโโ },
โโโโ});
โโโโexport const addBug = (bug) =>
โโโโ apiCallBegan({
โโโโ url,
โโโโ method: 'post',
โโโโ data: bug,
โโโโ onSuccess: bugAdded.type,
โโโโ });
When using jest to testing your app,
should remember,
api middleware must be above all others middleware except โฆgetDefaultMiddleware().
if you don't,
infinite error will comming !