summaryrefslogtreecommitdiffstats
path: root/src/components/Settings/ThemeToggle/ThemeToggle.tsx
diff options
context:
space:
mode:
authorArmand Philippot <git@armandphilippot.com>2022-01-17 22:26:16 +0100
committerArmand Philippot <git@armandphilippot.com>2022-01-17 22:54:17 +0100
commita6233863da4203bec781e817963ac3733279cab5 (patch)
treeb075753c4336b737d41c178451551c40c1016951 /src/components/Settings/ThemeToggle/ThemeToggle.tsx
parent68138f0dcd8b3db2c23b31a20508726f245b5ba5 (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/ThemeToggle.tsx')
-rw-r--r--src/components/Settings/ThemeToggle/ThemeToggle.tsx36
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;