diff options
| author | Haishan <[email protected]> | 2022-03-06 16:46:05 +0800 |
|---|---|---|
| committer | Haishan <[email protected]> | 2022-03-06 17:17:14 +0800 |
| commit | d87cc00fc83bb2bc5c1ffa69b4dad71d51e1cc66 (patch) | |
| tree | 9eae0c4359bbdced9afef25f67de799dcb50ac92 /src/components/shared/ThemeSwitcher.tsx | |
| parent | 06428daa53029dca82d63cbf3364b3f74fce67d5 (diff) | |
Make theme switch a native select/option menu
Diffstat (limited to 'src/components/shared/ThemeSwitcher.tsx')
| -rw-r--r-- | src/components/shared/ThemeSwitcher.tsx | 49 |
1 files changed, 20 insertions, 29 deletions
diff --git a/src/components/shared/ThemeSwitcher.tsx b/src/components/shared/ThemeSwitcher.tsx index 90990b6..45b60bc 100644 --- a/src/components/shared/ThemeSwitcher.tsx +++ b/src/components/shared/ThemeSwitcher.tsx @@ -1,5 +1,4 @@ import Tooltip from '@reach/tooltip'; -import cx from 'clsx'; import * as React from 'react'; import { useTranslation } from 'react-i18next'; import { connect } from 'src/components/StateProvider'; @@ -7,36 +6,18 @@ import { framerMotionResouce } from 'src/misc/motion'; import { getTheme, switchTheme } from 'src/store/app'; import { State } from 'src/store/types'; -import s from './ThemeSwitcher.module.css'; +import s from './ThemeSwitcher.module.scss'; export function ThemeSwitcherImpl({ theme, dispatch }) { const { t } = useTranslation(); - const switchThemeHooked = React.useCallback(() => { - dispatch(switchTheme()); - }, [dispatch]); - - const nextThemeName = React.useMemo(() => { - switch (theme) { - case 'light': - return 'dark'; - case 'dark': - return 'auto'; - case 'auto': - return 'light'; - default: - console.assert(false, 'Unknown theme'); - return 'unknown'; - } - }, [theme]); - const themeIcon = React.useMemo(() => { switch (theme) { - case 'light': - return <MoonA />; case 'dark': - return <Auto />; + return <MoonA />; case 'auto': + return <Auto />; + case 'light': return <Sun />; default: console.assert(false, 'Unknown theme'); @@ -44,11 +25,21 @@ export function ThemeSwitcherImpl({ theme, dispatch }) { } }, [theme]); + const onChange = React.useCallback( + (e: React.ChangeEvent<HTMLSelectElement>) => dispatch(switchTheme(e.target.value)), + [dispatch] + ); + return ( - <Tooltip label={t('theme')} aria-label={'switch to ' + nextThemeName + ' theme'}> - <button className={cx(s.iconWrapper, s.themeSwitchContainer)} onClick={switchThemeHooked}> - {themeIcon} - </button> + <Tooltip label={t('switch_theme')} aria-label={'switch theme'}> + <div className={s.themeSwitchContainer}> + <span className={s.iconWrapper}>{themeIcon}</span> + <select onChange={onChange}> + <option value="auto">Auto</option> + <option value="dark">Dark</option> + <option value="light">Light</option> + </select> + </div> </Tooltip> ); } @@ -95,7 +86,7 @@ function Sun() { strokeLinejoin="round" > <circle cx="12" cy="12" r="5"></circle> - <motion.g initial={{ scale: 0.8 }} animate={{ scale: 1 }} transition={{ duration: 0.7 }}> + <motion.g initial={{ scale: 0.7 }} animate={{ scale: 1 }} transition={{ duration: 0.5 }}> <line x1="12" y1="1" x2="12" y2="3"></line> <line x1="12" y1="21" x2="12" y2="23"></line> <line x1="4.22" y1="4.22" x2="5.64" y2="5.64"></line> @@ -137,7 +128,7 @@ function Auto() { transition={{ duration: 0.7 }} /> </clipPath> - <circle cx="12" cy="12" r="6" clip-path="url(#cut-off-bottom)" fill="currentColor" /> + <circle cx="12" cy="12" r="6" clipPath="url(#cut-off-bottom)" fill="currentColor" /> </svg> ); } |
