The problem is straightforward.
I have a ‘main’ page which collects data through a form and sends that data to a ‘chat’ page.
Everything works completely fine up until I reload the chat page, which renders everything a blank white. There are no errors in the console.
The url at that point should have the username and the the chat-room’s name, which remains in the url as far as I can see, even after having reloaded the page and gotten a blank white page.
This seems to be a popular problem but none of the suggested solutions have worked for me so far. This is what I have tried:
-
changed “homepage” in package.json
-
tried the whole
/* index.html 200
-
tried HashRouter instead of BrowserRouter, tried including basename
for Router, tried including browserhistory -
tried downgrading react to earlier versions
None of this has worked so far for me.Here is a live link to the site: https://cyberpunk-chat.onrender.com/
Here is the github repo: https://github.com/mohanamisra/chat-app-full-code
Here’s some relevant code anyways, just in case:
The page importing the routers:
IN App.js
import React from 'react';
import {BrowserRouter as Router, Route, Routes} from 'react-router-dom';
import Join from './components/Join/Join';
import Chat from './Chat';
const App = () => {
return (
<Router basename = "/">
<Routes>
<Route path='/' element={<Join/>}/>
<Route path='/chat' element={<Chat/>}/>
</Routes>
</Router>
);
};
export default App;
IN Chat.js
import React from 'react';
import {useState, useEffect} from 'react';
import queryString from 'query-string';
import { useNavigate } from 'react-router-dom';
import io from 'socket.io-client';
import InfoBar from "./components/InfoBar/InfoBar";
import Input from "./components/Input/Input";
import Messages from "./components/Messages/Messages";
import TextContainer from "./components/TextContainer/TextContainer";
import './Chat.css';
const ENDPOINT = 'https://cyberpunkchat.onrender.com';
let socket;
const Chat = () => {
const navigate = useNavigate();
const [name, setName] = useState('');
const [room, setRoom] = useState('');
const [messages, setMessages] = useState([]);
const [message, setMessage] = useState('');
const [users, setUsers] = useState('');
useEffect(() => {
const {name, room} = queryString.parse(window.location.search);
socket = io(ENDPOINT, {transports:['websocket']});
if(!name || !room) {
console.log('I forgot...');
}
else {
setName(name);
setRoom(room);
socket.emit('join', {name, room}, () => {
});
}
}, [ENDPOINT, navigate]);
useEffect(() => {
socket.on('message', (message) => {
setMessages([...messages, message]);
})
socket.on("roomData", ({ users }) => {
setUsers(users);
});
}, [messages]);
const sendMessage = (event) => {
event.preventDefault();
if(message)
socket.emit('sendMessage', message, () => setMessage(''));
}
return(
<div className = 'outerContainer'>
<TextContainer users = {users}/>
<div className = 'container'>
<InfoBar room = {room}/>
<Messages messages = {messages} name = {name}/>
<Input message = {message} setMessage={setMessage} sendMessage={sendMessage}/>
</div>
</div>
)
}
export default Chat;
I’d appreciate any help at all.
Thanks in advance!