sagas/tickets.js

import {
  takeEvery, put, call, select,
} from 'redux-saga/effects';
/**
 * @namespace sagas/tickets
 */
import Constants from '../constants';
import { requestGet } from '../utils/request';
import { parseTicketData } from '../utils/parser';
import {
  SET_BETS_LOADER,
  GET_TICKETS_SUCCESS,
  GET_TICKETS,
  GET_TICKETS_NO_MORE_BETS,
  SHOW_ERROR_MODAL,
} from '../reducers';

import {
  getLastTimestamp, getLastRunning, getNoMoreBets, getTicketDates,
  getTickets, getSelectedTicket, getNumbets,
} from '../store/tickets';
import { getMarkets } from '../store/bets';

/**
 * @memberof sagas/tickets
 * @typedef "getTicketsSaga/response.data"
 * @type {object}
 * @property {Array<BetDetail>} bets
 * @property {string} lastTimestamp
 * @property {number} lastRunning
 */
/**
 * @memberof sagas/tickets
 * @typedef BetDetail
 * @type {object}
 * @property {number} id Bet ID
 * @property {number} round Round Id
 * @property {Time} placed Time of placed bet
 * @property {number} status Have 3 case (-1 Lose , 0 Pending , 1 Winning)
 * @property {number} stake Total stake
 * @property {number} potwin Potential Win
 * @property {number} win Winning
 * @property {string} betdata Parsed data, same parser for placeing bet
 * @property {string} betdetails Parsed data
 * (match:odd:result:status$..|minOdd-maxOdd|combinationType:win&..)
 * @property {number} bonus Represent boolean (1 have bonus, 0 dont have bonus)
 * @property {number} paidStatus
 */
/**
 * Bet History
 *
 * @memberof sagas/tickets
 * @async
 * @param {object} action
 * @property {object} action
 * @property {object} action.payload
 * @property {number} action.payload.numbets  Number of bets to get
 * @property {string} action.payload.lastTimestamp
 * @property {number} action.payload.lastRunning
 *
 * @yields {select} getNoMoreBets
 * @yields {select} getLastTimestamp
 * @yields {select} getLastRunning
 * @yields {select} getTicketDates
 * @yields {select} getNumbets
 * @yields {put} SET_BETS_LOADER
 * @yields {call} /bet/list?numbets=&lastTimestamp=&lastRunning=
 * @yields {put} GET_TICKETS_NO_MORE_BETS
 * @yields {select} getTickets
 * @yields {select} getMarkets
 * @yields {select} getSelectedTicket
 * @yields {put} GET_TICKETS_SUCCESS
 * @yields {put} SHOW_ERROR_MODAL
 */
function* getTicketsSaga(action) {
  let response;
  try {
    const noMoreBets = yield select(getNoMoreBets);
    if (!noMoreBets) {
      let lastTimestamp = yield select(getLastTimestamp);
      let lastRunning = yield select(getLastRunning);
      const ticketDates = yield select(getTicketDates);
      const numbets = yield select(getNumbets);
      yield put({
        type: SET_BETS_LOADER,
        payload: {
          betsPending: true,
        },
      });
      response = yield call(requestGet, `${Constants.API_URLS.MY_BETS}?numbets=${numbets}${lastTimestamp && !action.payload ? `&lastTimestamp=${lastTimestamp}&lastRunning=${lastRunning}` : ''}`, true);

      if (response.status === -1) {
        throw new Error(response.error.message);
      } else if (response.data.bets.length === 0) {
        yield put({
          type: GET_TICKETS_NO_MORE_BETS,
        });
      } else {
        let prevBets = yield select(getTickets) || {};
        prevBets = prevBets || {};
        const markets = yield select(getMarkets);
        const currSelectedTicket = yield select(getSelectedTicket);
        const { tickets, selectedTicket, dates } = parseTicketData(
          response.data.bets,
          markets,
          prevBets,
          currSelectedTicket,
          ticketDates,
          action.payload,
        );
        if (!action.payload) {
          lastTimestamp = response.data.lastTimestamp;
          lastRunning = response.data.lastRunning;
        }
        yield put({
          type: GET_TICKETS_SUCCESS,
          payload: {
            tickets,
            lastTimestamp,
            lastRunning,
            selectedTicket,
            ticketDates: dates,
            ticketsUpdated: !!action.payload,
          },
        });
      }
    }
  } catch (error) {
    yield put({
      type: SHOW_ERROR_MODAL,
      payload: {
        activeModal: error.modal || Constants.MODALS.GENERAL_ERROR,
        message: error.message,
      },
    });
  }
}

/**
 * @memberof sagas/tickets
 * @async
 * @returns {void}
 */
export default function* ticketsSaga() {
  yield takeEvery(GET_TICKETS, getTicketsSaga);
}