import { useState, useEffect, useRef, useContext } from 'react'; import { Button } from '../common/button'; import { io } from 'socket.io-client'; import { AuthContext } from '../../utils/auth_context'; export const Ping = () => { const [pings, setPings] = useState([]); const [key, setKey] = useState('defaultkey'); const [currentRoom, setCurrentRoom] = useState(null); const [authToken] = useContext(AuthContext); const [socket, setSocket] = useState(null); useEffect(() => { // instantiates a socket object and initiates the connection... // you probably want to make sure you are only doing this in one component at a time. const socket = io({ auth: { token: authToken }, query: { message: 'I am the query ' }, }); // adds an event listener to the connection event socket.on('connect', () => { setSocket(socket); }); // adds event listener to the disconnection event socket.on('disconnect', () => { console.log('Disconnected'); }); // recieved a pong event from the server socket.on('pong', (data) => { console.log('Recieved pong', data); }); // IMPORTANT! Unregister from all events when the component unmounts and disconnect. return () => { socket.off('connect'); socket.off('disconnect'); socket.off('pong'); socket.disconnect(); }; }, []); useEffect(() => { // if our token changes we need to tell the socket also if (socket) { // this is a little weird because we are modifying this object in memory // i dunno a better way to do this though... socket.auth.token = authToken; } }, [authToken]); if (!socket) return 'Loading...'; const sendPing = () => { // sends a ping to the server to be broadcast to everybody in the room currentRoom && socket.emit('ping', { currentRoom }); }; const joinRoom = () => { // tells the server to remove the current client from the current room and add them to the new room socket.emit('join-room', { currentRoom, newRoom: key }, (response) => { console.log(response); setCurrentRoom(response.room); }); }; return ( <>
Ping: {currentRoom || '(No room joined)'}
setKey(e.target.value)} />
); };