diff options
| author | Armand Philippot <git@armandphilippot.com> | 2022-01-17 22:26:16 +0100 |
|---|---|---|
| committer | Armand Philippot <git@armandphilippot.com> | 2022-01-17 22:54:17 +0100 |
| commit | a6233863da4203bec781e817963ac3733279cab5 (patch) | |
| tree | b075753c4336b737d41c178451551c40c1016951 /src/components/Settings/ThemeToggle | |
| parent | 68138f0dcd8b3db2c23b31a20508726f245b5ba5 (diff) | |
refactor(settings): make toggle reusable
Toggle will be used for others settings so I extract the functionnality
from ThemeToggle.
Diffstat (limited to 'src/components/Settings/ThemeToggle')
| -rw-r--r-- | src/components/Settings/ThemeToggle/ThemeToggle.tsx | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/src/components/Settings/ThemeToggle/ThemeToggle.tsx b/src/components/Settings/ThemeToggle/ThemeToggle.tsx new file mode 100644 index 0000000..e14f39a --- /dev/null +++ b/src/components/Settings/ThemeToggle/ThemeToggle.tsx @@ -0,0 +1,36 @@ +import { Toggle } from '@components/Form'; +import { MoonIcon, SunIcon } from '@components/Icons'; +import Spinner from '@components/Spinner/Spinner'; +import { t } from '@lingui/macro'; +import { useTheme } from 'next-themes'; +import { useEffect, useState } from 'react'; + +const ThemeToggle = () => { + const [isMounted, setIsMounted] = useState<boolean>(false); + const { resolvedTheme, setTheme } = useTheme(); + + useEffect(() => { + setIsMounted(true); + }, []); + + if (!isMounted) return <Spinner />; + + const isDarkTheme = resolvedTheme === 'dark'; + + const updateTheme = () => { + setTheme(isDarkTheme ? 'light' : 'dark'); + }; + + return ( + <Toggle + id="dark-theme" + label={t`Theme:`} + leftChoice={<SunIcon />} + rightChoice={<MoonIcon />} + value={isDarkTheme} + changeHandler={updateTheme} + /> + ); +}; + +export default ThemeToggle; |
