import React, { FC, PropsWithChildren } from 'react';
import { i as ExtensionParamsProvider, B as BaseControllerContext, a as BaseService, c as ControllerDeclaration } from './controller-BVEgCAYk.js';
import { I as InferViewPropsFromControllerContext, V as ViewProps, i as ViewControllerContext, B as BaseViewModel, d as ViewModelDeclaration, j as InferViewModelProps } from './viewModel-CspUG5If.js';
import './types-CxOJPpKX.js';
import './types-jkBBq3Lp.js';
import './atom-DIp83xZa.js';

/**
 * NrgyControllerExtension provides a way to add extension params
 * to view controller contexts of all its children.
 */
declare const NrgyControllerExtension: FC<PropsWithChildren<{
    provider: ExtensionParamsProvider;
}>>;

/**
 * Returns a controller instance for the given controller declaration.
 */
declare function useController<TContext extends BaseControllerContext, TService extends BaseService>(declaration: ControllerDeclaration<TContext, TService>): TService;
/**
 * Returns a controller instance for the given controller declaration and props.
 */
declare function useController<TContext extends BaseControllerContext, TService extends BaseService, TProps extends InferViewPropsFromControllerContext<TContext, never>>(declaration: ControllerDeclaration<TContext, TService>, props: TProps): TService;

/**
 * Returns parent's view controller that is provided for the given controller declaration.
 *
 * If the controller is not provided in the context, an error will be thrown.
 */
declare function useProvidedViewController<TContext extends BaseControllerContext, TService extends BaseService>(declaration: ControllerDeclaration<TContext, TService>): TService;
/**
 * Returns parent's view controller that is provided for the given controller declaration.
 *
 * Optional view controller can be used when the controller is not provided in the context.
 */
declare function useOptionalViewController<TContext extends BaseControllerContext, TService extends BaseService>(declaration: ControllerDeclaration<TContext, TService>): TService | undefined;
/**
 * Returns parent's view controller that is provided for the given controller declaration.
 *
 * Optional view controller can be used when the controller is not provided in the context.
 */
declare function useOptionalViewController<TContext extends BaseControllerContext, TService extends BaseService, TDefault extends TService | undefined>(declaration: ControllerDeclaration<TContext, TService>, defaultValue: TDefault): TService | TDefault;
/**
 * Provides a controller for a given controller declaration using a React context.
 */
declare const ViewControllerProvider: <TContext extends BaseControllerContext, TService extends BaseService>(props: PropsWithChildren<{
    declaration: ControllerDeclaration<TContext, TService>;
    controller: TService;
}>) => React.JSX.Element;

/**
 * Creates a higher-order React component that provides a controller for a given view component.
 *
 * @param controllerDeclaration - Controller declaration
 */
declare function withViewController<TProps extends ViewProps, TService extends BaseService>(controllerDeclaration: ControllerDeclaration<ViewControllerContext<TProps>, TService>): (ViewComponent: React.ComponentType<TProps & {
    controller: TService;
}>) => FC<TProps>;

type InferHocComponent<TViewModel extends BaseViewModel, TComponentProps extends {
    viewModel: TViewModel;
}, TViewModelProps = InferViewModelProps<TViewModel>> = FC<PropsWithChildren<Omit<TComponentProps, 'viewModel'> & TViewModelProps>>;
/**
 * Creates a higher-order React component that provides a view model for a given view component.
 *
 * @param viewModelDeclaration - Controller declaration
 */
declare function withViewModel<TViewModel extends BaseViewModel>(viewModelDeclaration: ViewModelDeclaration<TViewModel, ViewControllerContext<InferViewModelProps<TViewModel>>>): <TComponentProps extends {
    viewModel: TViewModel;
}>(ViewComponent: React.ComponentType<PropsWithChildren<TComponentProps>>) => InferHocComponent<TViewModel, TComponentProps>;

export { NrgyControllerExtension, ViewControllerProvider, useController, useOptionalViewController, useProvidedViewController, withViewController, withViewModel };
