import { fromJS } from 'immutable';
import { setDefaultStakesArr } from '../utils/common';
import {
TOGGLE_ODDS, SET_STAKES,
TOGGLE_BETSLIP,
CLOSE_PLACEBET_ERROR,
CLOSE_PLACEBET_CONFIRMATION,
DISABLE_PLACEBET,
SET_PLACEBET_LOADER,
PLACEBET_SUCCESS,
GET_ROUND_SELECTIONS_SUCCESS,
GET_ROUND_SUCCESS,
SET_FREE_BETS,
KICK_OFF_SUCCESS,
GET_TURBO_ROUND_SUCCESS,
FETCH_ROUND_SUCCESS, SHOW_ERROR_MODAL,
SET_NEED_BET_RE_COUNT,
SET_NEED_TURBO_BET_RE_COUNT,
SET_NEED_TURBO_KICKOFF_BET_RE_COUNT,
SET_LAST_BET_ROUND,
SET_LAST_BET_ROUND_TURBO,
SET_BACKUP_LOGIN_PROPS,
CLEAR_SELECTIONS,
SET_PLACEBET_AFTER_LOGIN,
SET_LAST_TURBO_ROUND_PLAYED,
ADD_PLACED_BET,
REMOVE_PLACED_BETS,
ADD_PLACED_BET_BULK,
REMOVE_ALL_TICKETS_FROM_COUNT,
SET_FILTERED_SELECTED_ODDS,
CLEAR_ALL_PLACED_SELECTIONS,
SET_LIVE_DATA,
} from '.';
/**
* @namespace reducer/placebetReducer
*/
const initialState = fromJS({
singleStakes: [],
combiStakes: [],
multipleStake: '',
otherStake: '',
selectedOdds: null,
numberOfSelections: 0,
placeBetErrorMgs: null,
betSlipConfimation: false,
placebetDisabled: false,
placebetAfterLogin: null,
isLoadingPlaceBet: false,
placedSelections: {},
placedSelectionsTurbo: {},
bonusOddsThreshold: null,
bonusPercentages: null,
turboRoundDuration: null,
needReCountBet: false,
needTurboReCountBet: false,
needTurboKickOffReCountBet: false,
lastBetRound: null,
lastBetRoundTurbo: null,
lastTurboRoundBetPlacedId: 0,
allPlacedBets: {},
});
/**
* @memberof reducer/placebetReducer
* @param {object} state Contain initial and final state of data
* @param {object} action Return the action object
*
* @property {Array} [singleStakes=[]]
* @property {Array} [combiStakes=[]]
* @property {string} [multipleStake='']
* @property {string} [otherStake='']
* @property {Array} [selectedOdds=null]
* @property {number} [numberOfSelections=0]
* @property {string} [placeBetErrorMgs=null]
* @property {boolean} [betSlipConfimation=false]
* @property {boolean} [placebetDisabled=false]
* @property {string|null} [placebetAfterLogin=null]
* @property {boolean} [isLoadingPlaceBet=false]
* @property {Array} [placedSelections={}]
* @property {Array} [placedSelectionsTurbo={}]
* @property {object} [betslipSettings=null]
* @property {string} [bonusOddsThreshold=null]
* @property {number} [bonusPercentages=null]
*
* @returns {state}
*/
function placebetReducer(state = initialState, action) { // NOSONAR
let singleStakes = state.get('singleStakes');
let combiStakes = state.get('combiStakes');
let multipleStake = state.get('multipleStake');
let otherStake = state.get('otherStake');
switch (action.type) {
/**
* [Action Creator]
* This action is use to add or remove odd in selected
* odds array and also to remove all from array. Also used to setup
* inputs stake fields depended on number of selections
*
* @memberof reducer/placebetReducer
* @example toggleSelectedOdds(payload)
* @function reducer/placebetReducer~TOGGLE_ODDS
* @param {Array} selectedOdds
* @param {number} index
*/
case TOGGLE_ODDS: {
singleStakes = singleStakes.toJS();
combiStakes = combiStakes.toJS();
const { selectedOdds } = action.payload;
const numberOfSelections = selectedOdds.length;
if (selectedOdds.length === 0) {
singleStakes = [];
combiStakes = [];
multipleStake = '';
otherStake = '';
} else if (action.payload.index === -1) {
singleStakes.push('');
combiStakes.push('');
} else {
singleStakes.splice(action.payload.index, 1);
combiStakes.pop();
}
return state
.set('selectedOdds', fromJS(selectedOdds))
.set('numberOfSelections', numberOfSelections)
.set('singleStakes', fromJS(singleStakes))
.set('combiStakes', fromJS(combiStakes))
.set('multipleStake', multipleStake)
.set('otherStake', otherStake);
}
/**
* [Action Creator]
* This action is use to set values to stakes input fields
*
* @memberof reducer/placebetReducer
* @example setStakes(payload)
* @function reducer/placebetReducer~SET_STAKES
* @param {Array} [singleStakes]
* @param {Array} [combiStakes]
* @param {string} [multipleStake]
* @param {string} [otherStake]
*/
case SET_STAKES:
return state
.set('singleStakes', action.payload.singleStakes !== undefined ? fromJS(action.payload.singleStakes) : singleStakes)
.set('combiStakes', action.payload.combiStakes !== undefined ? fromJS(action.payload.combiStakes) : combiStakes)
.set('multipleStake', action.payload.multipleStake !== undefined ? action.payload.multipleStake : multipleStake)
.set('otherStake', action.payload.otherStake !== undefined ? action.payload.otherStake : otherStake);
/**
* [Action Creator]
* This action is use to remove all from input fields
*
* @memberof reducer/placebetReducer
* @example toggleBetslip(payload)
* @function reducer/placebetReducer~TOGGLE_BETSLIP
*/
case TOGGLE_BETSLIP: {
return state
.set('singleStakes', fromJS(setDefaultStakesArr(state.get('selectedOdds').toJS())))
.set('combiStakes', fromJS(setDefaultStakesArr(state.get('selectedOdds').toJS())))
.set('multipleStake', '')
.set('otherStake', '')
.set('betSlipConfimation', false);
}
/**
* [Action Creator]
* This action is use to remove placebet error message
*
* @memberof reducer/placebetReducer
* @example closePlaceBetErrorMessage(payload)
* @function reducer/placebetReducer~CLOSE_PLACEBET_ERROR
*/
case CLOSE_PLACEBET_ERROR:
return state
.set('placeBetErrorMgs', null);
/**
* [Action Creator]
* This action is use to close confirmation of success placed bet in betslip
*
* @memberof reducer/placebetReducer
* @example closeSlipConfirmation(payload)
* @function reducer/placebetReducer~CLOSE_PLACEBET_CONFIRMATION
*/
case CLOSE_PLACEBET_CONFIRMATION:
return state
.set('betSlipConfimation', false);
/**
* [Action Creator]
* This action is use to disable placebet button in betslip
*
* @memberof reducer/placebetReducer
* @example disablePlacebet(payload)
* @function reducer/placebetReducer~DISABLE_PLACEBET
* @param {boolean} placebetDisabled
*/
case DISABLE_PLACEBET:
return state
.set('placebetDisabled', action.payload.placebetDisabled);
case FETCH_ROUND_SUCCESS:
return state
.set('placebetDisabled', false);
/**
* [Received Data]
* This action is use to set successfully placed bet
*
* @memberof reducer/placebetReducer
* @function reducer/placebetReducer~PLACEBET_SUCCESS
* @param {Array} placedSelections
*/
case PLACEBET_SUCCESS: {
const placedSelections = state.get('placedSelections').toJS();
if (action.payload.placedSelections) {
placedSelections[action.payload.roundId] = action.payload.placedSelections;
}
const placedSelectionsTurbo = state.get('placedSelectionsTurbo').toJS();
if (action.payload.placedSelectionsTurbo) {
placedSelectionsTurbo[action.payload.roundId] = action.payload.placedSelectionsTurbo;
}
return state
.set('placedSelections', fromJS(placedSelections))
.set('placedSelectionsTurbo', fromJS(placedSelectionsTurbo))
.set('turboRoundDuration', action.payload.round ? fromJS(action.payload.round.turboRoundDuration) : null)
.set('isLoadingPlaceBet', false)
.set('betSlipConfimation', true)
.set('needReCountBet', !action.payload.turbo)
.set('needTurboReCountBet', action.payload.turbo);
}
/**
* [Received Data]
* This action is use to set placebet after login
*
* @memberof reducer/placebetReducer
* @function reducer/placebetReducer~SET_PLACEBET_LOADER
*/
case SET_PLACEBET_LOADER:
return state
.set('placebetAfterLogin', action.payload.placebetAfterLogin)
.set('isLoadingPlaceBet', action.payload.isLoadingPlaceBet)
.set('placeBetErrorMgs', action.payload.placeBetErrorMgs);
/**
* [Received Data]
* This action is use to set previoslu placed selection for current round
*
* @memberof reducer/placebetReducer
* @function reducer/placebetReducer~GET_ROUND_SELECTIONS_SUCCESS
*/
case GET_ROUND_SELECTIONS_SUCCESS: {
const placedSelections = state.get('placedSelections').toJS();
if (action.payload.placedSelections) {
placedSelections[action.payload.roundId] = action.payload.placedSelections;
}
const placedSelectionsTurbo = state.get('placedSelectionsTurbo').toJS();
if (action.payload.placedSelectionsTurbo) {
placedSelectionsTurbo[action.payload.roundId] = action.payload.placedSelectionsTurbo;
}
return state
.set('placedSelections', fromJS(placedSelections))
.set('placedSelectionsTurbo', fromJS(placedSelectionsTurbo));
}
/**
* [Received Data]
* This action is use to set data from round API call
*
* @memberof reducer/placebetReducer
* @function reducer/placebetReducer~GET_ROUND_SUCCESS
*/
case GET_TURBO_ROUND_SUCCESS:
case GET_ROUND_SUCCESS: {
const isSelectingLeague = action.payload?.isSelectLeague;
return state
.set('bonusOddsThreshold', action.payload.bonusOddsThreshold)
.set('bonusPercentages', action.payload.bonusPercentages)
.set('numberOfSelections', (action.payload?.placebetBackupLogin || isSelectingLeague) ? state.get('numberOfSelections') : 0)
.set('otherStake', (action.payload?.placebetBackupLogin) ? state.get('otherStake') : '')
.set('multipleStake', (action.payload?.placebetBackupLogin) ? state.get('multipleStake') : '')
.set('combiStakes', (action.payload?.placebetBackupLogin) ? fromJS(state.get('combiStakes')) : fromJS([]))
.set('singleStakes', (action.payload?.placebetBackupLogin) ? fromJS(state.get('singleStakes')) : fromJS([]));
}
/**
* [Received Data]
* This action is use to clear free bet input
*
* @memberof reducer/placebetReducer
* @function reducer/placebetReducer~SET_FREE_BETS
*/
case SET_FREE_BETS:
return state
.set('otherStake', '');
/**
* [Received Data]
* This action is use update kickoff success params
*
* @memberof reducer/placebetReducer
* @function reducer/placebetReducer~KICK_OFF_SUCCESS
*/
case KICK_OFF_SUCCESS:
return state
.set('needTurboKickOffReCountBet', true)
.set('placebetDisabled', false);
/**
* [Received Data]
* This action is use show error modal
*
* @memberof reducer/placebetReducer
* @function reducer/placebetReducer~SHOW_ERROR_MODAL
*/
case SHOW_ERROR_MODAL:
return state
.set('isLoadingPlaceBet', false);
/**
* [Received Data]
* This action is use to set need bet re count
*
* @memberof reducer/placebetReducer
* @function reducer/placebetReducer~SET_NEED_BET_RE_COUNT
*/
case SET_NEED_BET_RE_COUNT:
return state
.set('needReCountBet', action.payload);
/**
* [Received Data]
* This action is use to set need turbo bet re count
*
* @memberof reducer/placebetReducer
* @function reducer/placebetReducer~SET_NEED_TURBO_BET_RE_COUNT
*/
case SET_NEED_TURBO_BET_RE_COUNT:
return state
.set('needTurboReCountBet', action.payload);
/**
* [Received Data]
* This action is use to set need turbo kickoff bet re count
*
* @memberof reducer/placebetReducer
* @function reducer/placebetReducer~SET_NEED_TURBO_KICKOFF_BET_RE_COUNT
*/
case SET_NEED_TURBO_KICKOFF_BET_RE_COUNT:
return state
.set('needTurboKickOffReCountBet', action.payload);
case SET_LAST_BET_ROUND:
return state
.set('lastBetRound', action.payload);
case SET_LAST_BET_ROUND_TURBO:
return state
.set('lastBetRoundTurbo', action.payload);
/**
* [Received Data]
* This action is use set backup login
*
* @memberof reducer/placebetReducer
* @function reducer/placebetReducer~SET_BACKUP_LOGIN_PROPS
*/
case SET_BACKUP_LOGIN_PROPS: {
const prevCombinationTypes = action.payload.prevCombinationTypes.length > 0
? action.payload.prevCombinationTypes : 0;
const prevCombinations = action.payload.prevCombinations.length > 0
? action.payload.prevCombinations : 0;
return state
.set('selectedOdds', fromJS(action.payload.selectedOdds))
.set('numberOfSelections', action.payload.numberOfSelections)
.set('singleStakes', fromJS(action.payload.stakes.singleStakes))
.set('combiStakes', fromJS(action.payload.stakes.combiStakes))
.set('multipleStake', fromJS(action.payload.stakes.multipleStake))
.set('prevCombinationTypes', prevCombinationTypes)
.set('prevCombinations', prevCombinations)
.set('selectedBetType', action.payload.selectedBetType);
}
case CLEAR_SELECTIONS:
return state
.set('numberOfSelections', 0)
.set('selectedOdds', fromJS([]));
case SET_PLACEBET_AFTER_LOGIN:
return state
.set('placebetAfterLogin', action.payload.placebetAfterLogin);
case SET_LAST_TURBO_ROUND_PLAYED:
return state
.set('lastTurboRoundBetPlacedId', action.payload.roundId);
case ADD_PLACED_BET: {
const allPlacedBets = state.get('allPlacedBets').toJS();
const roundId = action.payload.roundId;
const couponData = action.payload.couponData;
if (allPlacedBets[roundId] === undefined) {
allPlacedBets[roundId] = [];
}
allPlacedBets[roundId].push(couponData);
return state
.set('allPlacedBets', fromJS(allPlacedBets));
}
case ADD_PLACED_BET_BULK: {
const allPlacedBets = state.get('allPlacedBets').toJS();
const roundId = action.payload.roundId;
const coupons = action.payload.coupons;
if (allPlacedBets[roundId] === undefined) {
allPlacedBets[roundId] = [];
}
allPlacedBets[roundId] = [...allPlacedBets[roundId], ...coupons];
return state
.set('allPlacedBets', fromJS(allPlacedBets));
}
case REMOVE_PLACED_BETS: {
const allPlacedBets = state.get('allPlacedBets').toJS();
delete allPlacedBets[action.payload.roundId];
return state
.set('allPlacedBets', fromJS(allPlacedBets));
}
case REMOVE_ALL_TICKETS_FROM_COUNT: {
return state
.set('allPlacedBets', fromJS({}));
}
case SET_FILTERED_SELECTED_ODDS: {
return state
.set('selectedOdds', fromJS(action.payload.selectedOdds));
}
case CLEAR_ALL_PLACED_SELECTIONS: {
return state
.set('placedSelections', fromJS({}))
.set('placedSelectionsTurbo', fromJS({}));
}
case SET_LIVE_DATA: {
const placedSelections = state.get('placedSelections').toJS();
if (action.payload.placedSelections) {
placedSelections[action.payload.roundId] = action.payload.placedSelections;
}
const placedSelectionsTurbo = state.get('placedSelectionsTurbo').toJS();
if (action.payload.placedSelectionsLiveTurbo) {
placedSelectionsTurbo[action.payload.roundId] = action.payload.placedSelectionsLiveTurbo;
}
return state
.set('placedSelections', fromJS(placedSelections))
.set('placedSelectionsTurbo', fromJS(placedSelectionsTurbo));
}
default:
return state;
}
}
export default placebetReducer;