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