Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
38 changes: 17 additions & 21 deletions Frontend/src/components/mode-toggle.jsx
Original file line number Diff line number Diff line change
@@ -1,26 +1,22 @@
import { Moon, Sun } from "lucide-react"
import { useTheme } from "./theme-provider"
import { Button } from "./ui/button"
import { DropdownMenu, DropdownMenuContent, DropdownMenuItem, DropdownMenuTrigger } from "./ui/dropdown-menu"
import { Moon, Sun } from "lucide-react";
import { useTheme } from "./theme-provider";
import { Button } from "./ui/button";

export function ModeToggle() {
const { setTheme } = useTheme()
const { theme, setTheme } = useTheme();

return (
<DropdownMenu>
<DropdownMenuTrigger asChild>
<Button variant="outline" size="icon">
<Sun className="h-[1.2rem] w-[1.2rem] rotate-0 scale-100 transition-all dark:-rotate-90 dark:scale-0" />
<Moon className="absolute h-[1.2rem] w-[1.2rem] rotate-90 scale-0 transition-all dark:rotate-0 dark:scale-100" />
<span className="sr-only">Toggle theme</span>
</Button>
</DropdownMenuTrigger>
<DropdownMenuContent align="end">
<DropdownMenuItem onClick={() => setTheme("light")}>Light</DropdownMenuItem>
<DropdownMenuItem onClick={() => setTheme("dark")}>Dark</DropdownMenuItem>
<DropdownMenuItem onClick={() => setTheme("system")}>System</DropdownMenuItem>
</DropdownMenuContent>
</DropdownMenu>
)
<Button
variant="outline"
size="icon"
onClick={() => setTheme(theme === "dark" ? "light" : "dark")}
>
{theme === "dark" ? (
<Sun className="h-[1.2rem] w-[1.2rem]" />
) : (
<Moon className="h-[1.2rem] w-[1.2rem]" />
)}
<span className="sr-only">Toggle theme</span>
</Button>
);
}

56 changes: 16 additions & 40 deletions Frontend/src/components/theme-provider.jsx
Original file line number Diff line number Diff line change
@@ -1,50 +1,26 @@
import React from "react"
import React, { createContext, useContext, useEffect, useState } from "react";

import { createContext, useContext, useEffect, useState } from "react"
const ThemeContext = createContext({
theme: "light",
setTheme: () => {},
});

const ThemeProviderContext = createContext({
theme: "system",
setTheme: () => null,
})

export function ThemeProvider({ children, defaultTheme = "system", storageKey = "vite-ui-theme", ...props }) {
const [theme, setTheme] = useState(() => localStorage.getItem(storageKey) || defaultTheme)
export function ThemeProvider({ children, storageKey = "vite-ui-theme" }) {
const [theme, setTheme] = useState(() => localStorage.getItem(storageKey) || "light");

useEffect(() => {
const root = window.document.documentElement

root.classList.remove("light", "dark")

if (theme === "system") {
const systemTheme = window.matchMedia("(prefers-color-scheme: dark)").matches ? "dark" : "light"

root.classList.add(systemTheme)
return
}

root.classList.add(theme)
}, [theme])

const value = {
theme,
setTheme: (theme) => {
localStorage.setItem(storageKey, theme)
setTheme(theme)
},
}
const root = document.documentElement;
root.classList.toggle("dark", theme === "dark");
localStorage.setItem(storageKey, theme);
}, [theme]);

return (
<ThemeProviderContext.Provider {...props} value={value}>
<ThemeContext.Provider value={{ theme, setTheme }}>
{children}
</ThemeProviderContext.Provider>
)
</ThemeContext.Provider>
);
}

export const useTheme = () => {
const context = useContext(ThemeProviderContext)

if (context === undefined) throw new Error("useTheme must be used within a ThemeProvider")

return context
export function useTheme() {
return useContext(ThemeContext);
}

5 changes: 3 additions & 2 deletions Frontend/src/index.jsx
Original file line number Diff line number Diff line change
Expand Up @@ -2,11 +2,12 @@ import React from "react"
import ReactDOM from "react-dom/client"
import "./styles/globals.css"
import App from "./App"
import { ThemeProvider } from "./components/theme-provider"

const root = ReactDOM.createRoot(document.getElementById("root"))
root.render(
<React.StrictMode>
<ThemeProvider>
<App />
</React.StrictMode>,
</ThemeProvider>,
)

Loading