diff --git a/apps/web/package.json b/apps/web/package.json
index df9d7353..72310484 100644
--- a/apps/web/package.json
+++ b/apps/web/package.json
@@ -49,6 +49,7 @@
"next": "^15.3.4",
"next-logger": "^5.0.1",
"next-runtime-env": "^1.7.2",
+ "next-themes": "^0.4.6",
"nextjs-cors": "^2.2.0",
"pino": "^9.6.0",
"posthog-js": "^1.254.0",
diff --git a/apps/web/src/components/Dashboard.tsx b/apps/web/src/components/Dashboard.tsx
index 7d94eca8..461bc5cb 100644
--- a/apps/web/src/components/Dashboard.tsx
+++ b/apps/web/src/components/Dashboard.tsx
@@ -10,7 +10,7 @@ import { authClient } from "@kan/auth/client";
import { useClickOutside } from "~/hooks/useClickOutside";
import { useModal } from "~/providers/modal";
-import { useTheme } from "~/providers/theme";
+import { useTheme } from "next-themes";
import { WorkspaceProvider } from "~/providers/workspace";
import FeedbackModal from "./FeedbackModal";
import Modal from "./modal";
@@ -41,7 +41,7 @@ export default function Dashboard({
rightPanel,
hasRightPanel = false,
}: DashboardProps) {
- const theme = useTheme();
+ const { theme } = useTheme();
const { modalContentType } = useModal();
const { data: session, isPending: sessionLoading } = authClient.useSession();
@@ -90,7 +90,7 @@ export default function Dashboard({
}
});
- const isDarkMode = theme.activeTheme === "dark";
+ const isDarkMode = theme === "dark";
return (
<>
diff --git a/apps/web/src/components/SideNavigation.tsx b/apps/web/src/components/SideNavigation.tsx
index 8eddc299..fe18ae7a 100644
--- a/apps/web/src/components/SideNavigation.tsx
+++ b/apps/web/src/components/SideNavigation.tsx
@@ -18,7 +18,7 @@ import settingsIconLight from "~/assets/settings-light.json";
import ReactiveButton from "~/components/ReactiveButton";
import UserMenu from "~/components/UserMenu";
import WorkspaceMenu from "~/components/WorkspaceMenu";
-import { useTheme } from "~/providers/theme";
+import { useTheme } from "next-themes";
interface SideNavigationProps {
user: UserType;
@@ -59,9 +59,9 @@ export default function SideNavigation({
const { pathname } = router;
- const { activeTheme } = useTheme();
+ const { theme, resolvedTheme } = useTheme();
- const isDarkMode = activeTheme === "dark";
+ const isDarkMode = resolvedTheme === "dark";
const navigation = [
{
diff --git a/apps/web/src/components/ThemeToggle.tsx b/apps/web/src/components/ThemeToggle.tsx
index 623b8263..c24edd3e 100644
--- a/apps/web/src/components/ThemeToggle.tsx
+++ b/apps/web/src/components/ThemeToggle.tsx
@@ -1,23 +1,22 @@
import { CgDarkMode } from "react-icons/cg";
-
-import { useTheme } from "~/providers/theme";
+import { useTheme } from "next-themes";
const ThemeToggle = () => {
- const { themePreference, switchTheme } = useTheme();
+ const { theme, setTheme } = useTheme();
const toggleTheme = () => {
- switchTheme(themePreference === "light" ? "dark" : "light");
+ setTheme(theme === "light" ? "dark" : "light");
};
return (
diff --git a/apps/web/src/components/UserMenu.tsx b/apps/web/src/components/UserMenu.tsx
index c79127f4..14727cd0 100644
--- a/apps/web/src/components/UserMenu.tsx
+++ b/apps/web/src/components/UserMenu.tsx
@@ -10,7 +10,7 @@ import { authClient } from "@kan/auth/client";
import { useIsMobile } from "~/hooks/useMediaQuery";
import { useModal } from "~/providers/modal";
-import { useTheme } from "~/providers/theme";
+import { useTheme } from "next-themes";
import { getAvatarUrl } from "~/utils/helpers";
interface UserMenuProps {
@@ -29,7 +29,7 @@ export default function UserMenu({
onCloseSideNav,
}: UserMenuProps) {
const router = useRouter();
- const { themePreference, switchTheme } = useTheme();
+ const { theme, setTheme } = useTheme();
const { openModal } = useModal();
const isMobile = useIsMobile();
@@ -127,12 +127,12 @@ export default function UserMenu({