'I am making a real time betting app and My redux state is updating but my ui is not affecting Can anyone help me with the code
I am developing real time sportsbook using MERN stack and redis as memory db.. Everything seems right except react-redux not passing state to components as they are updated. I can see the nextstate clearly getting latest data in the console/ redux logger..
Here is the component reducer file..
import ActionTypes from './betslip.types';
import { calculateTotalReturn } from './betslip.utils';
const INITIAL_STATE = {
bets: [],
updateBet: true,
updatedGame: true,
betType:'single',
totalStake:0,
singleTotalReturn:0,
multiTotalReturn:0,
systemTotalReturn:0
}
export const betslipReducer = (state = INITIAL_STATE, action) => {
switch(action.type) {
case ActionTypes.SET_UPDATE_BET:
return {
...state,
updateBet: action.value
};
case ActionTypes.SET_BET_TYPE:
return {
...state,
betType: action.value
};
case ActionTypes.UPDATED_GAMES:
return {
...state,
updatedGame: !state.updatedGame
};
case ActionTypes.SET_TOTAL_STAKE:
return {
...state,
totalStake: action.value
};
case ActionTypes.PUT_BET:
return {
...state,
bets: [action.value, ...state.bets]
};
case ActionTypes.UPDATE_BET_ODD:
var betsOddsCopy = state.bets;
var indexOdds = betsOddsCopy.findIndex(n => n._id === action.betId);
betsOddsCopy[indexOdds].odds = action.value;
return {
...state,
bets: betsOddsCopy
};
case ActionTypes.UPDATE_BET_STAKE:
var betsStakeCopy = state.bets;
var indexStake = betsStakeCopy.findIndex(n => n._id === action.betId);
betsStakeCopy[indexStake].stake = action.value;
return {
...state,
bets: betsStakeCopy
};
case ActionTypes.DELETE_BET:
var betsCopy = state.bets;
const newBets = betsCopy.filter(b => b._id != action.betId)
return {
...state,
bets: newBets
};
case ActionTypes.CALCULATE_TOTAL_RETURN:
return calculateTotalReturn(state);
default:
return state;
}
}
The bets property in this file is not updating but betslip.bets is updating
import React, { useState } from 'react';
import { connect } from 'react-redux';
import { setUpdateBet, calculateTotalReturn, setBetType, setTotalStake, updateBetStake } from '../../redux/betslip/betslip.actions';
import Bet from '../bet/bet.component';
import './BetSlip.css';
//bets, updateBet, betType, totalStake, singleTotalReturn, multiTotalReturn, systemTotalReturn,
const BetSlip = ({bets, updateBet, betType, totalStake, singleTotalReturn, multiTotalReturn, systemTotalReturn, setUpdateBet, setBetType, setBetStake, setTotalStake, calculateTotalReturn }) => {
//const bets = store.getState().betslip.bets;
//console.log(betslip);
const [collapsed, setCollapsed] = useState(bets.length > 1 ? true : false);
const handleStakeTypeChange = (e) => {
if(e.target.dataset.type == 'multi' && bets.length > 8){
return;
} else if(e.target.dataset.type == 'system' && bets.length != 3){
return;
}
setBetType(e.target.dataset.type)
calculateTotalReturn();
}
const handleOpen = () => {
setCollapsed(!collapsed);
}
const handleUpdateBet = (e) => {
if(e.target.checked){
setUpdateBet(true);
} else{
setUpdateBet(false);
}
}
const handleStakeChange = (e) => {
if(betType == 'single'){
setBetStake(bets[0]._id, e.target.value)
calculateTotalReturn();
} else {
setTotalStake(e.target.value);
calculateTotalReturn();
}
//console.logbets);
}
React.useEffect(() => {
console.log('bet changed')
if(bets.length <= 1){
setBetType('single')
calculateTotalReturn();
}
calculateTotalReturn();
},[bets]);
// setInterval(() => {
// var total = 0;
// bets.forEach(bet => {
// total =+ bet.stake;
// })
// setTotalBetPrice(total);
// }, 5000);
var totalOdds;
if(betType == 'single'){
totalOdds = 0;
bets.forEach(bet => {
if( bet.odds != 'suspended'){
totalOdds += bet.odds;
}
//console.log('Hii');
})
} else if(betType == 'multi'){
totalOdds = 1;
bets.forEach(bet => {
if( bet.odds != 'suspended'){
totalOdds *= parseFloat(bet.odds);
}
})
} else {
totalOdds = 0;
}
//console.log(updatedGames)
return <div className='betslip__container'>
<div className='betslip__badge' onClick={handleOpen}>
<span>Bet Slip ({bets.length})</span>
{collapsed ? <span><i className="fa fa-chevron-up" /></span> : <span><i className="fa fa-chevron-down" /></span>}
</div>
{(collapsed == false && bets.length > 1) && <div className='betslip__stakeType'>
<div className={`betslip__stakeType__item ${betType == 'single' && "active"}`} onClick={handleStakeTypeChange} data-type='single'>
Single
</div>
{bets.length < 9 && <div className={`betslip__stakeType__item ${betType == 'multi' && "active"}`} onClick={handleStakeTypeChange} data-type='multi'>
Multi/Parlay
</div>}
{bets.length == 3 && <div className={`betslip__stakeType__item ${betType == 'system' && "active"}`} onClick={handleStakeTypeChange} data-type='system'>
System 2/3
</div>}
</div> }
<div className='betslip__body__container'>
{
collapsed == false && bets.map(bet => (
<Bet
key={bet._id}
id={bet._id}
title={bet.optionName}
odds={bet.odds} category={bet.category}
teams={bet.teams}
stake={bet.stake}
stakeType={betType} />
))
}
</div>
{!collapsed && <div className="betslip__footer">
{((betType == 'multi' || betType == 'system') || bets.length < 2) && <div className="betslip__stake">
<input type='number' className='betslip__stake__input' placeholder='Stake' value={betType == 'single' ? (bets[0].stake > 0 ? bets[0].stake : '') : (totalStake > 0 ? totalStake : '')} onChange={handleStakeChange} />
</div>}
<button className="betslip__btn__saving">
<span className="betslip__btn__saving__text">Place Bet</span>
<span className='totals'>
<span className='totals__text'>
Total Odds: {parseFloat(totalOdds).toFixed(3)}
</span>
{betType == 'single' && <span>Total Return: {singleTotalReturn > 0 ? parseFloat(singleTotalReturn).toFixed(2) : singleTotalReturn}</span>}
{betType == 'multi' && <span>Total Return: {multiTotalReturn > 0 ? parseFloat(multiTotalReturn).toFixed(2) : multiTotalReturn}</span>}
{betType == 'system' && <span>Total Return: {systemTotalReturn > 0 ? parseFloat(systemTotalReturn).toFixed(2) : systemTotalReturn}</span>}
</span>
</button>
</div>}
{!collapsed && <div className='betslip__badge'>
<div className="form-check">
{updateBet
?
<input className="form-check-input" type="checkbox" value="" id="flexCheckDefault" onClick={handleUpdateBet} defaultChecked />
:
<input className="form-check-input" type="checkbox" value="" id="flexCheckDefault" onClick={handleUpdateBet} />
}
<label className="form-check-label" htmlFor="flexCheckDefault">
Accept Change
</label>
</div>
</div>}
</div>
}
const mapStateToProps = state => ({
betType: state.betslip.betType,
updateBet: state.betslip.updateBet,
totalStake: state.betslip.totalStake,
singleTotalReturn: state.betslip.singleTotalReturn,
multiTotalReturn: state.betslip.multiTotalReturn,
systemTotalReturn: state.betslip.systemTotalReturn,
bets: state.betslip.bets
})
const mapDispatchToProps = dispatch => ({
setUpdateBet: value => dispatch(setUpdateBet(value)),
setBetType: value => dispatch(setBetType(value)),
setTotalStake: value => dispatch(setTotalStake(value)),
setBetStake: (id, value) => dispatch(updateBetStake(id, value)),
calculateTotalReturn: () => dispatch(calculateTotalReturn())
})
export default connect(mapStateToProps, mapDispatchToProps)(BetSlip);
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|
