/**
 * Types.ts
 *
 * Copyright (c) Microsoft Corporation. All rights reserved.
 * Licensed under the MIT license.
 * Type definitions for reactxp-naviigation extension.
 */
import * as React from 'react';
import * as RX from 'reactxp';
export declare type ReactNode = React.ReactNode;
export declare enum NavigatorSceneConfigType {
    FloatFromRight = 0,
    FloatFromLeft = 1,
    FloatFromBottom = 2,
    Fade = 3,
    FadeWithSlide = 4
}
export interface NavigatorRoute {
    routeId: number;
    sceneConfigType: NavigatorSceneConfigType;
    gestureResponseDistance?: number;
    customSceneConfig?: CustomNavigatorSceneConfig;
}
export declare type NavigationTransitionSpec = {
    duration?: number;
    easing?: RX.Types.Animated.EasingFunction;
};
export declare type NavigationTransitionStyleConfig = {
    inputRange?: number[];
    opacityOutput: number | number[];
    scaleOutput: number | number[];
    translateXOutput: number | number[];
    translateYOutput: number | number[];
};
export declare type CustomNavigatorSceneConfig = {
    transitionStyle: (sceneIndex: number, sceneDimensions: RX.Types.Dimensions) => NavigationTransitionStyleConfig;
    transitionSpec?: NavigationTransitionSpec;
    cardStyle?: RX.Types.ViewStyleRuleSet;
    hideShadow?: boolean;
    presentBelowPrevious?: boolean;
};
export interface NavigatorProps extends RX.CommonProps {
    renderScene: (route: NavigatorRoute) => JSX.Element | null;
    navigateBackCompleted?: () => void;
    transitionStarted?: (progress?: RX.Types.AnimatedValue, toRouteId?: string, fromRouteId?: string, toIndex?: number, fromIndex?: number) => void;
    transitionCompleted?: () => void;
    cardStyle?: RX.Types.ViewStyleRuleSet;
    children?: ReactNode;
    delegateSelector?: NavigatorDelegateSelector;
}
export declare enum CommandType {
    Push = 0,
    Pop = 1,
    Replace = 2
}
export interface CommandParam {
    route?: NavigatorRoute;
    value?: number;
}
export interface NavigationCommand {
    type: CommandType;
    param: CommandParam;
}
export interface NavigatorState {
}
export declare abstract class Navigator<S> extends React.Component<NavigatorProps, S> {
    abstract push(route: NavigatorRoute): void;
    abstract pop(): void;
    abstract replace(route: NavigatorRoute): void;
    abstract replacePrevious(route: NavigatorRoute): void;
    abstract replaceAtIndex(route: NavigatorRoute, index: number): void;
    abstract immediatelyResetRouteStack(nextRouteStack: NavigatorRoute[]): void;
    abstract popToRoute(route: NavigatorRoute): void;
    abstract popToTop(): void;
    abstract getCurrentRoutes(): NavigatorRoute[];
}
export interface NavigatorDelegateSelector {
    getNavigatorDelegate(navigator: Navigator<NavigatorState>): NavigatorDelegate;
}
export declare abstract class NavigatorDelegate {
    protected _owner: Navigator<NavigatorState>;
    constructor(navigator: Navigator<NavigatorState>);
    onBackPress: () => boolean;
    abstract getRoutes(): NavigatorRoute[];
    abstract immediatelyResetRouteStack(nextRouteStack: NavigatorRoute[]): void;
    abstract render(): JSX.Element | null;
    abstract processCommand(commandQueue: NavigationCommand[]): void;
    abstract handleBackPress(): void;
}
