summaryrefslogtreecommitdiffstats
path: root/src/components/Settings/PrismThemeToggle
diff options
context:
space:
mode:
authorArmand Philippot <git@armandphilippot.com>2022-02-01 15:15:55 +0100
committerArmand Philippot <git@armandphilippot.com>2022-02-01 15:15:55 +0100
commit1e370817560c905a0a3520e245c317f308b6a5e7 (patch)
treef5a1e2c3b8ddbff2cb4d94eff82830388158e4c9 /src/components/Settings/PrismThemeToggle
parent8f8a3957b5d3b33bafaa0a6afe4187f75d6dd2b7 (diff)
chore: add a new settings to handle prism theme from toolbar
Diffstat (limited to 'src/components/Settings/PrismThemeToggle')
-rw-r--r--src/components/Settings/PrismThemeToggle/PrismThemeToggle.tsx49
1 files changed, 49 insertions, 0 deletions
diff --git a/src/components/Settings/PrismThemeToggle/PrismThemeToggle.tsx b/src/components/Settings/PrismThemeToggle/PrismThemeToggle.tsx
new file mode 100644
index 0000000..06f7ac8
--- /dev/null
+++ b/src/components/Settings/PrismThemeToggle/PrismThemeToggle.tsx
@@ -0,0 +1,49 @@
+import { Toggle } from '@components/Form';
+import { MoonIcon, SunIcon } from '@components/Icons';
+import Spinner from '@components/Spinner/Spinner';
+import { usePrismTheme } from '@utils/providers/prism';
+import { useEffect, useState } from 'react';
+import { useIntl } from 'react-intl';
+
+const PrismThemeToggle = () => {
+ const intl = useIntl();
+ const [isMounted, setIsMounted] = useState<boolean>(false);
+
+ useEffect(() => {
+ setIsMounted(true);
+ }, []);
+
+ const { theme, setTheme, resolvedTheme } = usePrismTheme();
+ const [isDarkTheme, setIsDarkTheme] = useState<boolean>(theme === 'dark');
+
+ useEffect(() => {
+ if (theme === 'system') {
+ setIsDarkTheme(resolvedTheme === 'dark');
+ } else {
+ setIsDarkTheme(theme === 'dark');
+ }
+ }, [theme, resolvedTheme]);
+
+ const updateTheme = () => {
+ isDarkTheme ? setTheme('light') : setTheme('dark');
+ setIsDarkTheme(!isDarkTheme);
+ };
+
+ if (!isMounted) return <Spinner />;
+
+ return (
+ <Toggle
+ id="prism-theme"
+ label={intl.formatMessage({
+ defaultMessage: 'Code blocks:',
+ description: 'PrismThemeToggle: toggle label',
+ })}
+ leftChoice={<SunIcon />}
+ rightChoice={<MoonIcon />}
+ value={isDarkTheme}
+ changeHandler={updateTheme}
+ />
+ );
+};
+
+export default PrismThemeToggle;