Skip to content

Commit 4925372

Browse files
committed
fix: fix ssr bug
1 parent c7bb04c commit 4925372

File tree

1 file changed

+22
-16
lines changed

1 file changed

+22
-16
lines changed

packages/hooks/src/useTheme/index.ts

+22-16
Original file line numberDiff line numberDiff line change
@@ -1,42 +1,47 @@
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";
34

45
export enum ThemeMode {
5-
LIGHT = 'light',
6-
DARK = 'dark',
7-
SYSTEM = 'system',
6+
LIGHT = "light",
7+
DARK = "dark",
8+
SYSTEM = "system",
89
}
910

1011
export type ThemeModeType = `${ThemeMode}`;
1112

12-
export type ThemeType = 'light' | 'dark';
13+
export type ThemeType = "light" | "dark";
1314

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;
1719
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+
}
2025
});
2126

2227
useEffect(() => {
23-
const onThemeChange: MediaQueryList['onchange'] = (event) => {
28+
const onThemeChange: MediaQueryList["onchange"] = (event) => {
2429
if (event.matches) {
2530
setTheme(ThemeMode.DARK);
2631
} else {
2732
setTheme(ThemeMode.LIGHT);
2833
}
2934
};
3035

31-
matchMedia.addEventListener('change', onThemeChange);
36+
matchMedia?.addEventListener("change", onThemeChange);
3237

3338
return () => {
34-
matchMedia.removeEventListener('change', onThemeChange);
39+
matchMedia?.removeEventListener("change", onThemeChange);
3540
};
3641
}, []);
3742

3843
return theme;
39-
}
44+
};
4045

4146
type Options = {
4247
localStorageKey?: string;
@@ -47,7 +52,8 @@ export default function useTheme(options: Options = {}) {
4752

4853
const [themeMode, setThemeMode] = useState<ThemeModeType>(() => {
4954
const preferredThemeMode =
50-
localStorageKey?.length && (localStorage.getItem(localStorageKey) as ThemeModeType | null);
55+
localStorageKey?.length &&
56+
(localStorage.getItem(localStorageKey) as ThemeModeType | null);
5157

5258
return preferredThemeMode ? preferredThemeMode : ThemeMode.SYSTEM;
5359
});

0 commit comments

Comments
 (0)