diff --git a/components/ThemeToggle.tsx b/components/ThemeToggle.tsx index 3d57e030..ad9d3919 100644 --- a/components/ThemeToggle.tsx +++ b/components/ThemeToggle.tsx @@ -1,14 +1,12 @@ -import { useRecoilState } from "recoil"; -import { themeState } from "@/state/theme"; +import { useTheme } from "next-themes"; import { MoonIcon, SunIcon } from "@heroicons/react/24/outline"; const ThemeToggle = () => { - const [theme, setTheme] = useRecoilState(themeState); + const { theme, setTheme, resolvedTheme } = useTheme(); const toggleTheme = () => { - const newTheme = theme === "dark" ? "light" : "dark"; - setTheme(newTheme); - localStorage.setItem("theme", newTheme); + const current = resolvedTheme ?? theme; + setTheme(current === "dark" ? "light" : "dark"); }; return ( @@ -17,7 +15,7 @@ const ThemeToggle = () => { className="p-2 rounded-full bg-zinc-200 dark:bg-zinc-700 transition hover:scale-105" title="Toggle theme" > - {theme === "dark" ? ( + {(resolvedTheme ?? theme) === "dark" ? ( ) : ( @@ -26,4 +24,4 @@ const ThemeToggle = () => { ); }; -export default ThemeToggle; +export default ThemeToggle; \ No newline at end of file diff --git a/components/profile/activityoverview.tsx b/components/profile/activityoverview.tsx index 5deae478..cb894e1c 100644 --- a/components/profile/activityoverview.tsx +++ b/components/profile/activityoverview.tsx @@ -9,6 +9,7 @@ import { useRouter } from "next/router"; import axios from "axios"; import toast from "react-hot-toast"; import { Line } from "react-chartjs-2"; +import { useTheme } from "next-themes"; import { Chart as ChartJS, CategoryScale, @@ -28,8 +29,6 @@ import { IconClipboardList, IconClock, } from "@tabler/icons-react"; -import { useRecoilValue } from "recoil"; -import { themeState } from "@/state/theme"; import moment from "moment"; import type { ActivitySession, inactivityNotice } from "@prisma/client"; @@ -99,8 +98,8 @@ export function ActivityOverview({ const [loading, setLoading] = useState(true); const liveSessionTimerRef = useRef(null); - const theme = useRecoilValue(themeState); - const isDark = theme === "dark"; + const { resolvedTheme } = useTheme(); + const isDark = resolvedTheme === "dark"; const sortedTimeline = useMemo(() => { return [...timeline].sort((a, b) => { diff --git a/components/sidebar.tsx b/components/sidebar.tsx index dd5e759e..06d4343a 100644 --- a/components/sidebar.tsx +++ b/components/sidebar.tsx @@ -1,7 +1,7 @@ import { useState, useEffect, useRef } from "react"; import type { NextPage } from "next"; import { loginState, workspacestate } from "@/state"; -import { themeState } from "@/state/theme"; +import { useTheme } from "next-themes"; import { useRecoilState } from "recoil"; import { Menu, Listbox } from "@headlessui/react"; import { useRouter } from "next/router"; @@ -198,7 +198,7 @@ function MobileWorkspaceSwitcher({ const Sidebar: NextPage = ({ isCollapsed, setIsCollapsed }) => { const [login, setLogin] = useRecoilState(loginState); const [workspace, setWorkspace] = useRecoilState(workspacestate); - const [theme, setTheme] = useRecoilState(themeState); + const { theme, setTheme, resolvedTheme } = useTheme(); const [isMobileMenuOpen, setIsMobileMenuOpen] = useState(false); const [docsEnabled, setDocsEnabled] = useState(false); const [alliesEnabled, setAlliesEnabled] = useState(false); @@ -329,9 +329,7 @@ const Sidebar: NextPage = ({ isCollapsed, setIsCollapsed }) => { }; const toggleTheme = () => { - const newTheme = theme === "dark" ? "light" : "dark"; - setTheme(newTheme); - if (typeof window !== "undefined") localStorage.setItem("theme", newTheme); + setTheme(resolvedTheme === "dark" ? "light" : "dark"); }; useEffect(() => { @@ -599,11 +597,11 @@ const Sidebar: NextPage = ({ isCollapsed, setIsCollapsed }) => { "flex items-center justify-center w-7 h-7 rounded-lg shrink-0", active ? "bg-zinc-200/70 dark:bg-zinc-700" : "bg-zinc-100 dark:bg-zinc-800" )}> - {theme === "dark" + {resolvedTheme === "dark" ? : } - {theme === "dark" ? "Light mode" : "Dark mode"} + {resolvedTheme === "dark" ? "Light mode" : "Dark mode"} )} @@ -812,8 +810,8 @@ const Sidebar: NextPage = ({ isCollapsed, setIsCollapsed }) => { style={{ WebkitTapHighlightColor: "transparent" }} className="w-full flex items-center gap-3 px-4 py-3.5 text-sm text-zinc-700 dark:text-zinc-300 hover:bg-zinc-50 dark:hover:bg-zinc-800/60 transition-colors select-none outline-none" > - {theme === "dark" ? : } - {theme === "dark" ? "Light mode" : "Dark mode"} + {resolvedTheme === "dark" ? : } + {resolvedTheme === "dark" ? "Light mode" : "Dark mode"}