diff --git a/geneit_app/src/App.tsx b/geneit_app/src/App.tsx index c52a00c..779454d 100644 --- a/geneit_app/src/App.tsx +++ b/geneit_app/src/App.tsx @@ -1,4 +1,3 @@ -import { ThemeProvider, createTheme } from "@mui/material/styles"; import React from "react"; import { Route, Routes } from "react-router-dom"; import "./App.css"; @@ -24,12 +23,6 @@ interface AuthContext { const AuthContextK = React.createContext(null); -const darkTheme = createTheme({ - palette: { - mode: "dark", // TODO : switch back to light - }, -}); - /** * Core app */ @@ -42,37 +35,35 @@ export function App(): React.ReactElement { }; return ( - - - - } /> + + + } /> - {signedIn ? ( - }> - } /> - } /> - }> - } /> - } /> - + {signedIn ? ( + }> + } /> + } /> + }> + } /> } /> - ) : ( - }> - } /> - } /> - } /> - } - /> - } /> - } /> - - )} - - - + } /> + + ) : ( + }> + } /> + } /> + } /> + } + /> + } /> + } /> + + )} + + ); } diff --git a/geneit_app/src/widgets/AlertDialogProvider.tsx b/geneit_app/src/context_providers/AlertDialogProvider.tsx similarity index 100% rename from geneit_app/src/widgets/AlertDialogProvider.tsx rename to geneit_app/src/context_providers/AlertDialogProvider.tsx diff --git a/geneit_app/src/widgets/ConfirmDialogProvider.tsx b/geneit_app/src/context_providers/ConfirmDialogProvider.tsx similarity index 100% rename from geneit_app/src/widgets/ConfirmDialogProvider.tsx rename to geneit_app/src/context_providers/ConfirmDialogProvider.tsx diff --git a/geneit_app/src/context_providers/DarkThemeProvider.tsx b/geneit_app/src/context_providers/DarkThemeProvider.tsx new file mode 100644 index 0000000..b410df5 --- /dev/null +++ b/geneit_app/src/context_providers/DarkThemeProvider.tsx @@ -0,0 +1,50 @@ +import { ThemeProvider, createTheme } from "@mui/material/styles"; +import React from "react"; +import { PropsWithChildren } from "react"; + +const localStorageKey = "dark-theme"; + +const darkTheme = createTheme({ + palette: { + mode: "dark", + }, +}); + +const lightTheme = createTheme({ + palette: { + mode: "light", + }, +}); + +interface DarkThemeContext { + enabled: boolean; + setEnabled: (enabled: boolean) => void; +} + +const DarkThemeContextK = React.createContext(null); + +export function DarkThemeProvider(p: PropsWithChildren): React.ReactElement { + const [enabled, setEnabled] = React.useState( + localStorage.getItem(localStorageKey) === "true" + ); + + return ( + + + {p.children} + + + ); +} + +export function useDarkTheme(): DarkThemeContext { + return React.useContext(DarkThemeContextK)!; +} diff --git a/geneit_app/src/widgets/SnackbarProvider.tsx b/geneit_app/src/context_providers/SnackbarProvider.tsx similarity index 100% rename from geneit_app/src/widgets/SnackbarProvider.tsx rename to geneit_app/src/context_providers/SnackbarProvider.tsx diff --git a/geneit_app/src/dialogs/CreateFamilyDialog.tsx b/geneit_app/src/dialogs/CreateFamilyDialog.tsx index bd6eb44..98c41db 100644 --- a/geneit_app/src/dialogs/CreateFamilyDialog.tsx +++ b/geneit_app/src/dialogs/CreateFamilyDialog.tsx @@ -2,7 +2,7 @@ import React from "react"; import { TextInputDialog } from "./TextInputDialog"; import { ServerApi } from "../api/ServerApi"; import { FamilyApi } from "../api/FamilyApi"; -import { useAlert } from "../widgets/AlertDialogProvider"; +import { useAlert } from "../context_providers/AlertDialogProvider"; export function CreateFamilyDialog(p: { open: boolean; diff --git a/geneit_app/src/dialogs/JoinFamilyDialog.tsx b/geneit_app/src/dialogs/JoinFamilyDialog.tsx index 4f95dff..b61006e 100644 --- a/geneit_app/src/dialogs/JoinFamilyDialog.tsx +++ b/geneit_app/src/dialogs/JoinFamilyDialog.tsx @@ -2,7 +2,7 @@ import React from "react"; import { TextInputDialog } from "./TextInputDialog"; import { ServerApi } from "../api/ServerApi"; import { FamilyApi, JoinFamilyResult } from "../api/FamilyApi"; -import { useAlert } from "../widgets/AlertDialogProvider"; +import { useAlert } from "../context_providers/AlertDialogProvider"; export function JoinFamilyDialog(p: { open: boolean; diff --git a/geneit_app/src/index.tsx b/geneit_app/src/index.tsx index 1b2356e..a6dc414 100644 --- a/geneit_app/src/index.tsx +++ b/geneit_app/src/index.tsx @@ -11,10 +11,11 @@ import "@fontsource/roboto/400.css"; import "@fontsource/roboto/500.css"; import "@fontsource/roboto/700.css"; import { BrowserRouter } from "react-router-dom"; -import { ConfirmDialogProvider } from "./widgets/ConfirmDialogProvider"; -import { AlertDialogProvider } from "./widgets/AlertDialogProvider"; +import { ConfirmDialogProvider } from "./context_providers/ConfirmDialogProvider"; +import { AlertDialogProvider } from "./context_providers/AlertDialogProvider"; import { AsyncWidget } from "./widgets/AsyncWidget"; -import { SnackbarProvider } from "./widgets/SnackbarProvider"; +import { SnackbarProvider } from "./context_providers/SnackbarProvider"; +import { DarkThemeProvider } from "./context_providers/DarkThemeProvider"; async function init() { try { @@ -25,20 +26,22 @@ async function init() { root.render( - - - -
- await ServerApi.LoadConfig()} - errMsg="Echec de la connexion au serveur pour la récupération de la configuration statique !" - build={() => } - /> -
-
-
-
+ + + + +
+ await ServerApi.LoadConfig()} + errMsg="Echec de la connexion au serveur pour la récupération de la configuration statique !" + build={() => } + /> +
+
+
+
+
); diff --git a/geneit_app/src/routes/DeleteAccountRoute.tsx b/geneit_app/src/routes/DeleteAccountRoute.tsx index 8f8fdab..d5293dc 100644 --- a/geneit_app/src/routes/DeleteAccountRoute.tsx +++ b/geneit_app/src/routes/DeleteAccountRoute.tsx @@ -3,9 +3,9 @@ import React from "react"; import { Link, useLocation, useNavigate } from "react-router-dom"; import { AuthApi } from "../api/AuthApi"; import { DeleteAccountTokenInfo, UserApi } from "../api/UserApi"; -import { useAlert } from "../widgets/AlertDialogProvider"; +import { useAlert } from "../context_providers/AlertDialogProvider"; import { AsyncWidget } from "../widgets/AsyncWidget"; -import { useConfirm } from "../widgets/ConfirmDialogProvider"; +import { useConfirm } from "../context_providers/ConfirmDialogProvider"; export function DeleteAccountRoute(): React.ReactElement { const alert = useAlert(); diff --git a/geneit_app/src/routes/FamiliesListRoute.tsx b/geneit_app/src/routes/FamiliesListRoute.tsx index d4e5f98..f775273 100644 --- a/geneit_app/src/routes/FamiliesListRoute.tsx +++ b/geneit_app/src/routes/FamiliesListRoute.tsx @@ -14,9 +14,9 @@ import React from "react"; import { Family, FamilyApi } from "../api/FamilyApi"; import { CreateFamilyDialog } from "../dialogs/CreateFamilyDialog"; import { JoinFamilyDialog } from "../dialogs/JoinFamilyDialog"; -import { useAlert } from "../widgets/AlertDialogProvider"; +import { useAlert } from "../context_providers/AlertDialogProvider"; import { AsyncWidget } from "../widgets/AsyncWidget"; -import { useConfirm } from "../widgets/ConfirmDialogProvider"; +import { useConfirm } from "../context_providers/ConfirmDialogProvider"; import { RouterLink } from "../widgets/RouterLink"; import { TimeWidget } from "../widgets/TimeWidget"; diff --git a/geneit_app/src/routes/ProfileRoute.tsx b/geneit_app/src/routes/ProfileRoute.tsx index 43d368b..b0ea631 100644 --- a/geneit_app/src/routes/ProfileRoute.tsx +++ b/geneit_app/src/routes/ProfileRoute.tsx @@ -13,9 +13,9 @@ import { import React from "react"; import { ServerApi } from "../api/ServerApi"; import { ReplacePasswordResponse, User, UserApi } from "../api/UserApi"; -import { useAlert } from "../widgets/AlertDialogProvider"; +import { useAlert } from "../context_providers/AlertDialogProvider"; import { useUser } from "../widgets/BaseAuthenticatedPage"; -import { useConfirm } from "../widgets/ConfirmDialogProvider"; +import { useConfirm } from "../context_providers/ConfirmDialogProvider"; import { PasswordInput } from "../widgets/PasswordInput"; import { formatDate } from "../widgets/TimeWidget"; diff --git a/geneit_app/src/widgets/BaseAuthenticatedPage.tsx b/geneit_app/src/widgets/BaseAuthenticatedPage.tsx index 84d2a2b..6e5021a 100644 --- a/geneit_app/src/widgets/BaseAuthenticatedPage.tsx +++ b/geneit_app/src/widgets/BaseAuthenticatedPage.tsx @@ -14,6 +14,7 @@ import { AuthApi } from "../api/AuthApi"; import { User, UserApi } from "../api/UserApi"; import { AsyncWidget } from "./AsyncWidget"; import { RouterLink } from "./RouterLink"; +import { DarkThemeButton } from "./DarkThemeButton"; interface UserContext { user: User; @@ -90,6 +91,8 @@ export function BaseAuthenticatedPage(): React.ReactElement {
+ + diff --git a/geneit_app/src/widgets/BaseFamilyRoute.tsx b/geneit_app/src/widgets/BaseFamilyRoute.tsx index 6c096d5..d909a8d 100644 --- a/geneit_app/src/widgets/BaseFamilyRoute.tsx +++ b/geneit_app/src/widgets/BaseFamilyRoute.tsx @@ -27,9 +27,9 @@ import { Outlet, useLocation, useParams } from "react-router-dom"; import { Family, FamilyApi } from "../api/FamilyApi"; import { AsyncWidget } from "./AsyncWidget"; import { RouterLink } from "./RouterLink"; -import { useSnackbar } from "./SnackbarProvider"; -import { useConfirm } from "./ConfirmDialogProvider"; -import { useAlert } from "./AlertDialogProvider"; +import { useSnackbar } from "../context_providers/SnackbarProvider"; +import { useConfirm } from "../context_providers/ConfirmDialogProvider"; +import { useAlert } from "../context_providers/AlertDialogProvider"; interface FamilyContext { family: Family; diff --git a/geneit_app/src/widgets/BaseLoginpage.tsx b/geneit_app/src/widgets/BaseLoginpage.tsx index e32b2ae..f3c6f70 100644 --- a/geneit_app/src/widgets/BaseLoginpage.tsx +++ b/geneit_app/src/widgets/BaseLoginpage.tsx @@ -8,6 +8,7 @@ import Paper from "@mui/material/Paper"; import Typography from "@mui/material/Typography"; import * as React from "react"; import { Link, Outlet } from "react-router-dom"; +import { DarkThemeButton } from "./DarkThemeButton"; function Copyright(props: any) { return ( @@ -64,6 +65,10 @@ export function BaseLoginPage() { alignItems: "center", }} > +
+ +
+ diff --git a/geneit_app/src/widgets/DarkThemeButton.tsx b/geneit_app/src/widgets/DarkThemeButton.tsx new file mode 100644 index 0000000..c9572c4 --- /dev/null +++ b/geneit_app/src/widgets/DarkThemeButton.tsx @@ -0,0 +1,19 @@ +import Brightness7Icon from "@mui/icons-material/Brightness7"; +import DarkModeIcon from "@mui/icons-material/DarkMode"; +import { IconButton, Tooltip } from "@mui/material"; +import { useDarkTheme } from "../context_providers/DarkThemeProvider"; + +export function DarkThemeButton(): React.ReactElement { + const darkTheme = useDarkTheme(); + + return ( + + darkTheme.setEnabled(!darkTheme.enabled)} + style={{ color: "inherit" }} + > + {!darkTheme.enabled ? : } + + + ); +}