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();