/* @flow */ import * as React from 'react'; import deepmerge from 'deepmerge'; import createThemeProvider from './createThemeProvider'; import createWithTheme from './createWithTheme'; import type { WithThemeType } from './createWithTheme'; import type { ThemeProviderType } from './createThemeProvider'; import type { $DeepShape } from './types'; export type ThemingType = { ThemeProvider: ThemeProviderType, withTheme: WithThemeType, }; export default function createTheming( defaultTheme: T ): ThemingType { const ThemeContext: React.Context = React.createContext(defaultTheme); const ThemeProvider: ThemeProviderType = createThemeProvider( defaultTheme, ThemeContext ); const withTheme: WithThemeType = createWithTheme( ThemeProvider, ThemeContext ); const useTheme = (overrides?: $DeepShape): T => { const theme = React.useContext(ThemeContext); const result = React.useMemo( () => theme && overrides ? deepmerge(theme, overrides) : theme || overrides, [theme, overrides] ); return result; }; return { ThemeProvider, withTheme, useTheme, }; }