I want to run the connect function only once so that it initiates a stompjs client. But it is being called 4 times and I am getting the following message in the browser:
VM1867 bundle.js:41684 WebSocket connection to 'ws://localhost:3000/chat/251/ios42gwd/websocket' failed: WebSocket is closed before the connection is established.
It connects to the websocket after 4th time though.
If I understand it correctly useRef supposed to persist the value between re-renders but apparently it's not doing it since I get the clientInit.current=false four times.
What am I doing wrong?
function App() {
const [userData, setUserData] = useState({
userId: null,
name: "",
connected: false,
});
const [connected, setConnected] = useState(false);
const [stompClient, setStompClient] = useState(null);
const clientInit = useRef(false);
//should be called only once? but called 4 times. getting clientInit.current= false 4 times
too
const connect = () => { console.log("inside connect");
console.log("====================================");
console.log(clientInit.current);
console.log("====================================");
clientInit.current = true;
const socket = new SockJS("/chat");
const tempstompClient = Stomp.over(socket);
tempstompClient.connect(
{ "client-id": userData.userId },
() => {
setConnected(true);
setStompClient(tempstompClient);
},
(er) => {
console.error(er);
}
);
};
const registerUser = (e) => {
e.preventDefault();
setUserData({ ...userData, connected: true });
};
const handleUser = (event) => {
const { value } = event.target;
const uuid = uuidv4();
setUserData({ ...userData, name: value, userId: uuid });
};
useEffect(() => {
console.log("====================================");
console.log("calling connect:", clientInit.current);
console.log("====================================");
if(!clientInit)
connect();
return () => {
console.log("Doing stuff inside cleaning up", stompClient);
if (stompClient) {
console.log("====================================");
console.log("disconnecting", stompClient);
console.log("====================================");
stompClient.disconnect();
}
};
}, []);
return userData.connected ? (
<Chatbox
userData={userData}
stompClient={stompClient}
connected={connected}
/>
) : (
<Register handleUser={handleUser} handleSubmit={registerUser} />
);
}
export default App;