aboutsummaryrefslogtreecommitdiffstats
path: root/src/pages
diff options
context:
space:
mode:
authorArmand Philippot <git@armandphilippot.com>2023-10-28 17:12:58 +0200
committerArmand Philippot <git@armandphilippot.com>2023-11-11 18:15:27 +0100
commit60c49f18389ff625177a57277ef8f292a31097bf (patch)
tree76b0f1f1792b57659e54d282f93df70088446e3c /src/pages
parent05f1dfc6896d3affa7c494a1b955f230d836a4b7 (diff)
refactor(providers,hooks): rewrite PrismThemeProvider & usePrismTheme
* reuse Theme provider logic * move DOM mutation from provider to hook * add a script to init theme before page load
Diffstat (limited to 'src/pages')
-rw-r--r--src/pages/_app.tsx7
-rw-r--r--src/pages/_document.tsx17
2 files changed, 21 insertions, 3 deletions
diff --git a/src/pages/_app.tsx b/src/pages/_app.tsx
index 0c92c93..caf4a96 100644
--- a/src/pages/_app.tsx
+++ b/src/pages/_app.tsx
@@ -3,7 +3,7 @@ import { IntlProvider } from 'react-intl';
import '../styles/globals.scss';
import type { AppPropsWithLayout } from '../types';
import { settings } from '../utils/config';
-import { STORAGE_KEY } from '../utils/constants';
+import { PRISM_THEME_ATTRIBUTE, STORAGE_KEY } from '../utils/constants';
import {
AckeeProvider,
MotionProvider,
@@ -37,7 +37,10 @@ const App = ({ Component, pageProps }: AppPropsWithLayout) => {
attribute={STORAGE_KEY.THEME}
storageKey={STORAGE_KEY.THEME}
>
- <PrismThemeProvider>
+ <PrismThemeProvider
+ attribute={PRISM_THEME_ATTRIBUTE}
+ storageKey={STORAGE_KEY.PRISM}
+ >
{getLayout(<Component {...componentProps} />, {})}
</PrismThemeProvider>
</ThemeProvider>
diff --git a/src/pages/_document.tsx b/src/pages/_document.tsx
index 7e3b5e6..6d065cd 100644
--- a/src/pages/_document.tsx
+++ b/src/pages/_document.tsx
@@ -1,6 +1,12 @@
import { Html, Head, Main, NextScript } from 'next/document';
import Script from 'next/script';
-import { STORAGE_KEY } from '../utils/constants';
+import {
+ PRISM_THEME_ATTRIBUTE,
+ STORAGE_KEY,
+ VALID_THEMES,
+} from '../utils/constants';
+
+const validPrismThemesStr = VALID_THEMES.map((t) => `"${t}"`);
// eslint-disable-next-line @typescript-eslint/no-shadow -- Required by NextJs
export default function Document() {
@@ -25,6 +31,15 @@ export default function Document() {
// eslint-disable-next-line react/jsx-no-literals
strategy="beforeInteractive"
/>
+ <Script
+ dangerouslySetInnerHTML={{
+ __html: `!function(){const t=localStorage.getItem("${STORAGE_KEY.PRISM}"),e="string"==typeof t?JSON.parse(t):void 0,s=e&&[${validPrismThemesStr}].includes(e)?e:"system";document.documentElement.setAttribute("${PRISM_THEME_ATTRIBUTE}",s)}();`,
+ }}
+ // eslint-disable-next-line react/jsx-no-literals
+ id="prism-theme-hydration"
+ // eslint-disable-next-line react/jsx-no-literals
+ strategy="beforeInteractive"
+ />
</Head>
<body>
<Main />