diff --git a/web/src/components/HeaderBar.js b/web/src/components/HeaderBar.js index a5da4df..5510d42 100644 --- a/web/src/components/HeaderBar.js +++ b/web/src/components/HeaderBar.js @@ -1,6 +1,7 @@ import React, { useContext, useEffect, useState } from 'react'; import { Link, useNavigate } from 'react-router-dom'; import { UserContext } from '../context/User'; +import { useSetTheme, useTheme } from '../context/Theme'; import { API, getLogo, getSystemName, showSuccess } from '../helpers'; import '../index.css'; @@ -34,10 +35,8 @@ const HeaderBar = () => { let navigate = useNavigate(); const [showSidebar, setShowSidebar] = useState(false); - const [dark, setDark] = useState(false); const systemName = getSystemName(); const logo = getLogo(); - var themeMode = localStorage.getItem('theme-mode'); const currentDate = new Date(); // enable fireworks on new year(1.1 and 2.9-2.24) const isNewYear = @@ -66,26 +65,19 @@ const HeaderBar = () => { }, 3000); }; + const theme = useTheme(); + const setTheme = useSetTheme(); + useEffect(() => { - if (themeMode === 'dark') { - switchMode(true); + if (theme === 'dark') { + document.body.setAttribute('theme-mode', 'dark'); } + if (isNewYear) { console.log('Happy New Year!'); } }, []); - const switchMode = (model) => { - const body = document.body; - if (!model) { - body.removeAttribute('theme-mode'); - localStorage.setItem('theme-mode', 'light'); - } else { - body.setAttribute('theme-mode', 'dark'); - localStorage.setItem('theme-mode', 'dark'); - } - setDark(model); - }; return ( <> @@ -132,9 +124,11 @@ const HeaderBar = () => { { + setTheme(checked); + }} /> {userState.user ? ( <> diff --git a/web/src/context/Theme/index.js b/web/src/context/Theme/index.js new file mode 100644 index 0000000..7654988 --- /dev/null +++ b/web/src/context/Theme/index.js @@ -0,0 +1,36 @@ +import { createContext, useCallback, useContext, useState } from 'react'; + +const ThemeContext = createContext(null); +export const useTheme = () => useContext(ThemeContext); + +const SetThemeContext = createContext(null); +export const useSetTheme = () => useContext(SetThemeContext); + +export const ThemeProvider = ({ children }) => { + const [theme, _setTheme] = useState(() => { + try { + return localStorage.getItem('theme-mode') || null; + } catch { + return null; + } + }); + + const setTheme = useCallback((input) => { + _setTheme(input ? 'dark' : 'light'); + + const body = document.body; + if (!input) { + body.removeAttribute('theme-mode'); + localStorage.setItem('theme-mode', 'light'); + } else { + body.setAttribute('theme-mode', 'dark'); + localStorage.setItem('theme-mode', 'dark'); + } + }, []); + + return ( + + {children} + + ); +}; diff --git a/web/src/index.js b/web/src/index.js index c73daef..94b2286 100644 --- a/web/src/index.js +++ b/web/src/index.js @@ -12,6 +12,7 @@ import 'react-toastify/dist/ReactToastify.css'; import { StatusProvider } from './context/Status'; import { Layout } from '@douyinfe/semi-ui'; import SiderBar from './components/SiderBar'; +import { ThemeProvider } from './context/Theme'; // initialization @@ -22,27 +23,29 @@ root.render( - - - - + -
- -
- - - - -
-
+ + + + +
+ +
+ + + + +
+
+
+
- -
+