diff --git a/src/App.tsx b/src/App.tsx index b2c715d..0920bce 100644 --- a/src/App.tsx +++ b/src/App.tsx @@ -5,6 +5,7 @@ import { TooltipProvider } from "@/components/ui/tooltip"; import { QueryClient, QueryClientProvider } from "@tanstack/react-query"; import { BrowserRouter, Routes, Route } from "react-router-dom"; import { UserProvider } from "@/contexts/UserContext"; +import { ThemeProvider } from "@/contexts/ThemeContext"; import AppRoutes from "./routes"; const queryClient = new QueryClient({ @@ -20,15 +21,17 @@ const queryClient = new QueryClient({ const App = () => ( - - -
- - - -
-
-
+ + + +
+ + + +
+
+
+
); diff --git a/src/components/ThemeToggle.tsx b/src/components/ThemeToggle.tsx new file mode 100644 index 0000000..8b17e5f --- /dev/null +++ b/src/components/ThemeToggle.tsx @@ -0,0 +1,46 @@ +import React from 'react'; +import { useTheme as useNextTheme } from 'next-themes'; +import { Sun, Moon, Monitor } from 'lucide-react'; +import { + DropdownMenu, + DropdownMenuContent, + DropdownMenuItem, + DropdownMenuTrigger, +} from "@/components/ui/dropdown-menu"; +import { Button } from "@/components/ui/button"; +import { Theme } from '@/contexts/ThemeContext'; + +export const ThemeToggle = () => { + const { theme, setTheme } = useNextTheme(); + + return ( + + + + + + setTheme('light')}> + + Light + + setTheme('dark')}> + + Dark + + setTheme('system')}> + + System + + + + ); +}; diff --git a/src/components/TopBar.tsx b/src/components/TopBar.tsx index f8a792b..5540e5a 100644 --- a/src/components/TopBar.tsx +++ b/src/components/TopBar.tsx @@ -14,6 +14,7 @@ import { DropdownMenuTrigger, } from "@/components/ui/dropdown-menu"; import { BookFormDialog } from './BookFormDialog'; +import { ThemeToggle } from './ThemeToggle'; const TopBar = () => { const [searchQuery, setSearchQuery] = useState(''); @@ -46,7 +47,7 @@ const handleSearch = (e: React.FormEvent) => { return ( <> -
+
@@ -88,7 +89,8 @@ const handleSearch = (e: React.FormEvent) => { )}
-
+
+ diff --git a/src/contexts/ThemeContext.tsx b/src/contexts/ThemeContext.tsx new file mode 100644 index 0000000..ff8d25e --- /dev/null +++ b/src/contexts/ThemeContext.tsx @@ -0,0 +1,26 @@ +import React, { createContext, useContext, useEffect, useState } from 'react'; +import { ThemeProvider as NextThemesProvider } from 'next-themes'; + +// Define the theme options +export type Theme = 'light' | 'dark' | 'system'; + +// Create a context for theme-related functionality +export const ThemeContext = createContext<{ + theme: Theme; + setTheme: (theme: Theme) => void; +}>({ + theme: 'system', + setTheme: () => {}, +}); + +// Custom hook to use the theme context +export const useTheme = () => useContext(ThemeContext); + +// Theme provider component +export const ThemeProvider: React.FC<{ children: React.ReactNode }> = ({ children }) => { + return ( + + {children} + + ); +};