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"}