import React, { Dispatch, SetStateAction, useContext, useEffect, useState } from 'react'; import { BehaviorSubject } from 'rxjs'; import { useConstant } from './useConstant'; const NamedThemeContext = React.createContext>(new BehaviorSubject(null)); export function NamedThemeProvider({ children, initialTheme }) { const state = useConstant( () => new BehaviorSubject(typeof initialTheme === 'function' ? initialTheme() : initialTheme), ); useEffect(() => { return () => state.complete(); }, []); return {children}; } export function useNamedTheme(): [string, Dispatch>] { const state = useContext(NamedThemeContext); const [theme, setTheme] = useState(state.value); useEffect(() => { const subscribe = state.subscribe(setTheme); return subscribe.unsubscribe.bind(subscribe); }, [state]); return [theme, (v) => state.next(v)]; }