Skip to content

Commit 588a5fc

Browse files
implement theme provider
1 parent b1a047a commit 588a5fc

File tree

2 files changed

+46
-1
lines changed

2 files changed

+46
-1
lines changed

app/layout.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import {
88
import "./globals.css";
99
import { Inter, Space_Grotesk } from "next/font/google";
1010
import type { Metadata } from "next";
11+
import { ThemeProvider } from "@/context/ThemeProvider";
1112

1213
const inter = Inter({
1314
subsets: ["latin"],
@@ -50,7 +51,7 @@ export default function RootLayout({
5051
${inter.variable} ${spaceGrotesk.variable}
5152
`}
5253
>
53-
{children}
54+
<ThemeProvider>{children}</ThemeProvider>
5455
</body>
5556
</html>
5657
</ClerkProvider>

context/ThemeProvider.tsx

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,44 @@
1+
"use client";
2+
3+
import React, { createContext, useContext, useState, useEffect } from "react";
4+
5+
interface ThemeContextType {
6+
mode: string;
7+
setMode: (mode: string) => void;
8+
}
9+
10+
const ThemeContext = createContext<ThemeContextType | undefined>(undefined);
11+
12+
export function ThemeProvider({ children }: { children: React.ReactNode }) {
13+
const [mode, setMode] = useState("");
14+
15+
const handleThemeChange = () => {
16+
if (mode === "dark") {
17+
setMode("light");
18+
document.documentElement.classList.add("light");
19+
} else {
20+
setMode("dark");
21+
document.documentElement.classList.add("dark");
22+
}
23+
};
24+
25+
// useEffect(() => {
26+
// handleThemeChange();
27+
// }, [mode]);
28+
29+
return (
30+
<ThemeContext.Provider value={{ mode, setMode }}>
31+
{children}
32+
</ThemeContext.Provider>
33+
);
34+
}
35+
36+
export function useTheme() {
37+
const context = useContext(ThemeContext);
38+
39+
if (context === undefined) {
40+
throw new Error("useTheme must be used within a ThemeProvider");
41+
}
42+
43+
return context;
44+
}

0 commit comments

Comments
 (0)