From 347f3ce39e0798c8cee97ab88e71f9fd3b1937ed Mon Sep 17 00:00:00 2001 From: Anton Harniakou Date: Tue, 12 Feb 2019 10:23:30 +0300 Subject: [PATCH] Save theme settings to localStorage --- ui/src/layout/Layout.tsx | 50 ++++++++++++++++++++++++++++------------ 1 file changed, 35 insertions(+), 15 deletions(-) diff --git a/ui/src/layout/Layout.tsx b/ui/src/layout/Layout.tsx index cc6cbf8..b26c29b 100644 --- a/ui/src/layout/Layout.tsx +++ b/ui/src/layout/Layout.tsx @@ -21,17 +21,6 @@ import {observer} from 'mobx-react'; import {observable} from 'mobx'; import {inject, Stores} from '../inject'; -const lightTheme = createMuiTheme({ - palette: { - type: 'light', - }, -}); -const darkTheme = createMuiTheme({ - palette: { - type: 'dark', - }, -}); - const styles = (theme: Theme) => ({ content: { margin: '0 auto', @@ -41,12 +30,31 @@ const styles = (theme: Theme) => ({ }, }); +const localStorageThemeKey = 'gotify-theme'; +type ThemeKey = 'dark' | 'light'; +const themeMap: Record = { + light: createMuiTheme({ + palette: { + type: 'light', + }, + }), + dark: createMuiTheme({ + palette: { + type: 'dark', + }, + }), +}; + +const isThemeKey = (value: string | null): value is ThemeKey => { + return value === 'light' || value === 'dark'; +}; + @observer class Layout extends React.Component & Stores<'currentUser'>> { private static defaultVersion = '0.0.0'; @observable - private darkThemeVisible = true; + private currentTheme: ThemeKey = 'dark'; @observable private showSettings = false; @observable @@ -58,10 +66,17 @@ class Layout extends React.Component & Stores<'currentUser this.version = resp.data.version; }); } + + const localStorageTheme = window.localStorage.getItem(localStorageThemeKey); + if (isThemeKey(localStorageTheme)) { + this.currentTheme = localStorageTheme; + } else { + window.localStorage.setItem(localStorageThemeKey, this.currentTheme); + } } public render() { - const {version, showSettings, darkThemeVisible} = this; + const {version, showSettings, currentTheme} = this; const { classes, currentUser: { @@ -71,7 +86,7 @@ class Layout extends React.Component & Stores<'currentUser logout, }, } = this.props; - const theme = darkThemeVisible ? darkTheme : lightTheme; + const theme = themeMap[currentTheme]; const loginRoute = () => (loggedIn ? : ); return ( @@ -83,7 +98,7 @@ class Layout extends React.Component & Stores<'currentUser name={name} version={version} loggedIn={loggedIn} - toggleTheme={() => (this.darkThemeVisible = !this.darkThemeVisible)} + toggleTheme={this.toggleTheme.bind(this)} showSettings={() => (this.showSettings = true)} logout={logout} /> @@ -117,6 +132,11 @@ class Layout extends React.Component & Stores<'currentUser ); } + + private toggleTheme() { + this.currentTheme = this.currentTheme === 'dark' ? 'light' : 'dark'; + localStorage.setItem(localStorageThemeKey, this.currentTheme); + } } export default withStyles(styles, {withTheme: true})<{}>(inject('currentUser')(Layout));