Am trying to create a real time voting using Pusher, typescript and react native, but the candidates array is not being updated and displayed on the useEffect function. but when I run the same code lines from a normal vote it works (the candidates array is updated and displayed correctly);
const [candidates, setCandidates] = useState([]);`
const vote = (id, position,name,name2) => {
var newVoteData = ({voterName:votingData.voterName,voterId:votingData.voterId,position:position,candidateId:id,candidateName:name});
setProcessingModal(true);
fetch('http://172.20.10.4:8000/mobile/vote', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
},
body: JSON.stringify(newVoteData),
})
.then((response) => response.json())
.then((data) => {
if(data.status == "ok"){This block of code works, updates the particular candidate voteCount and setCandidates correctly
setProcessingModal(false);
alert("Yay!!! , you have successfully voted");
const updatedData = candidates.map(x => (x.id === id ? { ...x, voteCount: data.voteCount } : x));//updates votecount on candidate
let newArr = updatedData.sort((x,y) => {return y.voteCount - x.voteCount});
setCandidates(updatedData);
}else{
setProcessingModal(false);
alert(data)
}
})
.catch((error) => {
setProcessingModal(false);
alert(error);
console.error('Error:', error);
});
};
the below useEffect function is where am having issues, the array for some reason is not being updated
useEffect(() => {
const liveUpdateCandidates = (id, voteCount) => {
alert(voteCount);
const updatedData = candidates.map(x => (x.id === id ? { ...x, voteCount: voteCount } : x));//updates votecount on candidate does not work here
console.log('afer');
let newArr = updatedData.sort((x,y) => {return y.voteCount - x.voteCount});
setCandidates(updatedData);
};
//Pusher.logToConsole = true;
const pusher = new Pusher('3580cab8bee36d295917', {
cluster: 'eu',
encrypted: true
});
const channel = pusher.subscribe('votebooth-channel');
channel.bind('App\Events\BoothEvent', function(data) {
liveUpdateCandidates(data.candidateId, data.voteCount);
});
return (() => {
pusher.unsubscribe('votebooth-channel');
// pusher.unsubscribe('channel_name2');
})
},[candidates]);
Below is a sample of the returned array
[
{“id”:”3″,”name”:”Kwaku”,”candidateUserId”:null,”gender”:”Male”,”philosophy”:”Good”,”voteCount”:”132″,},
{“id”:”22″,”name”:”rose”,”candidateUserId”:null,”gender”:”Female”,”philosophy”:”Php”,”voteCount”:”1″,}
]