/// <reference types="react" />
import { ComponentClass, StatelessComponent } from 'react';
import { Dispatch, ReducibleNode } from 'reducible-node';
import { PageInstance } from './pageInstance';
import { Navigator } from './navigator';
export declare type ValidTreeNode = {
    [path: string]: PageFolder | Page;
};
export declare type PageTreeNode<T extends ValidTreeNode = {}> = T;
export interface PageFolder<T extends ValidTreeNode = {}> {
    path: string;
    title: string;
    contents: PageTreeNode<T>;
}
export declare function folder<T extends ValidTreeNode = {}>(title: string, contents: PageTreeNode<T>): PageFolder<T>;
export interface ReplaceOptions<TParams> {
    mutex?: string;
    params?: TParams;
    title?: string;
    parent?: string;
    openedFrom?: string;
}
export interface OpenOptions<TParams> extends ReplaceOptions<TParams> {
    insertAfterMutex?: string;
}
export interface Page<TParams = any, TState = any> {
    readonly type: {
        params: TParams;
        state: TState;
    };
    title?: string;
    path: string;
    hidden: boolean;
    persistent: boolean;
    component: ComponentClass<any> | StatelessComponent<any>;
    node: ReducibleNode<TState>;
    open: (dispatch: Dispatch, navigator: Navigator, opt?: OpenOptions<TParams>) => void;
    replace: (dispatch: Dispatch, navigator: Navigator, target: string, opt?: ReplaceOptions<TParams>) => void;
}
export interface BuildPageOptions {
    title?: string;
    hidden?: boolean;
    persistent?: boolean;
}
export declare function buildPage<TParams, TState>(component: ComponentClass<any> | StatelessComponent<any>, node: ReducibleNode<TState>, options?: BuildPageOptions): Page<TParams, TState>;
export interface PageOccurrence<TParams = {}> {
    path: string;
    mutex: string;
    params?: TParams;
    title?: string;
    parent?: string;
    openedFrom?: string;
}
export declare type PathTreeNode = string | PathTree;
export interface PathTree extends Array<PathTreeNode> {
}
export declare class Pages<T extends ValidTreeNode = any> {
    private pages;
    private folders;
    private calculatedPathTree;
    private calculatedFolderContents;
    private calculatedFilteredPathTree;
    private calculatedFilteredFolderContents;
    readonly prefix: string;
    readonly tree: PageTreeNode<T>;
    constructor(prefix: string, root: PageTreeNode<T>);
    hasPage(path: string): boolean;
    getPage(path: string): Page;
    hasFolder(path: string): boolean;
    getFolder(path: string): PageFolder;
    isHidden(path: string): boolean;
    readonly pathTree: PathTree;
    readonly folderContents: {
        [folder: string]: string[];
    };
    readonly filteredPathTree: PathTree;
    readonly filteredFolderContents: {
        [folder: string]: string[];
    };
    buildInstance<TState, TReducerBuilderData>(occurrence: PageOccurrence<TReducerBuilderData>): PageInstance<TState, TReducerBuilderData>;
}
