refactor: 修改暗黑模式的实现, 使其能在内部进行变更后立即响应

pull/13/head
moonrailgun 4 years ago
parent 546a3e6469
commit f76ace6069

@ -1,7 +1,12 @@
import React from 'react'; import React from 'react';
import { CacheProvider } from '../cache/Provider'; import { CacheProvider } from '../cache/Provider';
import { DarkModeContextProvider } from '../contexts/DarkModeContext';
export const TcProvider: React.FC = React.memo((props) => { export const TcProvider: React.FC = React.memo((props) => {
return <CacheProvider>{props.children}</CacheProvider>; return (
<CacheProvider>
<DarkModeContextProvider>{props.children}</DarkModeContextProvider>
</CacheProvider>
);
}); });
TcProvider.displayName = 'TcProvider'; TcProvider.displayName = 'TcProvider';

@ -0,0 +1,26 @@
import React, { useContext } from 'react';
import { useStorage } from 'tailchat-shared';
const DarkModeContext = React.createContext<{
darkMode: boolean;
setDarkMode: (isDarkMode: boolean) => void;
}>({
darkMode: true,
setDarkMode: () => {},
});
DarkModeContext.displayName = 'DarkModeContext';
export const DarkModeContextProvider: React.FC = React.memo((props) => {
const [darkMode = true, { save: setDarkMode }] = useStorage('darkMode', true);
return (
<DarkModeContext.Provider value={{ darkMode, setDarkMode }}>
{props.children}
</DarkModeContext.Provider>
);
});
DarkModeContextProvider.displayName = 'DarkModeContextProvider';
export function useDarkMode() {
return useContext(DarkModeContext);
}

@ -33,6 +33,9 @@ export {
export { buildPortal, DefaultEventEmitter } from './components/Portal'; export { buildPortal, DefaultEventEmitter } from './components/Portal';
export { TcProvider } from './components/Provider'; export { TcProvider } from './components/Provider';
// contexts
export { useDarkMode } from './contexts/DarkModeContext';
// i18n // i18n
export { t, setLanguage, useTranslation } from './i18n'; export { t, setLanguage, useTranslation } from './i18n';
export { Trans } from './i18n/Trans'; export { Trans } from './i18n/Trans';

@ -1,6 +1,6 @@
import React, { useCallback } from 'react'; import React, { useCallback } from 'react';
import { BrowserRouter, Redirect, Route, Switch } from 'react-router-dom'; import { BrowserRouter, Redirect, Route, Switch } from 'react-router-dom';
import { TcProvider, useStorage } from 'tailchat-shared'; import { TcProvider, useDarkMode, useStorage } from 'tailchat-shared';
import clsx from 'clsx'; import clsx from 'clsx';
import { Loadable } from './components/Loadable'; import { Loadable } from './components/Loadable';
import { ConfigProvider as AntdProvider } from 'antd'; import { ConfigProvider as AntdProvider } from 'antd';
@ -43,8 +43,8 @@ const AppProvider: React.FC = React.memo((props) => {
}); });
AppProvider.displayName = 'AppProvider'; AppProvider.displayName = 'AppProvider';
export const App: React.FC = React.memo(() => { export const AppContainer: React.FC = React.memo((props) => {
const [darkMode] = useStorage('darkMode', true); const { darkMode } = useDarkMode();
return ( return (
<div <div
@ -53,15 +53,24 @@ export const App: React.FC = React.memo(() => {
dark: darkMode, dark: darkMode,
})} })}
> >
<AppProvider> {props.children}
</div>
);
});
AppContainer.displayName = 'AppContainer';
export const App: React.FC = React.memo(() => {
return (
<AppProvider>
<AppContainer>
<Switch> <Switch>
<Route path="/entry" component={EntryRoute} /> <Route path="/entry" component={EntryRoute} />
<Route path="/main" component={MainRoute} /> <Route path="/main" component={MainRoute} />
<Route path="/invite/:inviteCode" component={InviteRoute} /> <Route path="/invite/:inviteCode" component={InviteRoute} />
<Redirect to="/entry" /> <Redirect to="/entry" />
</Switch> </Switch>
</AppProvider> </AppContainer>
</div> </AppProvider>
); );
}); });
App.displayName = 'App'; App.displayName = 'App';

Loading…
Cancel
Save