From 9fce50d25931356d7fa73cc054c54e1952e5c8a4 Mon Sep 17 00:00:00 2001
From: mrjvs <jellevs@gmail.com>
Date: Sat, 9 Dec 2023 17:37:51 +0100
Subject: [PATCH] Fix theme not applying on body colors

---
 src/index.tsx              | 11 ++--------
 src/stores/theme/index.ts  | 24 --------------------
 src/stores/theme/index.tsx | 45 ++++++++++++++++++++++++++++++++++++++
 themes/default.ts          |  2 --
 4 files changed, 47 insertions(+), 35 deletions(-)
 delete mode 100644 src/stores/theme/index.ts
 create mode 100644 src/stores/theme/index.tsx

diff --git a/src/index.tsx b/src/index.tsx
index ac372fee..780bd63e 100644
--- a/src/index.tsx
+++ b/src/index.tsx
@@ -28,7 +28,7 @@ import { BookmarkSyncer } from "@/stores/bookmarks/BookmarkSyncer";
 import { useLanguageStore } from "@/stores/language";
 import { ProgressSyncer } from "@/stores/progress/ProgressSyncer";
 import { SettingsSyncer } from "@/stores/subtitles/SettingsSyncer";
-import { useThemeStore } from "@/stores/theme";
+import { ThemeProvider } from "@/stores/theme";
 
 import { initializeChromecast } from "./setup/chromecast";
 import { initializeOldStores } from "./stores/__old/migrations";
@@ -124,19 +124,12 @@ function TheRouter(props: { children: ReactNode }) {
   return <HashRouter>{props.children}</HashRouter>;
 }
 
-function ThemeProvider(props: { children: ReactNode }) {
-  const theme = useThemeStore((s) => s.theme);
-  const themeSelector = theme ? `theme-${theme}` : undefined;
-
-  return <div className={themeSelector}>{props.children}</div>;
-}
-
 ReactDOM.render(
   <React.StrictMode>
     <ErrorBoundary>
       <HelmetProvider>
         <Suspense fallback={<LoadingScreen type="lazy" />}>
-          <ThemeProvider>
+          <ThemeProvider applyGlobal>
             <ProgressSyncer />
             <BookmarkSyncer />
             <SettingsSyncer />
diff --git a/src/stores/theme/index.ts b/src/stores/theme/index.ts
deleted file mode 100644
index 13339a8d..00000000
--- a/src/stores/theme/index.ts
+++ /dev/null
@@ -1,24 +0,0 @@
-import { create } from "zustand";
-import { persist } from "zustand/middleware";
-import { immer } from "zustand/middleware/immer";
-
-export interface ThemeStore {
-  theme: string | null;
-  setTheme(v: string | null): void;
-}
-
-export const useThemeStore = create(
-  persist(
-    immer<ThemeStore>((set) => ({
-      theme: null,
-      setTheme(v) {
-        set((s) => {
-          s.theme = v;
-        });
-      },
-    })),
-    {
-      name: "__MW::theme",
-    }
-  )
-);
diff --git a/src/stores/theme/index.tsx b/src/stores/theme/index.tsx
new file mode 100644
index 00000000..2abfc33f
--- /dev/null
+++ b/src/stores/theme/index.tsx
@@ -0,0 +1,45 @@
+import { ReactNode } from "react";
+import { Helmet } from "react-helmet-async";
+import { create } from "zustand";
+import { persist } from "zustand/middleware";
+import { immer } from "zustand/middleware/immer";
+
+export interface ThemeStore {
+  theme: string | null;
+  setTheme(v: string | null): void;
+}
+
+export const useThemeStore = create(
+  persist(
+    immer<ThemeStore>((set) => ({
+      theme: null,
+      setTheme(v) {
+        set((s) => {
+          s.theme = v;
+        });
+      },
+    })),
+    {
+      name: "__MW::theme",
+    }
+  )
+);
+
+export function ThemeProvider(props: {
+  children?: ReactNode;
+  applyGlobal?: boolean;
+}) {
+  const theme = useThemeStore((s) => s.theme);
+  const themeSelector = theme ? `theme-${theme}` : undefined;
+
+  return (
+    <div className={themeSelector}>
+      {props.applyGlobal ? (
+        <Helmet>
+          <body className={themeSelector} />
+        </Helmet>
+      ) : null}
+      {props.children}
+    </div>
+  );
+}
diff --git a/themes/default.ts b/themes/default.ts
index 52e361d3..7a010338 100644
--- a/themes/default.ts
+++ b/themes/default.ts
@@ -83,8 +83,6 @@ const tokens = {
   }
 }
 
-// TODO body background isn't themed
-
 export const defaultTheme = {
   extend: {
     colors: {