SocketContext.tsx (1090B)
1 import { SocketClient } from '@/lib/sockets' 2 import { useRouter } from 'next/router' 3 import { createContext, ReactNode, useContext, useEffect, useMemo, useReducer, useRef } from 'react' 4 5 const SocketContext = createContext<SocketClient>(null as any) 6 7 export function SocketProvider ({ children }: { children: ReactNode }) { 8 const router = useRouter() 9 const client = useMemo(() => new SocketClient(), []) 10 11 useEffect(() => { 12 let connTimeout: any 13 14 if (client.isConnected) { 15 return 16 } 17 18 const tryConnect = () => { 19 client.connect() 20 .then(() => { 21 22 }, () => { 23 connTimeout = setTimeout(tryConnect, 1000) 24 }) 25 } 26 27 tryConnect() 28 29 return () => { 30 if (connTimeout != null) { 31 clearTimeout(connTimeout) 32 } 33 } 34 }, []) 35 36 useEffect(() => { 37 client.wait() 38 .then(() => client.changePath(router.asPath)) 39 }, [router.asPath]) 40 41 return ( 42 <SocketContext.Provider value={client}> 43 {children} 44 </SocketContext.Provider> 45 ) 46 } 47 48 export function useSocket () { 49 return useContext(SocketContext) 50 }