mirror of
https://github.com/grafana/grafana.git
synced 2025-02-25 18:55:37 -06:00
46 lines
1.4 KiB
TypeScript
46 lines
1.4 KiB
TypeScript
import React from 'react';
|
|
import { ThemeContext } from '../../themes/ThemeContext';
|
|
import { select } from '@storybook/addon-knobs';
|
|
import { getTheme } from '../../themes/index';
|
|
import { GrafanaThemeType } from '@grafana/data';
|
|
import { RenderFunction } from '../../types';
|
|
|
|
type SassThemeChangeHandler = (theme: GrafanaThemeType) => void;
|
|
const ThemableStory: React.FunctionComponent<{ handleSassThemeChange: SassThemeChangeHandler }> = ({
|
|
children,
|
|
handleSassThemeChange,
|
|
}) => {
|
|
const themeKnob = select(
|
|
'Theme',
|
|
{
|
|
Light: GrafanaThemeType.Light,
|
|
Dark: GrafanaThemeType.Dark,
|
|
},
|
|
GrafanaThemeType.Dark,
|
|
'Theme'
|
|
);
|
|
|
|
handleSassThemeChange(themeKnob);
|
|
|
|
return <ThemeContext.Provider value={getTheme(themeKnob)}>{children}</ThemeContext.Provider>;
|
|
};
|
|
|
|
// Temporary solution. When we update to Storybook V5 we will be able to pass data from decorator to story
|
|
// https://github.com/storybooks/storybook/issues/340#issuecomment-456013702
|
|
export const renderComponentWithTheme = (component: React.ComponentType<any>, props: any) => {
|
|
return (
|
|
<ThemeContext.Consumer>
|
|
{theme => {
|
|
return React.createElement(component, {
|
|
...props,
|
|
theme,
|
|
});
|
|
}}
|
|
</ThemeContext.Consumer>
|
|
);
|
|
};
|
|
|
|
export const withTheme = (handleSassThemeChange: SassThemeChangeHandler) => (story: RenderFunction) => (
|
|
<ThemableStory handleSassThemeChange={handleSassThemeChange}>{story()}</ThemableStory>
|
|
);
|