add theme toggle functionality
This commit is contained in:
@@ -1,5 +1,6 @@
|
|||||||
import { IconUser, IconSun, IconMoon } from "@tabler/icons-react";
|
import { IconUser } from "@tabler/icons-react";
|
||||||
import Link from "next/link";
|
import Link from "next/link";
|
||||||
|
import ThemeToggle from "./ThemeToggle";
|
||||||
|
|
||||||
export default function Navbar() {
|
export default function Navbar() {
|
||||||
return (
|
return (
|
||||||
@@ -37,9 +38,7 @@ export default function Navbar() {
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="flex-none">
|
<div className="flex-none">
|
||||||
<div className="btn btn-ghost btn-circle">
|
<ThemeToggle />
|
||||||
<IconSun className="m-auto block h-full" />
|
|
||||||
</div>
|
|
||||||
<label tabIndex={0} htmlFor="auth-modal" className="btn btn-ghost btn-circle avatar">
|
<label tabIndex={0} htmlFor="auth-modal" className="btn btn-ghost btn-circle avatar">
|
||||||
<div className="w-10 rounded-full">
|
<div className="w-10 rounded-full">
|
||||||
<IconUser className="m-auto block h-full" />
|
<IconUser className="m-auto block h-full" />
|
||||||
|
|||||||
39
client/src/components/ThemeToggle.tsx
Normal file
39
client/src/components/ThemeToggle.tsx
Normal file
@@ -0,0 +1,39 @@
|
|||||||
|
"use client";
|
||||||
|
|
||||||
|
import { IconSun, IconMoon } from "@tabler/icons-react";
|
||||||
|
import { useState, useEffect } from "react";
|
||||||
|
|
||||||
|
export default function ThemeToggle() {
|
||||||
|
const [darkTheme, setDarkTheme] = useState(false);
|
||||||
|
|
||||||
|
useEffect(() => {
|
||||||
|
window
|
||||||
|
.matchMedia("(prefers-color-scheme: dark)")
|
||||||
|
.addEventListener("change", (e) => changeTheme(e.matches ? "dark" : "light"));
|
||||||
|
|
||||||
|
changeTheme(window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light");
|
||||||
|
}, []);
|
||||||
|
|
||||||
|
function changeTheme(theme: "dark" | "light") {
|
||||||
|
if (theme === "dark") {
|
||||||
|
document.documentElement.setAttribute("data-theme", "chessuDark");
|
||||||
|
setDarkTheme(true);
|
||||||
|
} else {
|
||||||
|
document.documentElement.setAttribute("data-theme", "chessuLight");
|
||||||
|
setDarkTheme(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return (
|
||||||
|
<button
|
||||||
|
type="button"
|
||||||
|
onClick={() => changeTheme(darkTheme ? "light" : "dark")}
|
||||||
|
className="btn btn-ghost btn-circle"
|
||||||
|
>
|
||||||
|
{darkTheme ? (
|
||||||
|
<IconSun className="m-auto block h-full" />
|
||||||
|
) : (
|
||||||
|
<IconMoon className="m-auto block h-full" />
|
||||||
|
)}
|
||||||
|
</button>
|
||||||
|
);
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user