From 9327345af007a352d1356535e5c6accb8aae1a9d Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?C=C3=A9dric=20FAMIBELLE-PRONZOLA?= Date: Fri, 21 Jan 2022 07:54:50 +0400 Subject: [PATCH] Update theme, dark mode and switch theme --- components/switch-theme.js | 34 +++++++++++--------- pages/_app.js | 66 ++++++++++++++++++++++++++------------ 2 files changed, 64 insertions(+), 36 deletions(-) diff --git a/components/switch-theme.js b/components/switch-theme.js index 99a3d51..c8a8b4c 100644 --- a/components/switch-theme.js +++ b/components/switch-theme.js @@ -1,7 +1,7 @@ import PropTypes from 'prop-types' import {styled} from '@mui/material/styles' -import WbSunnyIcon from '@mui/icons-material/WbSunny' -import Brightness3Icon from '@mui/icons-material/Brightness3' +import LightModeIcon from '@mui/icons-material/LightMode' +import DarkModeIcon from '@mui/icons-material/DarkMode' import {Box} from '@mui/material' const PREFIX = 'switch-theme' @@ -15,38 +15,40 @@ const StyledBox = styled(Box)({ [`& .${classes.switch}`]: { position: 'absolute', right: '1em', - top: '200px', + top: '100px', zIndex: 1, cursor: 'pointer' }, [`& .${classes.switchFixed}`]: { position: 'fixed', right: '1em', - top: '95px', + top: '90px', zIndex: 9990, cursor: 'pointer' } }) -export default function SwitchTheme({switchFixed, darkMode, setDarkMode}) { - const handleClick = () => { - localStorage.setItem('oki-dark', !darkMode) - setDarkMode(!darkMode) +export default function SwitchTheme({switchFixed, mode, setMode}) { + const handleClick = seletedMode => { + localStorage.setItem('oki-theme', seletedMode) + setMode(seletedMode) } return ( - - {darkMode ? ( - - ) : ( - - )} + +
+ {mode === 'dark' ? ( + handleClick('light')} /> + ) : ( + handleClick('dark')} /> + )} +
) } SwitchTheme.propTypes = { switchFixed: PropTypes.bool.isRequired, - darkMode: PropTypes.bool.isRequired, - setDarkMode: PropTypes.func.isRequired + mode: PropTypes.oneOf(['light', 'dark']), + setMode: PropTypes.func.isRequired } diff --git a/pages/_app.js b/pages/_app.js index dc751a0..befe7e0 100644 --- a/pages/_app.js +++ b/pages/_app.js @@ -1,28 +1,49 @@ import {useEffect, useMemo, useState} from 'react' import {useRouter} from 'next/router' import PropTypes from 'prop-types' -import {createTheme, ThemeProvider, StyledEngineProvider, adaptV4Theme} from '@mui/material/styles' +import {createTheme, ThemeProvider, StyledEngineProvider} from '@mui/material/styles' import CssBaseline from '@mui/material/CssBaseline' import {Provider, useSession} from 'next-auth/client' +import {grey, green, red} from '@mui/material/colors' import SwitchTheme from '../components/switch-theme' +const getDesignTokens = mode => ({ + palette: { + mode, + ...(mode === 'light' + ? { + // Palette values for light mode + primary: green, + secondary: red, + divider: green[200], + text: { + primary: grey[900], + secondary: grey[800], + }, + } + : { + // Palette values for dark mode + primary: green, + secondary: red, + divider: green[700], + background: { + default: '#082211', + paper: '#082211', + }, + text: { + primary: '#fff', + secondary: grey[100], + }, + }), + }, +}) + export default function MyApp(props) { const {Component, pageProps} = props - const [darkMode, setDarkMode] = useState(false) + const [mode, setMode] = useState('light') const [switchFixed, setSwitchFixed] = useState(false) - - const darkTheme = useMemo(() => createTheme(adaptV4Theme({ - palette: { - mode: darkMode ? 'dark' : 'light', - primary: { - light: '#81c784', - main: '#4caf50', - dark: '#388e3c', - contrastText: '#fff' - } - } - })), [darkMode]) + const theme = useMemo(() => createTheme(getDesignTokens(mode)), [mode]) useEffect(() => { const jssStyles = document.querySelector('#jss-server-side') @@ -40,20 +61,25 @@ export default function MyApp(props) { }, [props]) useEffect(() => { - const dark = localStorage.getItem('oki-dark') - if (dark === 'false') { - setDarkMode(false) + const oldLocalMode = localStorage.getItem('oki-dark') + const localMode = localStorage.getItem('oki-theme') + if (localMode === 'dark' || (oldLocalMode && oldLocalMode === 'true')) { + setMode('dark') } else { - setDarkMode(true) + setMode('light') + } + + if (localMode && oldLocalMode) { + localStorage.removeItem('oki-dark') } }, []) return ( - + - + {Component.auth ? ( ) : (