sagas/cashier.js

import { takeLatest, put, call, select } from 'redux-saga/effects';
import { requestGet } from '../utils/request';
import { API_URLS, MODALS, DEFAULT_PAGE_SIZE } from '../constants';

import {
  getLastUserId,
  getCashiersList,
  getLastStatementId,
  getStatementsList,
  getUserId,
} from '../selectors/cashiers';
import { aGetCashierListSuccess, aGetStatementListSuccess } from '../reducers/cashier';
import { aSetHasRecord, aSetIsFetched, aSetLastRecord, aSetOpenModal } from '../reducers/common';
import { aGetCashierList, aGetStatementList } from '../reducers/actions';

/**
 * @namespace sagas/cashier
 */

/**
 * @memberof sagas/cashiers
 * @typedef "getCashiersList/response.data"
 * @type {object}
 * @property {Array<CashiersList>} cashiers
 * @property {number} lastUserId
 */
/**
 * Get cashiers list
 *
 * @memberof sagas/cashiers
 * @async
 * @param {object} action Filtering data
 */
function* getCashierList(action) {
  let response;
  try {
    if (action.payload) {
      let filters = action.payload || {};
      const lastUserId = yield select(getLastUserId);

      filters = {
        ...filters,
        lastUserId,
      };
      const params = `?${new URLSearchParams(filters).toString()}`;

      yield put(aSetIsFetched({ isFetched: false }));

      response = yield call(requestGet, API_URLS.CASHIERS_LIST + params, true);

      if (response.status === -1) {
        const e = Error(response.error.message);
        e.modal = MODALS.ERROR;
        throw e;
      } else {
        const cashiersList = yield select(getCashiersList);
        yield put(
          aGetCashierListSuccess({
            cashiers: [...cashiersList, ...response.data.cashiers],
            lastUserId: response.data.lastUserId,
          })
        );
        if (!response.data.lastUserId) {
          yield put(aSetLastRecord(true));
        }
        yield put({
          type: aSetHasRecord.type,
          payload: {
            hasRecord: response.data.cashiers.length > 0,
          },
        });
      }
    }
    yield put(aSetIsFetched({ isFetched: true }));
  } catch (error) {
    yield put(
      aSetOpenModal({
        modal: error.modal || MODALS.GENERAL_ERROR,
        errorMessage: error.modal ? error.message : MODALS.GENERAL_ERROR,
      })
    );
  }
}

/**
 * @memberof sagas/cashiers
 * @typedef "getStatementsList/response.data"
 * @type {object}
 * @property {Array<StatementsList>} statements
 * @property {number} lastStatementId
 */
/**
 * Get statements list
 *
 * @memberof sagas/cashiers
 * @async
 * @param {object} action Filtering data
 */
function* getStatementList(action) {
  let response;
  try {
    const userId = yield select(getUserId);
    if (action.payload && (action.payload.userId || userId)) {
      let filters = action.payload || {};
      const lastStatementId = yield select(getLastStatementId);
      const pageSize = DEFAULT_PAGE_SIZE;

      filters = {
        ...filters,
        userId: action.payload.userId || userId,
        lastStatementId,
        pageSize,
      };

      const params = `?${new URLSearchParams(filters).toString()}`;

      yield put(aSetIsFetched({ isFetched: false }));

      response = yield call(requestGet, API_URLS.STATEMENT_LIST + params, true);

      if (response.status === -1) {
        const e = Error(response.error.message);
        e.modal = MODALS.ERROR;
        throw e;
      } else {
        const statementsList = yield select(getStatementsList);
        yield put(
          aGetStatementListSuccess({
            statements: [...statementsList, ...response.data.statements],
            lastStatementId: response.data.lastStatementId,
          })
        );
        if (!response.data.lastStatementId) {
          yield put(aSetLastRecord(true));
        }
        yield put({
          type: aSetHasRecord.type,
          payload: {
            hasRecord: response.data.statements.length > 0,
          },
        });
      }
    }
    yield put(aSetIsFetched({ isFetched: true }));
  } catch (error) {
    yield put(
      aSetOpenModal({
        modal: error.modal || MODALS.GENERAL_ERROR,
        errorMessage: error.modal ? error.message : MODALS.GENERAL_ERROR,
      })
    );
  }
}

/**
 * @memberof sagas/cashiers
 * @async
 * @returns {void}
 */
export default function* cashiersSaga() {
  yield takeLatest(aGetCashierList, getCashierList);
  yield takeLatest(aGetStatementList, getStatementList);
}