Spaces:
Sleeping
Sleeping
| 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; | |
| } | |