mirror of
https://github.com/linux-do/new-api.git
synced 2025-09-18 16:36:37 +08:00
refactor: dark mode
This commit is contained in:
parent
300947f400
commit
e9abe5b705
@ -1,6 +1,7 @@
|
|||||||
import React, { useContext, useEffect, useState } from 'react';
|
import React, { useContext, useEffect, useState } from 'react';
|
||||||
import { Link, useNavigate } from 'react-router-dom';
|
import { Link, useNavigate } from 'react-router-dom';
|
||||||
import { UserContext } from '../context/User';
|
import { UserContext } from '../context/User';
|
||||||
|
import { useSetTheme, useTheme } from '../context/Theme';
|
||||||
|
|
||||||
import { API, getLogo, getSystemName, showSuccess } from '../helpers';
|
import { API, getLogo, getSystemName, showSuccess } from '../helpers';
|
||||||
import '../index.css';
|
import '../index.css';
|
||||||
@ -34,10 +35,8 @@ const HeaderBar = () => {
|
|||||||
let navigate = useNavigate();
|
let navigate = useNavigate();
|
||||||
|
|
||||||
const [showSidebar, setShowSidebar] = useState(false);
|
const [showSidebar, setShowSidebar] = useState(false);
|
||||||
const [dark, setDark] = useState(false);
|
|
||||||
const systemName = getSystemName();
|
const systemName = getSystemName();
|
||||||
const logo = getLogo();
|
const logo = getLogo();
|
||||||
var themeMode = localStorage.getItem('theme-mode');
|
|
||||||
const currentDate = new Date();
|
const currentDate = new Date();
|
||||||
// enable fireworks on new year(1.1 and 2.9-2.24)
|
// enable fireworks on new year(1.1 and 2.9-2.24)
|
||||||
const isNewYear =
|
const isNewYear =
|
||||||
@ -66,26 +65,19 @@ const HeaderBar = () => {
|
|||||||
}, 3000);
|
}, 3000);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const theme = useTheme();
|
||||||
|
const setTheme = useSetTheme();
|
||||||
|
|
||||||
useEffect(() => {
|
useEffect(() => {
|
||||||
if (themeMode === 'dark') {
|
if (theme === 'dark') {
|
||||||
switchMode(true);
|
document.body.setAttribute('theme-mode', 'dark');
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isNewYear) {
|
if (isNewYear) {
|
||||||
console.log('Happy New Year!');
|
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 (
|
return (
|
||||||
<>
|
<>
|
||||||
<Layout>
|
<Layout>
|
||||||
@ -132,9 +124,11 @@ const HeaderBar = () => {
|
|||||||
<Switch
|
<Switch
|
||||||
checkedText='🌞'
|
checkedText='🌞'
|
||||||
size={'large'}
|
size={'large'}
|
||||||
checked={dark}
|
checked={theme === 'dark'}
|
||||||
uncheckedText='🌙'
|
uncheckedText='🌙'
|
||||||
onChange={switchMode}
|
onChange={(checked) => {
|
||||||
|
setTheme(checked);
|
||||||
|
}}
|
||||||
/>
|
/>
|
||||||
{userState.user ? (
|
{userState.user ? (
|
||||||
<>
|
<>
|
||||||
|
36
web/src/context/Theme/index.js
Normal file
36
web/src/context/Theme/index.js
Normal file
@ -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 (
|
||||||
|
<SetThemeContext.Provider value={setTheme}>
|
||||||
|
<ThemeContext.Provider value={theme}>{children}</ThemeContext.Provider>
|
||||||
|
</SetThemeContext.Provider>
|
||||||
|
);
|
||||||
|
};
|
@ -12,6 +12,7 @@ import 'react-toastify/dist/ReactToastify.css';
|
|||||||
import { StatusProvider } from './context/Status';
|
import { StatusProvider } from './context/Status';
|
||||||
import { Layout } from '@douyinfe/semi-ui';
|
import { Layout } from '@douyinfe/semi-ui';
|
||||||
import SiderBar from './components/SiderBar';
|
import SiderBar from './components/SiderBar';
|
||||||
|
import { ThemeProvider } from './context/Theme';
|
||||||
|
|
||||||
// initialization
|
// initialization
|
||||||
|
|
||||||
@ -22,27 +23,29 @@ root.render(
|
|||||||
<StatusProvider>
|
<StatusProvider>
|
||||||
<UserProvider>
|
<UserProvider>
|
||||||
<BrowserRouter>
|
<BrowserRouter>
|
||||||
<Layout>
|
<ThemeProvider>
|
||||||
<Sider>
|
|
||||||
<SiderBar />
|
|
||||||
</Sider>
|
|
||||||
<Layout>
|
<Layout>
|
||||||
<Header>
|
<Sider>
|
||||||
<HeaderBar />
|
<SiderBar />
|
||||||
</Header>
|
</Sider>
|
||||||
<Content
|
<Layout>
|
||||||
style={{
|
<Header>
|
||||||
padding: '24px',
|
<HeaderBar />
|
||||||
}}
|
</Header>
|
||||||
>
|
<Content
|
||||||
<App />
|
style={{
|
||||||
</Content>
|
padding: '24px',
|
||||||
<Layout.Footer>
|
}}
|
||||||
<Footer></Footer>
|
>
|
||||||
</Layout.Footer>
|
<App />
|
||||||
|
</Content>
|
||||||
|
<Layout.Footer>
|
||||||
|
<Footer></Footer>
|
||||||
|
</Layout.Footer>
|
||||||
|
</Layout>
|
||||||
|
<ToastContainer />
|
||||||
</Layout>
|
</Layout>
|
||||||
<ToastContainer />
|
</ThemeProvider>
|
||||||
</Layout>
|
|
||||||
</BrowserRouter>
|
</BrowserRouter>
|
||||||
</UserProvider>
|
</UserProvider>
|
||||||
</StatusProvider>
|
</StatusProvider>
|
||||||
|
Loading…
Reference in New Issue
Block a user