Spaces:
Sleeping
Sleeping
File size: 1,586 Bytes
0a8fe79 | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 | 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;
}
|