I'm trying to build a chat application, and I have a function for selecting users you want to add to the chat. It is in the following component (I've left out the import statements and one of the functions for brevity):
const AddUserBox = (props) => {
// context:
const { friends, getFriends, user, whoToMsg } = useContext(AppContext);
// state:
const [friendsDisplay, setFriendsDisplay] = useState();
const [selected, setSelected] = useState();
const getFriendsDisplay = async function() {
if (!friends) await getFriends(user.username);
if (friends) {
let currentFriend;
let result;
let friendsInfo = [];
friends.sort();
for (let i = 0; i < friends.length; i++) {
if (friends[i].user_1 === user.username) {
currentFriend = friends[i].user_2;
} else {
currentFriend = friends[i].user_1;
}
if (currentFriend === whoToMsg) {
return;
} else if (typeof whoToMsg === Array) {
if (whoToMsg.includes(currentFriend)) return;
}
await fetch('/proxy/get-user-update', {
method: 'POST',
headers: {
'Accept': 'application/json, text/plain, */*',
'Content-Type':'application/json'
},
body: JSON.stringify({username: currentFriend})
})
.then(results => results.json())
.then(data => result = data)
.catch(err => console.error(err));
friendsInfo.push(result);
}
setFriendsDisplay(friends.map((friend, i) => {
return <div
className="add-user-friends-button"
key={i}
i={i}
onClick={(e) => {selectUser(e, friend)}}
>
{friendsInfo[i].name}
</div>
}));
}
}
const selectUser = function(e, friend) {
let newArr = [];
let currentFriend;
if (friend.user_1 === user.username) {
currentFriend = friend.user_2;
} else {
currentFriend = friend.user_1;
}
if (selected) {
newArr = [...selected];
if (selected.includes(currentFriend)) {
e.target.style.backgroundColor = "";
newArr.splice(newArr.indexOf(currentFriend), 1);
setSelected(newArr);
return;
}
}
newArr.push(currentFriend);
newArr.sort();
e.target.style.backgroundColor = "#E6FCFF";
setSelected(newArr);
console.log(selected);
}
return (
<div className="add-user">
<span>Add users to chat:</span>
<div className="add-user-friends">
{friendsDisplay}
</div>
<button onClick={() => props.close()}>Close</button>
<button onClick={() => addUsers()}>Add users</button>
</div>
);
}
The idea is that you select a user from a list and it is added to an array of selected users so that when they click the add users button the users are added to the chat.For some reason setSelected(newArr)
does not set the state to the new array. Can anyone help me understand / fix this?