promiseReducer.js 1.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748
  1. import { put, takeEvery, takeLatest } from "redux-saga/effects";
  2. import { aboutMeWorker } from "../actions/actionAboutMe";
  3. import { catByIdFullWorker } from "../actions/actionCatByIdFull";
  4. import { categoryGoodsWorker } from "../actions/actionCategoryGoods";
  5. import { orderUpdateWorker } from "../actions/actionOrderUpdate";
  6. import { pageStartWorker } from "../actions/actionPageStart";
  7. export function promiseReducer(state = {}, { type, name, status, payload, error }) {
  8. if (type === "PROMISE") {
  9. return {
  10. ...state,
  11. [name]: { status, payload: status === "PROMISE" ? [name].payload : payload, error },
  12. };
  13. }
  14. if (type === "PROMISE_CLEAR") {
  15. const { [name]: toRemove, ...newState } = state;
  16. return newState;
  17. }
  18. return state;
  19. }
  20. export const actionPending = (name) => ({ type: "PROMISE", name, status: "PENDING" });
  21. export const actionFulfilled = (name, payload) => ({ type: "PROMISE", name, status: "FULFILLED", payload });
  22. export const actionRejected = (name, error) => ({ type: "PROMISE", name, status: "REJECTED", error });
  23. export const actionPromiseClear = (name) => ({ type: "PROMISE_CLEAR", name });
  24. export const actionPromise = (name, promise) => ({ type: "PROMISE_START", name, promise });
  25. export function* promiseWorker(action) {
  26. const { name, promise } = action;
  27. yield put(actionPending(name));
  28. try {
  29. let data = yield promise;
  30. yield put(actionFulfilled(name, data));
  31. return data;
  32. } catch (error) {
  33. yield put(actionRejected(name, error));
  34. }
  35. }
  36. export function* promiseWatcher() {
  37. yield takeEvery("PROMISE_START", promiseWorker);
  38. yield takeLatest("PAGE_START", pageStartWorker);
  39. yield takeLatest("ABOUT_ME", aboutMeWorker);
  40. yield takeLatest("CAT_BY_ID_FULL", catByIdFullWorker);
  41. yield takeLatest("CATEGORY_GOODS", categoryGoodsWorker);
  42. yield takeLatest("ORDER_UPDATE", orderUpdateWorker);
  43. }