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 ( {children} ); } export function useSocket() { const ctx = useContext(SocketContext); if (!ctx) throw new Error('useSocket must be used within SocketProvider'); return ctx; }