reducers/placebet.js

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;