1
1
import { useEffect , useState } from 'react' ;
2
2
import useMemoizedFn from '../useMemoizedFn' ;
3
+ import isBrowser from '../utils/isBrowser' ;
3
4
4
5
export enum ThemeMode {
5
6
LIGHT = 'light' ,
@@ -11,12 +12,18 @@ export type ThemeModeType = `${ThemeMode}`;
11
12
12
13
export type ThemeType = 'light' | 'dark' ;
13
14
14
- const matchMedia = window . matchMedia ( '(prefers-color-scheme: dark)' ) ;
15
15
16
16
function useCurrentTheme ( ) {
17
+ const matchMedia = isBrowser
18
+ ? window . matchMedia ( '(prefers-color-scheme: dark)' )
19
+ : undefined ;
20
+
17
21
const [ theme , setTheme ] = useState < ThemeType > ( ( ) => {
18
- const init = matchMedia . matches ? ThemeMode . DARK : ThemeMode . LIGHT ;
19
- return init ;
22
+ if ( isBrowser ) {
23
+ return matchMedia ?. matches ? ThemeMode . DARK : ThemeMode . LIGHT ;
24
+ } else {
25
+ return ThemeMode . LIGHT ;
26
+ }
20
27
} ) ;
21
28
22
29
useEffect ( ( ) => {
@@ -28,10 +35,10 @@ function useCurrentTheme() {
28
35
}
29
36
} ;
30
37
31
- matchMedia . addEventListener ( 'change' , onThemeChange ) ;
38
+ matchMedia ? .addEventListener ( 'change' , onThemeChange ) ;
32
39
33
40
return ( ) => {
34
- matchMedia . removeEventListener ( 'change' , onThemeChange ) ;
41
+ matchMedia ? .removeEventListener ( 'change' , onThemeChange ) ;
35
42
} ;
36
43
} , [ ] ) ;
37
44
@@ -47,7 +54,8 @@ export default function useTheme(options: Options = {}) {
47
54
48
55
const [ themeMode , setThemeMode ] = useState < ThemeModeType > ( ( ) => {
49
56
const preferredThemeMode =
50
- localStorageKey ?. length && ( localStorage . getItem ( localStorageKey ) as ThemeModeType | null ) ;
57
+ localStorageKey ?. length &&
58
+ ( localStorage . getItem ( localStorageKey ) as ThemeModeType | null ) ;
51
59
52
60
return preferredThemeMode ? preferredThemeMode : ThemeMode . SYSTEM ;
53
61
} ) ;
0 commit comments