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);
}