Skip to content

Commit 947deb6

Browse files
Merge pull request #28 from programming-with-ia/fix-useTheme-values
fix: useTheme values
2 parents 163931f + 865e049 commit 947deb6

File tree

3 files changed

+48
-47
lines changed

3 files changed

+48
-47
lines changed

src/components/random.tsx

Lines changed: 11 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -2,30 +2,25 @@ import { useEffect, useState } from "react";
22
import { Button } from "./ui/button";
33
import { createRandomTheme } from "../lib/create-theme-config";
44
import { useTheme } from "next-themes";
5-
import {
6-
getComputedHSLColor,
7-
saveTheme,
8-
} from "../lib/utils";
5+
import { getComputedHSLColor, saveTheme } from "../lib/utils";
96
import { Dices, Lock, UnLock } from "./icons";
107
import { SystemThemes, themeModes, ThemeWithHSLColor } from "../lib/theme";
118
import { themeEmittor } from "../lib/emittors";
9+
import { useIsMount } from "../hooks/useIsMount";
1210

1311
function RandomBtn() {
14-
const {
15-
resolvedTheme: NresolvedTheme = "" + undefined,
16-
systemTheme: NsystemTheme = "dark",
17-
} = useTheme();
18-
const [resolvedTheme, setResolvedTheme] = useState<string>();
19-
const [systemTheme, setSystemTheme] = useState<string>();
20-
useEffect(() => {
21-
setResolvedTheme(NresolvedTheme);
22-
setSystemTheme(NsystemTheme);
23-
}, [NresolvedTheme, NsystemTheme]);
12+
const { resolvedTheme = "" + undefined, systemTheme = "dark" } = useTheme();
13+
14+
const isMount = useIsMount();
2415
const [lockPrimary, setLockPrimary] = useState(true);
16+
17+
if (!isMount) return null;
18+
2519
const onClickHandler = () => {
2620
const themes = createRandomTheme(
2721
lockPrimary ? getComputedHSLColor("--primary") : undefined
2822
);
23+
2924
let theme;
3025

3126
if (SystemThemes.includes(resolvedTheme as any)) {
@@ -37,7 +32,9 @@ function RandomBtn() {
3732
}
3833
themeEmittor.applyTheme(theme);
3934
};
35+
4036
const LockIcon = lockPrimary ? Lock : UnLock;
37+
4138
return (
4239
<Button
4340
onClick={onClickHandler}

src/components/theme-toggle.tsx

Lines changed: 25 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,45 +1,37 @@
11
import { useTheme } from "next-themes";
22
import { cn } from "../lib/utils";
33
import { SVGProps, useEffect, useRef, useState } from "react";
4+
import { useIsMount } from "../hooks/useIsMount";
45

56
export default function ThemeToggle() {
67
const { theme, setTheme } = useTheme();
7-
const [CurrentTheme, setCurrentTheme] = useState<string | undefined>();
8-
useEffect(() => {
9-
setCurrentTheme(theme);
10-
}, [theme]);
8+
const isMount = useIsMount()
9+
10+
if (!isMount) return null;
1111

12-
function getClasses(isCurrentTheme: boolean) {
13-
return cn(
14-
"rounded-full p-2",
15-
isCurrentTheme
16-
? "bg-primary text-primary-foreground"
17-
: "hover:bg-accent hover:text-accent-foreground"
18-
);
19-
}
2012
return (
2113
<div className="flex items-center gap-2 p-1 rounded-full border bg-background text-foreground w-fit">
22-
<button
23-
onClick={() => setTheme("light")}
24-
aria-label="Toggle light theme"
25-
className={getClasses(CurrentTheme == "light")}
26-
>
27-
<SunIcon className="size-5" />
28-
</button>
29-
<button
30-
onClick={() => setTheme("dark")}
31-
aria-label="Toggle dark theme"
32-
className={getClasses(CurrentTheme == "dark")}
33-
>
34-
<MoonIcon className="size-5" />
35-
</button>
36-
<button
37-
onClick={() => setTheme("system")}
38-
aria-label="Toggle system theme"
39-
className={getClasses(CurrentTheme == "system")}
40-
>
41-
<MonitorIcon className="size-5" />
42-
</button>
14+
{(
15+
[
16+
["light", SunIcon],
17+
["dark", MoonIcon],
18+
["system", MonitorIcon],
19+
] as const
20+
).map(([themeN, Icon]) => (
21+
<button
22+
className={cn(
23+
"rounded-full p-2",
24+
theme == themeN
25+
? "bg-primary text-primary-foreground"
26+
: "hover:bg-accent hover:text-accent-foreground"
27+
)}
28+
aria-selected={theme == themeN || undefined}
29+
onClick={() => setTheme(themeN)}
30+
aria-label={`set ${themeN} theme`}
31+
>
32+
<Icon className="size-5" />
33+
</button>
34+
))}
4335
</div>
4436
);
4537
}

src/hooks/useIsMount.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
import { useEffect, useState } from "react";
2+
3+
export function useIsMount(){
4+
const [isMount, setIsMount] = useState(false);
5+
useEffect(() => {
6+
setIsMount(true)
7+
}, []);
8+
9+
return isMount
10+
}
11+
12+
export const useIsClient = useIsMount

0 commit comments

Comments
 (0)