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