I'm making a chat application using React and I have a ternary operator to show the chat box only when someone is joined a room and a username is given. But the messages are not being sent to everyone in the same room id. If I remove the ternary it works fine but it shows the form for username and room. Any ideas why the room id is not being passed down?
Rooms.jsx
const Rooms = () => {
const socket = io.connect('http://localhost:3001')
const [username, setUsername] = useState("");
const [room, setRoom] = useState("");
const [showChat, setShowChat] = useState(false);
const joinRoom = () => {
if (username !== "" && room !== "") {
socket.emit("join_room", room);
setShowChat(true);
console.log(room);
}
};
return (
<div className="App">
{!showChat ? (
<div className="joinChatContainer">
<h3>Join A Chat</h3>
<input
type="text"
placeholder="John..."
onChange={(event) => {
setUsername(event.target.value);
}}
/>
<input
type="text"
placeholder="Room ID..."
onChange={(event) => {
setRoom(event.target.value);
}}
/>
<button onClick={joinRoom}>Join A Room</button>
</div>
) : (
<Chat socket={socket} username={username} room={room} />
)}
</div>
);
}
export default Rooms
Chat.jsx
function Chat({ socket, username, room }) {
const [currentMessage, setCurrentMessage] = useState("");
const [messageList, setMessageList] = useState([]);
const sendMessage = async () => {
console.log(socket.id)
if (currentMessage !== "") {
const messageData = {
room: room,
author: username,
message: currentMessage,
time:
new Date(Date.now()).getHours() +
":" +
new Date(Date.now()).getMinutes(),
};
await socket.emit("send_message", messageData);
setMessageList((list) => [...list, messageData]);
setCurrentMessage("");
}
};
useEffect(() => {
socket.on("receive_message", (data) => {
setMessageList((list) => [...list, data]);
});
}, [socket]);
return (
<div className="chat-window">
<div className="chat-header">
<p>Live Chat</p>
</div>
<div className="chat-body">
{messageList.map((messageContent) => {
return (
<div
className="message"
id={username === messageContent.author ? "you" : "other"}
>
<div>
<div className="message-content">
<p>{messageContent.message}</p>
</div>
<div className="message-meta">
<p id="time">{messageContent.time}</p>
<p id="author">{messageContent.author}</p>
</div>
</div>
</div>
);
})}
</div>
<div className="chat-footer">
<input
type="text"
value={currentMessage}
placeholder="Hey..."
onChange={(event) => {
setCurrentMessage(event.target.value);
}}
onKeyPress={(event) => {
event.key === "Enter" && sendMessage();
}}
/>
<button onClick={sendMessage}>►</button>
</div>
</div>
);
}