grafana/public/app/core/utils/ConfigProvider.tsx
Torkel Ödegaard b782d9aa12
GrafanaContext: Exploring a way to get rid of global scope singletons (#52128)
* Context start

* More progress on more generic react context for services

* Update

* Update Page test

* Fixing tests

* Moving to core app
2022-07-23 17:09:03 +02:00

28 lines
911 B
TypeScript

import React, { useEffect, useState } from 'react';
import { GrafanaTheme2 } from '@grafana/data';
import { ThemeChangedEvent } from '@grafana/runtime';
import { ThemeContext } from '@grafana/ui';
import { appEvents } from '../core';
export const ThemeProvider = ({ children, value }: { children: React.ReactNode; value: GrafanaTheme2 }) => {
const [theme, setTheme] = useState(value);
useEffect(() => {
const sub = appEvents.subscribe(ThemeChangedEvent, (event) => {
setTheme(event.payload);
});
return () => sub.unsubscribe();
}, []);
return <ThemeContext.Provider value={theme}>{children}</ThemeContext.Provider>;
};
export const provideTheme = (component: React.ComponentType<any>, theme: GrafanaTheme2) => {
return function ThemeProviderWrapper(props: any) {
return <ThemeProvider value={theme}>{React.createElement(component, { ...props })}</ThemeProvider>;
};
};