import {createContext, useContext} from 'react'; import {StyleProp, ViewStyle, TextStyle, ImageStyle} from 'react-native'; function createCtx() { const ctx = createContext(undefined); function useCtx() { const c = useContext(ctx); if (c === undefined) { return undefined; } return c; } return [useCtx, ctx.Provider] as const; // 'as const' makes TypeScript infer a tuple } // Usage: // We still have to specify a type, but no default! interface Color { [key: string]: string; } interface Button { base: StyleProp; text: StyleProp; accentLeft: StyleProp; accentRight: StyleProp; } interface IconButton { base: StyleProp; icon: StyleProp; } interface Icon { base: StyleProp; } interface Input { base: StyleProp; text: StyleProp; accentLeft: StyleProp; accentRight: StyleProp; } interface Select { base: StyleProp; wrapper: StyleProp; draggableIcon: StyleProp; } interface SelectItem { base: StyleProp; text: StyleProp; icon: StyleProp; } interface KoiButton { default: Button; outline: Button; ghost: Button; small: Button; medium: Button; large: Button; } interface KoiIconButton { default: IconButton; outline: IconButton; ghost: IconButton; small: IconButton; medium: IconButton; large: IconButton; } interface KoiIcon { default: Icon; } interface KoiInput { default: Input; active: Input; } interface KoiSelect { default: Select; } interface KoiSelectItem { default: SelectItem; active: SelectItem; } interface Palette { primary: Color; success: Color; warning: Color; error: Color; basic: Color; } interface Typography { h1?: StyleProp; h2?: StyleProp; h3?: StyleProp; body1?: StyleProp; body2?: StyleProp; } interface Override { KoiButton?: KoiButton; KoiIcon?: KoiIcon; KoiInput?: KoiInput; KoiIconButton?: KoiIconButton; KoiSelect?: KoiSelect; KoiSelectItem?: KoiSelectItem; } export interface Theme { palette?: Palette; typography?: Typography; override?: Override; constants?: any; } export const [useTheme, ThemeProvider] = createCtx();