// declare namespace Core { export interface Validation { valid: boolean; message?: any; } export type ValidateFunc = (value: any, values: any) => Promise | boolean | Validation; type ValidationResult = Promise export type ExtractProps = TComponentOrTProps extends React.ComponentType ? TProps : TComponentOrTProps; export interface WrapperChildProps { value: any; // name: string; onChange: (event) => any; } export interface FormController { attachComponent: (name, conmponent, defaultValue?) => void; attachContext: (conmponent) => void; validate: () => ValidationResult; validateByName: (name: string, values: { [name: string]: any }) => ValidationResult; set: (name: string, opts: { value?: any, message?: any, valid?: boolean}) => void; get: (name: string) => { value: any, valid: boolean, message?: any }; } export interface FormField { validate?: ValidateFunc Context: React.Context; } export interface FormProviderContext { errors: { [name: string]: boolean; }; values: { [name: string]: any; } onChange: (event) => void; } export interface Provider extends React.Component { onChange: (event: React.SyntheticEvent) => void; update: (errorFields: { [name: string]: any}) => void; context: React.Context; } // React Component Prop Types export interface FormFieldProps extends React.HTMLProps { validate?: ValidateFunc controller?: FormController; name: string; } export interface SimpleWrapperProps extends FormFieldProps { // children: React.ReactElement; children: React.ReactElement; } export interface WrapperProps extends FormFieldProps { children?: (props: WrapperChildProps & { name?: string, error: boolean, message?: any}) => React.ReactElement; } export interface FormProps extends React.HTMLProps { controller: FormController; } // Themes // export interface Theme { // primary: string; // secondary: string; // success: string; // info: string; // warning: string; // danger: string; // light: string; // dark: string; // } // }