gilded / client /src /context /SocketContext.jsx
OmegaOne
Upload 41 files
0a8fe79 verified
import React, { createContext, useContext, useEffect, useRef, useState } from 'react';
import { io } from 'socket.io-client';
import { useAuth } from './AuthContext';
const SocketContext = createContext(null);
export function SocketProvider({ children }) {
const { token } = useAuth();
const [socket, setSocket] = useState(null);
const socketRef = useRef(null);
useEffect(() => {
if (socketRef.current) {
socketRef.current.disconnect();
socketRef.current = null;
setSocket(null);
}
if (!token) return;
const newSocket = io(window.location.origin, {
auth: { token },
transports: ['websocket', 'polling'],
reconnection: true,
reconnectionAttempts: 10,
reconnectionDelay: 1000,
reconnectionDelayMax: 5000,
});
newSocket.on('connect', () => {
console.log('[Gilded] Socket connected:', newSocket.id);
});
newSocket.on('disconnect', (reason) => {
console.log('[Gilded] Socket disconnected:', reason);
});
newSocket.on('connect_error', (err) => {
console.error('[Gilded] Socket connection error:', err.message);
});
socketRef.current = newSocket;
setSocket(newSocket);
return () => {
newSocket.disconnect();
socketRef.current = null;
};
}, [token]);
return (
<SocketContext.Provider value={{ socket }}>
{children}
</SocketContext.Provider>
);
}
export function useSocket() {
const ctx = useContext(SocketContext);
if (!ctx) throw new Error('useSocket must be used within SocketProvider');
return ctx;
}