Skip to content

Commit dbbaa69

Browse files
authored
simplify theme switch (#461)
1 parent c522346 commit dbbaa69

File tree

2 files changed

+71
-62
lines changed

2 files changed

+71
-62
lines changed

src/app/ClientRoot.tsx

Lines changed: 23 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,24 +1,37 @@
11
"use client";
22

3+
import Link from "next/link";
34
import { ThemeProvider } from "next-themes";
5+
import { Footer, VersionSelector } from "@/components/ui";
6+
import GithubButton from "@/components/ui/GithubButton";
7+
import HomeButton from "@/components/ui/HomeButton";
48
import MobileUIHider from "@/components/ui/MobileUIHider";
5-
import { Footer } from "@/components/ui";
6-
import { BrowZarrPopover } from "./BrowZarrPopover";
7-
import { VersionSelector } from "@/components/ui";
8-
import Link from "next/link";
99
import ThemeSwitch from "@/components/ui/ThemeSwitch";
10-
import HomeButton from "@/components/ui/HomeButton";
11-
import GithubButton from "@/components/ui/GithubButton";
10+
import { BrowZarrPopover } from "./BrowZarrPopover";
1211

13-
export default function ClientRoot({ children }: { children: React.ReactNode }) {
12+
export default function ClientRoot({
13+
children,
14+
}: {
15+
children: React.ReactNode;
16+
}) {
1417
return (
15-
<ThemeProvider attribute="data-theme" enableSystem defaultTheme="system" disableTransitionOnChange>
18+
<ThemeProvider
19+
attribute="data-theme"
20+
enableSystem
21+
defaultTheme="system"
22+
disableTransitionOnChange
23+
>
1624
<MobileUIHider />
1725
{/* left menu */}
1826
<div className="fixed top-2 left-2 z-50 flex items-center gap-2">
1927
<HomeButton />
2028
<BrowZarrPopover />
21-
<Link href="/docs" className="text-sm underline sm:inline-block" target="_blank" rel="noopener noreferrer">
29+
<Link
30+
href="/docs"
31+
className="text-sm underline sm:inline-block"
32+
target="_blank"
33+
rel="noopener noreferrer"
34+
>
2235
docs
2336
</Link>
2437
</div>
@@ -28,9 +41,7 @@ export default function ClientRoot({ children }: { children: React.ReactNode })
2841
<GithubButton />
2942
<ThemeSwitch />
3043
</div>
31-
<main className="min-h-screen">
32-
{children}
33-
</main>
44+
<main className="min-h-screen">{children}</main>
3445
<Footer />
3546
</ThemeProvider>
3647
);

src/components/ui/ThemeSwitch.tsx

Lines changed: 48 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -1,57 +1,55 @@
1-
'use client';
1+
"use client";
22

3-
import { useState, useEffect } from 'react'
4-
import { useTheme } from 'next-themes'
5-
import { BsMoonStarsFill } from "react-icons/bs";
6-
import { BsSunFill } from "react-icons/bs";
7-
import { Button } from "@/components/ui/button"
3+
import { useTheme } from "next-themes";
4+
import { useEffect, useState } from "react";
5+
import { BsMoonStarsFill, BsSunFill } from "react-icons/bs";
6+
import { Button } from "@/components/ui/button";
87
import {
9-
Tooltip,
10-
TooltipContent,
11-
TooltipTrigger,
12-
} from "@/components/ui/tooltip"
13-
8+
Tooltip,
9+
TooltipContent,
10+
TooltipTrigger,
11+
} from "@/components/ui/tooltip";
1412

1513
const ThemeSwitch = () => {
16-
const [mounted, setMounted] = useState(false)
17-
const { theme, setTheme, resolvedTheme } = useTheme()
18-
19-
const toggleTheme = () => {
20-
if (theme === 'dark') {
21-
setTheme('light')
22-
} else {
23-
setTheme('dark')
24-
}
25-
}
26-
// useEffect only runs on the client, so now we can safely show the UI
27-
useEffect(() => {
28-
setTimeout(() => {
29-
setMounted(true);
30-
}, 0);
31-
}, []);
14+
const [mounted, setMounted] = useState(false);
15+
const { resolvedTheme, setTheme } = useTheme();
16+
17+
// useEffect only runs on the client, so now we can safely show the UI
18+
useEffect(() => {
19+
setTimeout(() => {
20+
setMounted(true);
21+
}, 0);
22+
}, []);
3223

33-
const current = mounted ? (theme ?? resolvedTheme) : undefined
24+
if (!mounted) return null;
3425

35-
return (
36-
<Tooltip delayDuration={500} >
37-
<TooltipTrigger asChild>
38-
<Button
39-
variant="ghost"
40-
size="icon"
41-
className="cursor-pointer"
42-
onClick={toggleTheme}
43-
>
44-
{!mounted ? <BsSunFill className="size-6" /> : current === 'dark' ? <BsMoonStarsFill className="size-6"/> : <BsSunFill className="size-6"/>}
45-
</Button>
46-
</TooltipTrigger>
47-
<TooltipContent side="bottom" align="start">
48-
{current === 'dark' ?
49-
<span>Switch to Light Mode</span> :
50-
<span>Switch to Dark Mode</span>
51-
}
52-
</TooltipContent>
53-
</Tooltip>
54-
)
55-
}
26+
return (
27+
<Tooltip delayDuration={500}>
28+
<TooltipTrigger asChild>
29+
<Button
30+
variant="ghost"
31+
size="icon"
32+
className="cursor-pointer"
33+
onClick={() =>
34+
setTheme(resolvedTheme === "light" ? "dark" : "light")
35+
}
36+
>
37+
{resolvedTheme === "light" ? (
38+
<BsMoonStarsFill className="size-6" />
39+
) : (
40+
<BsSunFill className="size-6" />
41+
)}
42+
</Button>
43+
</TooltipTrigger>
44+
<TooltipContent side="bottom" align="start">
45+
{resolvedTheme === "dark" ? (
46+
<span>Switch to Light Mode</span>
47+
) : (
48+
<span>Switch to Dark Mode</span>
49+
)}
50+
</TooltipContent>
51+
</Tooltip>
52+
);
53+
};
5654

57-
export default ThemeSwitch
55+
export default ThemeSwitch;

0 commit comments

Comments
 (0)