Skip to content

Commit ac07622

Browse files
authored
Finish feature/167
2 parents b32b2b1 + 5acc185 commit ac07622

File tree

2 files changed

+22
-26
lines changed

2 files changed

+22
-26
lines changed

src/hooks/js/useOffline.js

+11-12
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,19 @@
1-
import { useEffect, useState } from 'react';
1+
import { useSyncExternalStore } from 'react';
22

33
export const useOffline = () => {
4-
const [offline, setOffline] = useState(null);
4+
const getSnapshot = () => !navigator.onLine;
55

6-
useEffect(() => {
7-
const handleNetworkState = () => {
8-
setOffline(!offline);
9-
};
10-
addEventListener('offline', handleNetworkState);
11-
addEventListener('online', handleNetworkState);
6+
const subscribe = (callback) => {
7+
const handleNetworkChange = () => callback();
8+
9+
window.addEventListener('online', handleNetworkChange);
10+
window.addEventListener('offline', handleNetworkChange);
1211

1312
return () => {
14-
removeEventListener('online', handleNetworkState);
15-
removeEventListener('offline', handleNetworkState);
13+
window.removeEventListener('online', handleNetworkChange);
14+
window.removeEventListener('offline', handleNetworkChange);
1615
};
17-
}, [offline]);
16+
};
1817

19-
return !!offline;
18+
return useSyncExternalStore(subscribe, getSnapshot);
2019
};

src/hooks/ts/useOffline.ts

+11-14
Original file line numberDiff line numberDiff line change
@@ -1,22 +1,19 @@
1-
import { useEffect, useState } from 'react';
1+
import { useSyncExternalStore } from 'react';
22

3-
type TUseOffline = () => boolean;
3+
export const useOffline = () => {
4+
const getSnapshot = () => !navigator.onLine;
45

5-
export const useOffline: TUseOffline = () => {
6-
const [offline, setOffline] = useState<boolean | null>(null);
6+
const subscribe = (callback: () => void) => {
7+
const handleNetworkChange = () => callback();
78

8-
useEffect(() => {
9-
const handleNetworkState = () => {
10-
setOffline(!offline);
11-
};
12-
addEventListener('offline', handleNetworkState);
13-
addEventListener('online', handleNetworkState);
9+
window.addEventListener('online', handleNetworkChange);
10+
window.addEventListener('offline', handleNetworkChange);
1411

1512
return () => {
16-
removeEventListener('online', handleNetworkState);
17-
removeEventListener('offline', handleNetworkState);
13+
window.removeEventListener('online', handleNetworkChange);
14+
window.removeEventListener('offline', handleNetworkChange);
1815
};
19-
}, [offline]);
16+
};
2017

21-
return !!offline;
18+
return useSyncExternalStore(subscribe, getSnapshot);
2219
};

0 commit comments

Comments
 (0)