1
1
import { useEffect , useState } from 'react'
2
2
3
3
interface UseColorModesOutput {
4
- getColorMode : ( ) => string
4
+ getColorMode : ( ) => string | undefined
5
5
isColorModeSet : ( ) => boolean
6
6
setColorMode : ( mode : string ) => void
7
7
}
8
8
9
- const getStoredTheme = ( localStorageItemName : string ) => localStorage . getItem ( localStorageItemName )
9
+ const getStoredTheme = ( localStorageItemName : string ) =>
10
+ typeof window !== 'undefined' && localStorage . getItem ( localStorageItemName )
10
11
const setStoredTheme = ( localStorageItemName : string , colorMode : string ) =>
11
12
localStorage . setItem ( localStorageItemName , colorMode )
12
13
13
14
const getPreferredColorScheme = ( localStorageItemName : string ) => {
15
+ if ( typeof window === 'undefined' ) {
16
+ return
17
+ }
18
+
14
19
const storedTheme = getStoredTheme ( localStorageItemName )
15
20
16
21
if ( storedTheme ) {
@@ -33,17 +38,21 @@ const setTheme = (colorMode: string) => {
33
38
export const useColorModes = (
34
39
localStorageItemName = 'coreui-react-color-scheme' ,
35
40
) : UseColorModesOutput => {
36
- const [ colorMode , setColorMode ] = useState < string > ( getPreferredColorScheme ( localStorageItemName ) )
41
+ const [ colorMode , setColorMode ] = useState < string | undefined > (
42
+ getPreferredColorScheme ( localStorageItemName ) ,
43
+ )
37
44
38
45
useEffect ( ( ) => {
39
- setStoredTheme ( localStorageItemName , colorMode )
40
- setTheme ( colorMode )
46
+ if ( colorMode ) {
47
+ setStoredTheme ( localStorageItemName , colorMode )
48
+ setTheme ( colorMode )
49
+ }
41
50
} , [ colorMode ] )
42
51
43
52
useEffect ( ( ) => {
44
53
window . matchMedia ( '(prefers-color-scheme: dark)' ) . addEventListener ( 'change' , ( ) => {
45
54
const storedTheme = getStoredTheme ( localStorageItemName )
46
- if ( storedTheme !== 'light' && storedTheme !== 'dark' ) {
55
+ if ( storedTheme !== 'light' && storedTheme !== 'dark' && colorMode ) {
47
56
setTheme ( colorMode )
48
57
}
49
58
} )
0 commit comments