Add themeSelector component

This commit is contained in:
Nicola Benaglia
2025-04-03 09:24:52 +02:00
parent 57e33c97a3
commit d92d75040d
6 changed files with 492 additions and 321 deletions

View File

@@ -0,0 +1,23 @@
import { createContext, useContext, useState, useMemo } from 'react';
import { ThemeProvider as MuiThemeProvider } from '@mui/material/styles';
import { darkTheme, lightTheme } from '../../styles/theme';
const ThemeContext = createContext({ themeMode: 'light', toggleTheme: () => {} });
export const ThemeProvider = ({ children }: { children: React.ReactNode }) => {
const [themeMode, setThemeMode] = useState('light');
const theme = useMemo(() => (themeMode === 'light' ? lightTheme : darkTheme), [themeMode]);
const toggleTheme = () => {
setThemeMode((prevMode) => (prevMode === 'light' ? 'dark' : 'light'));
};
return (
<ThemeContext.Provider value={{ themeMode, toggleTheme }}>
<MuiThemeProvider theme={theme}>{children}</MuiThemeProvider>
</ThemeContext.Provider>
);
};
export const useThemeContext = () => useContext(ThemeContext);

View File

@@ -0,0 +1,18 @@
import { useThemeContext } from "./ThemeContext";
import { Switch } from "@mui/material";
import { Brightness4, Brightness7 } from "@mui/icons-material";
const ThemeSelector = ({ style }) => {
const { themeMode, toggleTheme } = useThemeContext();
return (
<div
style={{ display: "flex", flexDirection: "column", alignItems: "center", gap: "1px", ...style }}
>
{themeMode === "dark" ? <Brightness7 /> : <Brightness4 />}
<Switch checked={themeMode === "dark"} onChange={toggleTheme} />
</div>
);
};
export default ThemeSelector;