2019-10-28 16:16:49 +00:00
|
|
|
import { MuiThemeProvider } from "@material-ui/core/styles";
|
2020-07-22 10:54:15 +00:00
|
|
|
import {
|
|
|
|
ExtensionMessageType,
|
|
|
|
sendMessageToExtension,
|
|
|
|
ThemeChangeMessage
|
|
|
|
} from "@saleor/macaw-ui/extensions";
|
|
|
|
import React, { useEffect } from "react";
|
2019-11-12 16:07:29 +00:00
|
|
|
import Helmet from "react-helmet";
|
2019-06-19 14:40:52 +00:00
|
|
|
|
|
|
|
import Baseline from "../../Baseline";
|
2019-11-04 13:36:25 +00:00
|
|
|
import createTheme from "../../theme";
|
|
|
|
import { dark, light } from "./themes";
|
2019-06-19 14:40:52 +00:00
|
|
|
|
|
|
|
interface IThemeContext {
|
|
|
|
isDark: boolean;
|
2020-07-22 10:54:15 +00:00
|
|
|
sendThemeToExtension: () => void;
|
2019-06-19 14:40:52 +00:00
|
|
|
toggleTheme: () => void;
|
|
|
|
}
|
|
|
|
export const ThemeContext = React.createContext<IThemeContext>({
|
|
|
|
isDark: false,
|
2020-07-22 10:54:15 +00:00
|
|
|
sendThemeToExtension: () => undefined,
|
2019-06-19 14:40:52 +00:00
|
|
|
toggleTheme: () => undefined
|
|
|
|
});
|
|
|
|
|
|
|
|
interface ThemeProviderProps {
|
|
|
|
isDefaultDark?: boolean;
|
|
|
|
}
|
|
|
|
const ThemeProvider: React.FC<ThemeProviderProps> = ({
|
|
|
|
children,
|
|
|
|
isDefaultDark
|
|
|
|
}) => {
|
|
|
|
const [isDark, setDark] = React.useState(isDefaultDark);
|
2020-07-22 10:54:15 +00:00
|
|
|
const sendThemeToExtension = () =>
|
|
|
|
sendMessageToExtension<ThemeChangeMessage>(
|
|
|
|
{
|
|
|
|
theme: isDark ? "dark" : "light",
|
|
|
|
type: ExtensionMessageType.THEME
|
|
|
|
},
|
|
|
|
"*"
|
|
|
|
);
|
|
|
|
|
2019-06-19 14:40:52 +00:00
|
|
|
const toggleTheme = () => {
|
|
|
|
setDark(!isDark);
|
|
|
|
localStorage.setItem("theme", (!isDark).toString());
|
|
|
|
};
|
|
|
|
|
2020-07-22 10:54:15 +00:00
|
|
|
useEffect(() => {
|
|
|
|
sendThemeToExtension();
|
|
|
|
}, [isDark]);
|
|
|
|
|
2019-11-12 16:07:29 +00:00
|
|
|
const theme = createTheme(isDark ? dark : light);
|
|
|
|
|
2019-06-19 14:40:52 +00:00
|
|
|
return (
|
|
|
|
<ThemeContext.Provider
|
|
|
|
value={{
|
|
|
|
isDark,
|
2020-07-22 10:54:15 +00:00
|
|
|
sendThemeToExtension,
|
2019-06-19 14:40:52 +00:00
|
|
|
toggleTheme
|
|
|
|
}}
|
|
|
|
>
|
2019-11-12 16:07:29 +00:00
|
|
|
<Helmet>
|
|
|
|
<meta name="theme-color" content={theme.palette.background.default} />
|
|
|
|
</Helmet>
|
|
|
|
<MuiThemeProvider theme={theme}>
|
2019-10-28 16:16:49 +00:00
|
|
|
<Baseline />
|
|
|
|
{children}
|
|
|
|
</MuiThemeProvider>
|
2019-06-19 14:40:52 +00:00
|
|
|
</ThemeContext.Provider>
|
|
|
|
);
|
|
|
|
};
|
|
|
|
ThemeProvider.defaultProps = {
|
|
|
|
isDefaultDark: false
|
|
|
|
};
|
|
|
|
export default ThemeProvider;
|