summaryrefslogtreecommitdiffhomepage
path: root/cloud/web/src/components/context-theme.tsx
blob: 7800aeca039dd2cb13e2c0822152e74f225ab695 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import { createStore } from "solid-js/store"
import { makePersisted } from "@solid-primitives/storage"
import { createEffect } from "solid-js"
import { createInitializedContext } from "../util/context"
import { isServer } from "solid-js/web"

interface Storage {
  mode: "light" | "dark"
}

export const { provider: ThemeProvider, use: useTheme } =
  createInitializedContext("ThemeContext", () => {
    const [store, setStore] = makePersisted(
      createStore<Storage>({
        mode:
          !isServer &&
          window.matchMedia &&
          window.matchMedia("(prefers-color-scheme: dark)").matches
            ? "dark"
            : "light",
      }),
      {
        name: "theme",
      },
    )
    createEffect(() => {
      document.documentElement.setAttribute("data-color-mode", store.mode)
    })

    return {
      setMode(mode: Storage["mode"]) {
        setStore("mode", mode)
      },
      get mode() {
        return store.mode
      },
      ready: true,
    }
  })