2021-02-20 16:02:06 +08:00
|
|
|
import React, { useEffect, useState } from 'react';
|
2022-04-22 21:33:13 +08:00
|
|
|
|
2022-07-15 02:34:00 +08:00
|
|
|
import { GrafanaTheme2 } from '@grafana/data';
|
2022-07-23 23:09:03 +08:00
|
|
|
import { ThemeChangedEvent } from '@grafana/runtime';
|
2021-02-20 16:02:06 +08:00
|
|
|
import { ThemeContext } from '@grafana/ui';
|
2022-04-22 21:33:13 +08:00
|
|
|
|
2021-02-20 16:02:06 +08:00
|
|
|
import { appEvents } from '../core';
|
2019-01-18 16:50:29 +08:00
|
|
|
|
2022-07-15 02:34:00 +08:00
|
|
|
export const ThemeProvider = ({ children, value }: { children: React.ReactNode; value: GrafanaTheme2 }) => {
|
|
|
|
|
const [theme, setTheme] = useState(value);
|
2019-01-18 16:50:29 +08:00
|
|
|
|
2021-02-20 16:02:06 +08:00
|
|
|
useEffect(() => {
|
|
|
|
|
const sub = appEvents.subscribe(ThemeChangedEvent, (event) => {
|
|
|
|
|
setTheme(event.payload);
|
|
|
|
|
});
|
2019-01-18 16:50:29 +08:00
|
|
|
|
2021-02-20 16:02:06 +08:00
|
|
|
return () => sub.unsubscribe();
|
|
|
|
|
}, []);
|
|
|
|
|
|
|
|
|
|
return <ThemeContext.Provider value={theme}>{children}</ThemeContext.Provider>;
|
2019-01-18 16:50:29 +08:00
|
|
|
};
|
2019-02-06 00:04:48 +08:00
|
|
|
|
2022-07-15 02:34:00 +08:00
|
|
|
export const provideTheme = (component: React.ComponentType<any>, theme: GrafanaTheme2) => {
|
2022-07-23 23:09:03 +08:00
|
|
|
return function ThemeProviderWrapper(props: any) {
|
|
|
|
|
return <ThemeProvider value={theme}>{React.createElement(component, { ...props })}</ThemeProvider>;
|
|
|
|
|
};
|
2019-02-06 00:04:48 +08:00
|
|
|
};
|