1

I have a theme provider written like this

import { Accessor, JSXElement, Setter, children, createContext, createEffect, createSignal, onMount, useContext } from "solid-js";

import constants from "@/constants";

type TThemeProviderProps = {
  children: JSXElement;
  defaultTheme: string;
};

type TThemeContext = [Accessor<string>, Setter<string>];

const ThemeKey = "stk-auth-theme";


const ThemeProvider = (props: TThemeProviderProps) => {
  const [theme, setTheme] = createSignal<string>(props.defaultTheme);

  onMount(() => {
    // read from cache
    const cachedTheme = localStorage.getItem(ThemeKey);
    if (cachedTheme) {
      setTheme(cachedTheme);
    } else {
      const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches;
      setTheme(prefersDark ? "dark" : "light")
    }
  });

  createEffect(() => {
    document.documentElement.classList.toggle(constants.DARK_MODE, theme() === constants.DARK_MODE);
    // write to cache
    localStorage.setItem(ThemeKey, theme());
  });

  const values: TThemeContext = [theme, setTheme];

  return <ThemeContext.Provider value={values}>{props.children}</ThemeContext.Provider>;
};

export const ThemeContext = createContext<TThemeContext>([() => "", undefined]);

export default ThemeProvider;

export const useTheme = () => {
  return useContext(ThemeContext);
};

which works fine but when I change it to the following

import { Accessor, JSXElement, Setter, children, createContext, createEffect, createSignal, onMount, useContext } from "solid-js";

import constants from "@/constants";

type TThemeProviderProps = {
  children: JSXElement;
  defaultTheme: string;
};

type TThemeContext = [Accessor<string>, Setter<string>];

const ThemeKey = "stk-auth-theme";


const ThemeProvider = (props: TThemeProviderProps) => {
  const c = children(() => props.children);
  const [theme, setTheme] = createSignal<string>(props.defaultTheme);

  onMount(() => {
    // read from cache
    const cachedTheme = localStorage.getItem(ThemeKey);
    if (cachedTheme) {
      setTheme(cachedTheme);
    } else {
      const prefersDark = window.matchMedia("(prefers-color-scheme: dark)").matches;
      setTheme(prefersDark ? "dark" : "light")
    }
  });

  createEffect(() => {
    document.documentElement.classList.toggle(constants.DARK_MODE, theme() === constants.DARK_MODE);
    // write to cache
    localStorage.setItem(ThemeKey, theme());
  });

  const values: TThemeContext = [theme, setTheme];

  return <ThemeContext.Provider value={values}>{c()}</ThemeContext.Provider>;
};

export const ThemeContext = createContext<TThemeContext>([() => "", undefined]);

export default ThemeProvider;

export const useTheme = () => {
  return useContext(ThemeContext);
};

It's not working any more, error says setTheme is not a function. why ?

Adharsh M
  • 2,961
  • 3
  • 16
  • 23

0 Answers0