diff --git a/packages/grafana-ui/src/themes/ThemeContext.test.tsx b/packages/grafana-ui/src/themes/ThemeContext.test.tsx new file mode 100644 index 00000000000..26feb2c617c --- /dev/null +++ b/packages/grafana-ui/src/themes/ThemeContext.test.tsx @@ -0,0 +1,27 @@ +import React from 'react'; +import { config } from '@grafana/runtime'; +import { css } from 'emotion'; +import { mount } from 'enzyme'; +import { useStyles } from './ThemeContext'; + +describe('useStyles', () => { + it('passes in theme and returns style object', () => { + const Dummy: React.FC = function() { + const styles = useStyles(theme => { + expect(theme).toEqual(config.theme); + + return { + someStyle: css` + color: ${theme?.palette.critical}; + `, + }; + }); + + expect(typeof styles.someStyle).toBe('string'); + + return
dummy
; + }; + + mount(); + }); +}); diff --git a/packages/grafana-ui/src/themes/ThemeContext.tsx b/packages/grafana-ui/src/themes/ThemeContext.tsx index 0ba6f23e9a0..d5e51752ac9 100644 --- a/packages/grafana-ui/src/themes/ThemeContext.tsx +++ b/packages/grafana-ui/src/themes/ThemeContext.tsx @@ -38,12 +38,11 @@ export const withTheme =

(Component: Rea export function useTheme(): GrafanaTheme { return useContext(ThemeContextMock || ThemeContext); } + /** Hook for using memoized styles with access to the theme. */ -export const useStyles = (getStyles: (theme?: GrafanaTheme) => any) => { - const currentTheme = useTheme(); - const callback = stylesFactory(stylesTheme => getStyles(stylesTheme)); - return callback(currentTheme); -}; +export function useStyles(getStyles: (theme: GrafanaTheme) => T) { + return stylesFactory(getStyles)(useTheme()); +} /** * Enables theme context mocking