diff --git a/shared/components/Provider.tsx b/shared/components/Provider.tsx
index 3c790431..bd23dbe2 100644
--- a/shared/components/Provider.tsx
+++ b/shared/components/Provider.tsx
@@ -1,7 +1,12 @@
import React from 'react';
import { CacheProvider } from '../cache/Provider';
+import { DarkModeContextProvider } from '../contexts/DarkModeContext';
export const TcProvider: React.FC = React.memo((props) => {
- return {props.children};
+ return (
+
+ {props.children}
+
+ );
});
TcProvider.displayName = 'TcProvider';
diff --git a/shared/contexts/DarkModeContext.tsx b/shared/contexts/DarkModeContext.tsx
new file mode 100644
index 00000000..79ab113d
--- /dev/null
+++ b/shared/contexts/DarkModeContext.tsx
@@ -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 (
+
+ {props.children}
+
+ );
+});
+DarkModeContextProvider.displayName = 'DarkModeContextProvider';
+
+export function useDarkMode() {
+ return useContext(DarkModeContext);
+}
diff --git a/shared/index.tsx b/shared/index.tsx
index 6011f0ba..655dfdec 100644
--- a/shared/index.tsx
+++ b/shared/index.tsx
@@ -33,6 +33,9 @@ export {
export { buildPortal, DefaultEventEmitter } from './components/Portal';
export { TcProvider } from './components/Provider';
+// contexts
+export { useDarkMode } from './contexts/DarkModeContext';
+
// i18n
export { t, setLanguage, useTranslation } from './i18n';
export { Trans } from './i18n/Trans';
diff --git a/web/src/App.tsx b/web/src/App.tsx
index 043b668c..21fa5822 100644
--- a/web/src/App.tsx
+++ b/web/src/App.tsx
@@ -1,6 +1,6 @@
import React, { useCallback } from 'react';
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 { Loadable } from './components/Loadable';
import { ConfigProvider as AntdProvider } from 'antd';
@@ -43,8 +43,8 @@ const AppProvider: React.FC = React.memo((props) => {
});
AppProvider.displayName = 'AppProvider';
-export const App: React.FC = React.memo(() => {
- const [darkMode] = useStorage('darkMode', true);
+export const AppContainer: React.FC = React.memo((props) => {
+ const { darkMode } = useDarkMode();
return (
{
dark: darkMode,
})}
>
-
+ {props.children}
+
+ );
+});
+AppContainer.displayName = 'AppContainer';
+
+export const App: React.FC = React.memo(() => {
+ return (
+
+
-
-
+
+
);
});
App.displayName = 'App';