diff --git a/packages/frontend/src/Routes.tsx b/packages/frontend/src/Routes.tsx index 9db8da7..f7dd35c 100644 --- a/packages/frontend/src/Routes.tsx +++ b/packages/frontend/src/Routes.tsx @@ -7,20 +7,29 @@ import ShowNote from "./content/ShowNote"; import NotFound from "./content/NotFound"; import { BASE_URL } from "./config"; +import { useThemeContext } from "./hooks/useThemeContext"; -const Routes = () => ( -
- Loading...
}> - - - } /> - } /> - } /> - } /> - - - - -); +const Routes = () => { + const { darkMode } = useThemeContext(); + + return ( +
+
+
+ Loading...
}> + + + } /> + } /> + } /> + } /> + + + +
+
+ + ); +} export { Routes }; diff --git a/packages/frontend/src/components/PageContainer.tsx b/packages/frontend/src/components/PageContainer.tsx index 108f5e4..ba9d5ce 100644 --- a/packages/frontend/src/components/PageContainer.tsx +++ b/packages/frontend/src/components/PageContainer.tsx @@ -1,14 +1,20 @@ import React from "react"; import { Card } from "react-bootstrap"; +import { ThemeSwitch } from "../content/ThemeSwitch"; const PageContainer = (props: { header: React.ReactNode; children: React.ReactNode; -}) => ( - - {props.header} - {props.children} - -); +}) => { + return ( + <> + + {props.header} + {props.children} + + + + ) +}; export { PageContainer }; diff --git a/packages/frontend/src/content/ThemeSwitch.tsx b/packages/frontend/src/content/ThemeSwitch.tsx new file mode 100644 index 0000000..ce15220 --- /dev/null +++ b/packages/frontend/src/content/ThemeSwitch.tsx @@ -0,0 +1,25 @@ +import React, { useState } from "react"; +import { useThemeContext } from "../hooks/useThemeContext"; +import { Form } from "react-bootstrap"; + + +export const ThemeSwitch = () => { + const { darkMode, setDarkMode } = useThemeContext(); + + const toggleTheme = () => { + setDarkMode(!darkMode); + }; + + return ( +
+ + + ); +} \ No newline at end of file diff --git a/packages/frontend/src/hooks/usePersistedState.ts b/packages/frontend/src/hooks/usePersistedState.ts new file mode 100644 index 0000000..d5598d6 --- /dev/null +++ b/packages/frontend/src/hooks/usePersistedState.ts @@ -0,0 +1,14 @@ +import { useEffect, useState } from "react"; + +// to store the state to local storage +export default function usePersistedState(key: string, defaultValue: any) { + const [state, setState] = useState(() => { + return JSON.parse(localStorage.getItem(key) ?? '{}') || defaultValue; + }); + + useEffect(() => { + localStorage.setItem(key, JSON.stringify(state)); + }, [key, state]); + + return [state, setState]; +} diff --git a/packages/frontend/src/hooks/useThemeContext.tsx b/packages/frontend/src/hooks/useThemeContext.tsx new file mode 100644 index 0000000..8780730 --- /dev/null +++ b/packages/frontend/src/hooks/useThemeContext.tsx @@ -0,0 +1,32 @@ +import React from "react"; +import { createContext, useContext, ReactElement } from "react"; +import usePersistedState from "./usePersistedState"; + +type ThemeContextValue = { + darkMode: boolean; + setDarkMode: React.Dispatch>; +}; + +// register the context +const ThemeContext = createContext(undefined as any); + +type Props = { + children: React.ReactNode; +}; + +export const ThemeProvider = ({ children }: Props): ReactElement => { + /** usePersistedState for storing state in local store */ + const [darkMode, setDarkMode] = usePersistedState("darkmode", false); + + return ( + + {children} + + ); +} + +// export a custom hook to use this specific context +export const useThemeContext = (): ThemeContextValue => { + return useContext(ThemeContext); +} + diff --git a/packages/frontend/src/index.tsx b/packages/frontend/src/index.tsx index b3a7bef..4035c74 100644 --- a/packages/frontend/src/index.tsx +++ b/packages/frontend/src/index.tsx @@ -1,8 +1,9 @@ import { Buffer } from "buffer"; import process from "process"; import React from "react"; -import { createRoot } from "react-dom/client"; +import ReactDOM from "react-dom"; import { Routes } from "./Routes"; +import { ThemeProvider } from "./hooks/useThemeContext"; // Polyfills required for MicrophoneStream if (typeof (window as any).global === "undefined") { @@ -15,11 +16,10 @@ if (typeof (window as any).process === "undefined") { (window as any).process = process; } -const container = document.getElementById("root"); -// @ts-ignore -const root = createRoot(container); -root.render( -
- -
+ +ReactDOM.render( + + + , + document.getElementById("root") );