11import { useCallback , useMemo } from "react" ;
22import { useSyncExternalStore } from "."
3+ import { ConnectionState } from "../models" ;
34
45const listeners = new Set < ( ) => void > ( ) ;
56const handler = ( ) => listeners . forEach ( l => l ( ) ) ;
67
78const getConnetionState = ( ) => {
89 const connection = Reflect . get ( navigator , "connection" ) ;
9- let obj = { online : navigator . onLine } ;
10+ const obj : ConnectionState = {
11+ isSupported : ! ! connection ,
12+ isOnline : navigator . onLine
13+ } ;
1014 if ( connection ) {
1115 obj . isSupported = true ;
1216 obj . downlink = connection . downlink as number ;
@@ -15,23 +19,32 @@ const getConnetionState = () => {
1519 obj . rtt = connection . rtt as number ;
1620 obj . saveData = connection . saveData as boolean ;
1721 obj . type = connection . type as "bluetooth" | "cellular" | "ethernet" | "none" | "wifi" | "wimax" | "other" | "unknown" ;
18- } else {
19- obj . isSupported = false ;
20- obj . downlink = null ;
21- obj . downlinkMax = null ;
22- obj . effectiveType = null ;
23- obj . rtt = null ;
24- obj . saveData = null ;
25- obj . type = null ;
2622 }
23+ return obj ;
2724}
25+
2826export const useNetwork = ( ) => {
2927 return useSyncExternalStore (
3028 useCallback ( notif => {
31-
29+ const connection = Reflect . get ( navigator , "connection" ) ;
30+ if ( listeners . size === 0 ) {
31+ window . addEventListener ( "online" , handler ) ;
32+ window . addEventListener ( "offline" , handler ) ;
33+ ! ! connection && connection . addEventListener ( "change" , handler ) ;
34+ }
35+ listeners . add ( notif ) ;
36+ return ( ) => {
37+ listeners . delete ( handler ) ;
38+ if ( listeners . size === 0 ) {
39+ window . removeEventListener ( "online" , handler ) ;
40+ window . removeEventListener ( "offline" , handler ) ;
41+ ! ! connection && connection . removeEventListener ( "change" , handler ) ;
42+ }
43+ }
3244 } , [ ] ) ,
3345 useMemo ( ( ) => {
3446 let prevState = getConnetionState ( ) ;
47+ return ( ) => { }
3548 } , [ ] )
3649 ) ;
3750}
0 commit comments