mirror of https://github.com/grafana/grafana.git
				
				
				
			
		
			
				
	
	
		
			42 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
			
		
		
	
	
			42 lines
		
	
	
		
			1.3 KiB
		
	
	
	
		
			TypeScript
		
	
	
	
| import { useEffect, useState } from 'react';
 | |
| import * as React from 'react';
 | |
| import { SkeletonTheme } from 'react-loading-skeleton';
 | |
| 
 | |
| import { GrafanaTheme2, ThemeContext } from '@grafana/data';
 | |
| import { ThemeChangedEvent, config } from '@grafana/runtime';
 | |
| 
 | |
| import { appEvents } from '../core';
 | |
| 
 | |
| import 'react-loading-skeleton/dist/skeleton.css';
 | |
| 
 | |
| export const ThemeProvider = ({ children, value }: { children: React.ReactNode; value: GrafanaTheme2 }) => {
 | |
|   const [theme, setTheme] = useState(value);
 | |
| 
 | |
|   useEffect(() => {
 | |
|     const sub = appEvents.subscribe(ThemeChangedEvent, (event) => {
 | |
|       config.theme2 = event.payload;
 | |
|       setTheme(event.payload);
 | |
|     });
 | |
| 
 | |
|     return () => sub.unsubscribe();
 | |
|   }, []);
 | |
| 
 | |
|   return (
 | |
|     <ThemeContext.Provider value={theme}>
 | |
|       <SkeletonTheme
 | |
|         baseColor={theme.colors.emphasize(theme.colors.background.secondary)}
 | |
|         highlightColor={theme.colors.emphasize(theme.colors.background.secondary, 0.1)}
 | |
|         borderRadius={theme.shape.radius.default}
 | |
|       >
 | |
|         {children}
 | |
|       </SkeletonTheme>
 | |
|     </ThemeContext.Provider>
 | |
|   );
 | |
| };
 | |
| 
 | |
| export const provideTheme = <P extends {}>(component: React.ComponentType<P>, theme: GrafanaTheme2) => {
 | |
|   return function ThemeProviderWrapper(props: P) {
 | |
|     return <ThemeProvider value={theme}>{React.createElement(component, { ...props })}</ThemeProvider>;
 | |
|   };
 | |
| };
 |