From 1e370817560c905a0a3520e245c317f308b6a5e7 Mon Sep 17 00:00:00 2001 From: Armand Philippot Date: Tue, 1 Feb 2022 15:15:55 +0100 Subject: chore: add a new settings to handle prism theme from toolbar --- src/components/MDX/CodeBlock/CodeBlock.tsx | 10 +++++ .../Settings/PrismThemeToggle/PrismThemeToggle.tsx | 49 ++++++++++++++++++++++ src/components/Settings/Settings.tsx | 2 + 3 files changed, 61 insertions(+) create mode 100644 src/components/Settings/PrismThemeToggle/PrismThemeToggle.tsx (limited to 'src/components') diff --git a/src/components/MDX/CodeBlock/CodeBlock.tsx b/src/components/MDX/CodeBlock/CodeBlock.tsx index a822744..45a6176 100644 --- a/src/components/MDX/CodeBlock/CodeBlock.tsx +++ b/src/components/MDX/CodeBlock/CodeBlock.tsx @@ -5,6 +5,7 @@ import Prism from 'prismjs'; import { ReactChildren, useEffect } from 'react'; import { useIntl } from 'react-intl'; import '@utils/plugins/prism-color-scheme'; +import { usePrismTheme } from '@utils/providers/prism'; const CodeBlock = ({ className, @@ -29,6 +30,15 @@ const CodeBlock = ({ translateCopyButton(locale, intl); }, [intl, locale]); + const { setCodeBlocks } = usePrismTheme(); + + useEffect(() => { + const allPre: NodeListOf = document.querySelectorAll( + 'pre[data-prismjs-color-scheme' + ); + setCodeBlocks(allPre); + }, [setCodeBlocks, router.asPath]); + return (
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(false);
+
+  useEffect(() => {
+    setIsMounted(true);
+  }, []);
+
+  const { theme, setTheme, resolvedTheme } = usePrismTheme();
+  const [isDarkTheme, setIsDarkTheme] = useState(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 ;
+
+  return (
+    }
+      rightChoice={}
+      value={isDarkTheme}
+      changeHandler={updateTheme}
+    />
+  );
+};
+
+export default PrismThemeToggle;
diff --git a/src/components/Settings/Settings.tsx b/src/components/Settings/Settings.tsx
index 80eb0c3..9f38ecb 100644
--- a/src/components/Settings/Settings.tsx
+++ b/src/components/Settings/Settings.tsx
@@ -1,6 +1,7 @@
 import { CogIcon } from '@components/Icons';
 import ThemeToggle from '@components/Settings/ThemeToggle/ThemeToggle';
 import { useIntl } from 'react-intl';
+import PrismThemeToggle from './PrismThemeToggle/PrismThemeToggle';
 import ReduceMotion from './ReduceMotion/ReduceMotion';
 import styles from './Settings.module.scss';
 
@@ -18,6 +19,7 @@ const Settings = () => {
       
+ ); }; -- cgit v1.2.3