/**
 * @module Types
 */
import { ClientApplication } from '../client';
import { ActionSet } from './helper';
import { ErrorAction } from './Error/actions';
export declare enum Group {
    Button = "Button",
    ButtonGroup = "ButtonGroup",
    Cart = "Cart",
    Error = "Error",
    Flash = "Flash",
    Loading = "Loading",
    Modal = "Modal",
    Navigation = "Navigation",
    Print = "Print",
    TitleBar = "TitleBar",
    ResourcePicker = "Resource_Picker",
}
export declare enum ComponentType {
    Button = "Button",
    ButtonGroup = "ButtonGroup",
}
export interface AnyAction {
    type: any;
    [extraProps: string]: any;
}
export interface MetaAction extends AnyAction {
    readonly version: string;
    readonly group: string;
    readonly type: string;
    payload?: any;
}
export interface ClickAction extends MetaAction {
    payload: {
        id: string;
        payload?: any;
    };
}
export interface ActionCallback {
    (data: any): void;
}
export interface ErrorCallback {
    (data: ErrorAction): void;
}
export interface UpdateSubscribe {
    (group: string, subgroups: string[]): void;
}
export interface Unsubscribe {
    (): void;
}
export interface ErrorSubscriber {
    (callback: ErrorCallback): Unsubscribe;
}
export interface ActionSubscription {
    component: Component;
    eventType: string;
    callback: ActionCallback;
    unsubscribe: Unsubscribe;
    updateSubscribe: UpdateSubscribe;
}
export interface UpdateSubscription {
    (subscriptionToRemove: ActionSubscription, group: string, subgroups: string[]): void;
}
export interface Component {
    readonly id: string;
    readonly type: string;
    subgroups?: string[];
}
export interface ActionSetInterface extends Component {
    readonly app: ClientApplication<any>;
    readonly defaultGroup: string;
    group: string;
    component: Component;
    subscriptions: ActionSubscription[];
    updateSubscription: UpdateSubscription;
    error: ErrorSubscriber;
    subscribe(eventName: string, callback: ActionCallback, component?: Component, currentIndex?: number): Unsubscribe;
    unsubscribe(resetOnly: boolean): ActionSetInterface;
}
export interface DispatchAction {
    type: string;
    payload: any;
}
export interface SimpleDispatch {
    dispatch(action: string): ActionSet;
}
export interface ComplexDispatch<P> {
    dispatch(action: string, payload: P): ActionSet;
}
export interface ActionSetProps<T, P> extends SimpleDispatch {
    options: T;
    payload: P;
    set(options: Partial<T>): ActionSet;
}
export interface ActionSetPayload<P> extends SimpleDispatch {
    payload: P;
}
export interface ActionSetOptions<T> {
    options: T;
    set(options: Partial<T>): ActionSet;
}
export interface Dispatch<S> {
    <A extends AnyAction>(action: A): A;
}
