Skip to content
ThemeSwitcher.tsx 895 B
Newer Older
Grant's avatar
Grant committed
import "@theme-toggles/react/css/Classic.css";
import { Classic } from "@theme-toggles/react";
Ategon Dev's avatar
Ategon Dev committed

Grant's avatar
Grant committed
import { useTheme } from "next-themes";
Ategon Dev's avatar
Ategon Dev committed
import { useEffect, useState } from "react";
import { Button } from "@nextui-org/react";

export function ThemeSwitcher() {
Grant's avatar
Grant committed
  const [mounted, setMounted] = useState(false);
  const { theme, setTheme } = useTheme();
  const [isToggled, setToggle] = useState(false);
Ategon Dev's avatar
Ategon Dev committed

  useEffect(() => {
Grant's avatar
Grant committed
    setMounted(true);
    setToggle(theme === "dark");
  }, []);
Ategon Dev's avatar
Ategon Dev committed

  useEffect(() => {
    if (isToggled) {
Grant's avatar
Grant committed
      setTheme("dark");
Ategon Dev's avatar
Ategon Dev committed
    } else {
Grant's avatar
Grant committed
      setTheme("light");
Ategon Dev's avatar
Ategon Dev committed
    }
Grant's avatar
Grant committed
  }, [isToggled]);
Ategon Dev's avatar
Ategon Dev committed

Grant's avatar
Grant committed
  if (!mounted) return null;
Ategon Dev's avatar
Ategon Dev committed

  return (
Grant's avatar
Grant committed
    <Button
      onPress={() => {
        setToggle(!isToggled);
      }}
      variant="faded"
    >
Ategon Dev's avatar
Ategon Dev committed
      <Classic toggled={isToggled} placeholder={undefined} />
Grant's avatar
Grant committed
      <p>{theme === "dark" ? "Dark" : "Light"}</p>
Ategon Dev's avatar
Ategon Dev committed
    </Button>
Grant's avatar
Grant committed
  );
}