mobx-view-model
Version:
⚡ Clean MVVM for React + MobX | Powerful ViewModels made simple ⚡
650 lines (626 loc) • 35.7 kB
TypeScript
import { PubSub } from 'yummies/complex';
import { ObservableAnnotationsArray } from 'yummies/mobx';
import { Class, MaybePromise, AnyObject, Maybe, EmptyObject, IsPartial, IsAny, IsUnknown, HasKey, Defined, DeepPartial } from 'yummies/types';
import { LoadableMixin, LoadableConfig } from 'react-simple-loadable';
import { PackedAsyncModule } from 'yummies/imports';
import * as react from 'react';
import { ReactNode } from 'react';
import * as react_jsx_runtime from 'react/jsx-runtime';
interface LazyViewAndModel<TViewModel extends AnyViewModel | AnyViewModelSimple, TView extends React.ComponentType<any>> {
Model: Class<TViewModel> | PackedAsyncModule<Class<TViewModel>>;
View?: TView | PackedAsyncModule<TView>;
}
type VMLazyComponent<TViewModel extends AnyViewModel | AnyViewModelSimple, TView extends React.ComponentType<any>> = VMComponent<TViewModel, React.ComponentProps<TView>> & LoadableMixin;
interface LazyViewModelHocConfig<TViewModel extends AnyViewModel> extends ViewModelHocConfig<TViewModel>, Pick<LoadableConfig, 'loading' | 'preload' | 'throwOnError'> {
}
interface LazyViewModelSimpleHocConfig<TViewModel extends AnyViewModelSimple> extends ViewModelSimpleHocConfig<TViewModel>, Pick<LoadableConfig, 'loading' | 'preload' | 'throwOnError'> {
}
/**
* A Higher-Order Component that **LAZY** connects React components to their ViewModels, providing seamless MobX integration.
*
* @deprecated use `loadable()` from `react-simple-loadable` instead.
*
* [**Documentation**](https://js2me.github.io/mobx-view-model/react/api/with-lazy-view-model.html)
*/
declare function withLazyViewModel<TViewModel extends AnyViewModel, TView extends React.ComponentType<any>>(loadFunction: () => MaybePromise<LazyViewAndModel<TViewModel, TView>>, configOrFallbackComponent?: LazyViewModelHocConfig<NoInfer<TViewModel>> | LoadableConfig['loading']): VMLazyComponent<TViewModel, TView>;
/**
* A Higher-Order Component that **LAZY** connects React components to their ViewModels, providing seamless MobX integration.
*
* @deprecated use `loadable()` from `react-simple-loadable` instead.
*
* [**Documentation**](https://js2me.github.io/mobx-view-model/react/api/with-lazy-view-model.html)
*/
declare function withLazyViewModel<TViewModel extends AnyViewModelSimple, TView extends React.ComponentType<any>>(loadFunction: () => MaybePromise<LazyViewAndModel<TViewModel, TView>>, configOrFallbackComponent?: LazyViewModelSimpleHocConfig<NoInfer<TViewModel>> | LoadableConfig['loading']): VMLazyComponent<TViewModel, TView>;
interface ViewModelStoreConfig {
/**
* [**Documentation**](https://js2me.github.io/mobx-view-model/api/view-models/view-models-config)
*/
vmConfig?: ViewModelsRawConfig;
}
interface ViewModelGenerateIdConfig<VM extends AnyViewModel> {
VM: Class<VM>;
id?: Maybe<string>;
ctx: AnyObject;
parentViewModelId: string | null;
fallback?: React.ComponentType;
}
interface ViewModelCreateConfig<VM extends AnyViewModel> extends ViewModelParams<VM['payload'], VM['parentViewModel']> {
VM: Class<VM>;
fallback?: React.ComponentType;
component?: VMComponent<AnyViewModel, any>;
props?: AnyObject;
}
/**
* [**Documentation**](https://js2me.github.io/mobx-view-model/api/other/view-model-lookup)
*/
type ViewModelLookup<T extends AnyViewModel | AnyViewModelSimple> = AnyViewModel['id'] | Class<T> | (T extends AnyViewModel ? VMComponent<T, any> | VMLazyComponent<T, any> : Class<T>);
/**
* Interface for creating simple view models
*
* [**Documentation**](https://js2me.github.io/mobx-view-model/api/view-models/view-model-simple.html)
*/
interface ViewModelSimple<Payload extends AnyObject = EmptyObject, ParentViewModel extends AnyViewModel | AnyViewModelSimple | null = null> {
/**
* Unique identifier for the view model instance.
* If not provided, it will be autogenerated by the library.
*/
id?: string;
/**
* Automatically setted by the library.
*/
parentViewModel?: ParentViewModel;
mount?(): void;
unmount?(): void;
setPayload?(payload: Payload): void;
attachViewModelStore?(viewModelStore: ViewModelStore): void;
}
/** [**Documentation**](https://js2me.github.io/mobx-view-model/api/view-model-store/interface) */
interface ViewModelStore<VMBase extends AnyViewModel = AnyViewModel> {
/**
* [**Documentation**](https://js2me.github.io/mobx-view-model/api/view-model-store/interface#getidsvmlookup)
* @param vmLookup - The ID or class type of the view model. See {@link ViewModelLookup}.
* @returns The IDs of the view models
*/
getIds<T extends VMBase | AnyViewModelSimple>(vmLookup: Maybe<ViewModelLookup<T>>): string[];
/**
* [**Documentation**](https://js2me.github.io/mobx-view-model/api/view-model-store/interface#getidvmlookup)
* @param vmLookup - The ID or class type of the view model. See {@link ViewModelLookup}.
* @returns The ID of the view model, or null if not found.
*/
getId<T extends VMBase | AnyViewModelSimple>(vmLookup: Maybe<ViewModelLookup<T>>): string | null;
/**
* [**Documentation**](https://js2me.github.io/mobx-view-model/api/view-model-store/interface#mountedviewscount)
*/
mountedViewsCount: number;
/**
* [**Documentation**](https://js2me.github.io/mobx-view-model/api/view-model-store/interface#hasvmlookup)
* @param vmLookup - The ID or class type of the view model. See {@link ViewModelLookup}.
* @returns True if the instance exists, false otherwise.
*/
has<T extends VMBase | AnyViewModelSimple>(vmLookup: Maybe<ViewModelLookup<T>>): boolean;
/**
* [**Documentation**](https://js2me.github.io/mobx-view-model/api/view-model-store/interface#getvmlookup)
* @param vmLookup - The ID or class type of the view model. See {@link ViewModelLookup}.
* @returns The view model instance, or null if not found.
*/
get<T extends VMBase | AnyViewModelSimple>(vmLookup: Maybe<ViewModelLookup<T>>): T | null;
/**
* [**Documentation**](https://js2me.github.io/mobx-view-model/api/view-model-store/interface#getallvmlookup)
* @param vmLookup - The ID or class type of the view model. See {@link ViewModelLookup}.
* @returns The view model instance, or null if not found.
*/
getAll<T extends VMBase | AnyViewModelSimple>(vmLookup: Maybe<ViewModelLookup<T>>): T[];
/**
* This is specific method to be called when a view model is about to be attached to view.
* This method is the first method where the created view model instance is passed to the view model store.
*/
markToBeAttached(model: VMBase | AnyViewModelSimple): void;
/**
* [**Documentation**](https://js2me.github.io/mobx-view-model/api/view-model-store/interface#attachviewmodel)
* @param model - The view model to attach.
* @returns A promise that resolves when the operation is complete.
*/
attach(model: VMBase | AnyViewModelSimple): Promise<void>;
/**
* [**Documentation**](https://js2me.github.io/mobx-view-model/api/view-model-store/interface#detachviewmodelid)
* @param id - The ID of the view model to detach.
* @returns A promise that resolves when the operation is complete.
*/
detach(id: VMBase['id'] | ViewModelSimple['id']): Promise<void>;
/**
* Determines if a view model is able to render based on its ID.
* @param id - The ID of the view model.
* @returns True if the view model can render, false otherwise.
*/
isAbleToRenderView(id: Maybe<VMBase['id']>): boolean;
/**
* Creates a new view model instance based on the provided configuration.
* @param config - The configuration for creating the view model.
* @returns The newly created view model instance.
*/
createViewModel<VM extends VMBase>(config: ViewModelCreateConfig<VM>): VM;
/**
* Process the configuration for creating a view model.
* This method is called just before creating a new view model instance.
* It's useful for initializing the configuration, like linking components to the view model class.
* @param config - The configuration for creating the view model.
*/
processCreateConfig<VM extends VMBase>(config: ViewModelCreateConfig<VM>): void;
/**
* Link React components with view model class.
* @param VM - The view model class to link to.
* @param components - The components to link.
*/
linkComponents(VM: Class<VMBase>, ...components: Maybe<VMComponent<VMBase, any> | VMLazyComponent<VMBase, any>>[]): void;
/**
* Unlink React components with view model class.
* @param components - The components to unlink.
*/
unlinkComponents(...components: Maybe<VMComponent<VMBase, any> | VMLazyComponent<VMBase, any>>[]): void;
/**
* Generates a unique ID for a view model based on the provided configuration.
* @param config - The configuration for generating the ID.
* @returns The generated unique ID.
*/
generateViewModelId<VM extends VMBase>(config: ViewModelGenerateIdConfig<VM>): string;
/**
* Clean up resources associated with the view model store.
* Clean all inner data structures.
*/
clean(): void;
}
type AnyViewModel = ViewModel<any, any>;
type AnyViewModelSimple = ViewModelSimple<any>;
type PayloadCompareFn<TPayload extends AnyObject = AnyObject> = (currentPayload: TPayload | undefined, nextPayload: TPayload) => boolean;
type ViewModelPayload<TViewModel extends AnyViewModel> = TViewModel extends ViewModel<infer Payload, any> ? Payload : never;
type ViewModelParent<TViewModel extends AnyViewModel> = TViewModel extends ViewModel<any, infer Parent> ? Parent : never;
interface ViewModelParams<Payload extends AnyObject = EmptyObject, ParentViewModel extends AnyViewModel | AnyViewModelSimple | null = null, ComponentProps extends AnyObject = AnyObject> {
/**
* Unique identifier for the view
*/
id: string;
payload: Payload;
viewModels?: Maybe<ViewModelStore>;
parentViewModelId?: Maybe<string>;
parentViewModel?: Maybe<ParentViewModel>;
/**
* Additional data that may be useful when creating the VM
*/
ctx?: AnyObject;
/**
* Additional configuration for the view model
* See {@link ViewModelsConfig}
* [**Documentation**](https://js2me.github.io/mobx-view-model/api/view-models/view-models-config)
*/
vmConfig?: ViewModelsRawConfig;
/**
* Original component props
*/
props?: ComponentProps;
}
/**
* The main interface for all view models.
*
* [**Documentation**](https://js2me.github.io/mobx-view-model/api/view-models/interface)
*/
interface ViewModel<Payload extends AnyObject = EmptyObject, ParentViewModel extends AnyViewModel | AnyViewModelSimple | null = null> {
/** [**Documentation**](https://js2me.github.io/mobx-view-model/api/view-models/interface#id-string) */
readonly id: string;
/** [**Documentation**](https://js2me.github.io/mobx-view-model/api/view-models/interface#vmconfig-viewmodelconfig) */
readonly vmConfig: ViewModelsConfig;
/** [**Documentation**](https://js2me.github.io/mobx-view-model/api/view-models/interface#payload-payload) */
readonly payload: Payload;
/** [**Documentation**](https://js2me.github.io/mobx-view-model/api/view-models/interface#ismounted-boolean) */
readonly isMounted: boolean;
/** [**Documentation**](https://js2me.github.io/mobx-view-model/api/view-models/interface#isunmounting-boolean) */
readonly isUnmounting: boolean;
/** [**Documentation**](https://js2me.github.io/mobx-view-model/api/view-models/interface#parentviewmodel-parentviewmodel-null) */
readonly parentViewModel: ParentViewModel;
/** [**Documentation**](https://js2me.github.io/mobx-view-model/api/view-models/interface#willmount-void) */
willMount(): void;
/** [**Documentation**](https://js2me.github.io/mobx-view-model/api/view-models/interface#mount-void-promise-void) */
mount(): void | Promise<void>;
/** [**Documentation**](https://js2me.github.io/mobx-view-model/api/view-models/interface#didmount-void) */
didMount(): void;
/** [**Documentation**](https://js2me.github.io/mobx-view-model/api/view-models/interface#didunmount-void) */
didUnmount(): void;
/** [**Documentation**](https://js2me.github.io/mobx-view-model/api/view-models/interface#willunmount-void) */
willUnmount(): void;
/** [**Documentation**](https://js2me.github.io/mobx-view-model/api/view-models/interface#unmount-void-promise-void) */
unmount(): void | Promise<void>;
/** [**Documentation**](https://js2me.github.io/mobx-view-model/api/view-models/interface#setpayload-payload-payload-void) */
setPayload(payload: Payload): void;
/** [**Documentation**](https://js2me.github.io/mobx-view-model/api/view-models/interface#payloadchanged-payload-payload-prevpayload-payload-void) */
payloadChanged(payload: Payload, prevPayload: Payload): void;
}
declare class ViewModelBase<Payload extends AnyObject = EmptyObject, ParentViewModel extends AnyViewModel | AnyViewModelSimple | null = null, ComponentProps extends AnyObject = AnyObject> implements ViewModel<Payload, ParentViewModel> {
protected vmParams: ViewModelParams<Payload, ParentViewModel, ComponentProps>;
private abortController;
unmountSignal: AbortSignal;
id: string;
private _isMounted;
private _isUnmounting;
private _payload;
vmConfig: ViewModelsConfig;
protected isPayloadEqual?: PayloadCompareFn<Payload>;
protected props: ComponentProps;
constructor(vmParams: ViewModelParams<Payload, ParentViewModel, ComponentProps>);
get payload(): Payload;
protected get viewModels(): ViewModelStore;
get isMounted(): boolean;
get isUnmounting(): boolean;
willUnmount(): void;
/**
* Empty method to be overridden
*/
willMount(): void;
/**
* The method is called when the view starts mounting
*/
mount(): void;
/**
* The method is called when the view was mounted
*/
didMount(): void;
/**
* The method is called when the view starts unmounting
*/
unmount(): void;
/**
* The method is called when the view was unmounted
*/
didUnmount(): void;
/**
* The method is called when the payload of the view model was changed
*
* The state - "was changed" is determined inside the setPayload method
*/
payloadChanged(payload: Payload, prevPayload: Payload): void;
/**
* Returns the parent view model
* For this property to work, the getParentViewModel method is required
*/
get parentViewModel(): ParentViewModel;
/**
* The method is called when the payload changes in the react component
*/
setPayload(payload: Payload): void;
/**
* The method of getting the parent view model
*/
protected getParentViewModel(parentViewModelId: Maybe<string>): ParentViewModel;
}
declare class ViewModelStoreBase<VMBase extends AnyViewModel = AnyViewModel> implements ViewModelStore<VMBase> {
protected config?: ViewModelStoreConfig | undefined;
protected viewModels: Map<string, VMBase | AnyViewModelSimple>;
protected linkedComponentVMClasses: Map<VMComponent<VMBase, any>, Class<VMBase>>;
protected viewModelIdsByClasses: Map<Class<VMBase> | Class<AnyViewModelSimple>, string[]>;
protected instanceAttachedCount: Map<string, number>;
/**
* It is temp heap which is needed to get access to view model instance before all initializations happens
*/
protected viewModelsTempHeap: Map<string, VMBase>;
/**
* Views waiting for mount
*/
protected mountingViews: Set<string>;
/**
* Views waiting for unmount
*/
protected unmountingViews: Set<string>;
protected vmConfig: ViewModelsConfig;
constructor(config?: ViewModelStoreConfig | undefined);
get mountedViewsCount(): number;
processCreateConfig<VM extends VMBase>(config: ViewModelCreateConfig<VM>): void;
createViewModel<VM extends VMBase>(config: ViewModelCreateConfig<VM>): VM;
generateViewModelId<VM extends VMBase>(config: ViewModelGenerateIdConfig<VM>): string;
linkComponents(VM: Class<VMBase>, ...components: Maybe<VMComponent<VMBase, any> | VMLazyComponent<VMBase, any>>[]): void;
unlinkComponents(...components: Maybe<VMComponent<VMBase, any> | VMLazyComponent<VMBase, any>>[]): void;
getIds<T extends VMBase | AnyViewModelSimple>(vmLookup: Maybe<ViewModelLookup<T>>): string[];
getId<T extends VMBase | AnyViewModelSimple>(vmLookup: Maybe<ViewModelLookup<T>>): string | null;
has<T extends VMBase | AnyViewModelSimple>(vmLookup: Maybe<ViewModelLookup<T>>): boolean;
get<T extends VMBase | AnyViewModelSimple>(vmLookup: Maybe<ViewModelLookup<T>>): T | null;
getOrCreateVmId(model: VMBase | AnyViewModelSimple): string;
getAll<T extends VMBase | AnyViewModelSimple>(vmLookup: Maybe<ViewModelLookup<T>>): T[];
mount(model: VMBase | AnyViewModelSimple): Promise<void>;
unmount(model: VMBase | AnyViewModelSimple): Promise<void>;
protected attachVMConstructor(model: VMBase | AnyViewModelSimple): void;
protected dettachVMConstructor(model: VMBase | AnyViewModelSimple): void;
markToBeAttached(model: VMBase | AnyViewModelSimple): void;
attach(model: VMBase | AnyViewModelSimple): Promise<void>;
detach(id: string): Promise<void>;
isAbleToRenderView(id: Maybe<string>): boolean;
clean(): void;
}
interface UseCreateViewModelConfig<TViewModel extends AnyViewModel> extends Pick<ViewModelCreateConfig<TViewModel>, 'vmConfig' | 'ctx' | 'component' | 'props'> {
/**
* Unique identifier for the view
*
* [**Documentation**](https://js2me.github.io/mobx-view-model/react/api/with-view-model.html#id)
*/
id?: Maybe<string>;
/**
* Function to generate an identifier for the view model
*
* [**Documentation**](https://js2me.github.io/mobx-view-model/react/api/with-view-model.html#generateid)
*/
generateId?: ViewModelsConfig<TViewModel>['generateId'];
/**
* Function to create an instance of the VM class
*
* [**Documentation**](https://js2me.github.io/mobx-view-model/react/api/with-view-model.html#factory)
*/
factory?: ViewModelsConfig<TViewModel>['factory'];
}
/**
* Creates new instance of ViewModel
*
* [**Documentation**](https://js2me.github.io/mobx-view-model/react/api/use-create-view-model.html)
*/
declare function useCreateViewModel<TViewModel extends AnyViewModel>(VM: Class<TViewModel>, ...args: IsPartial<TViewModel['payload']> extends true ? [
payload?: TViewModel['payload'],
config?: UseCreateViewModelConfig<TViewModel>
] : [
payload: TViewModel['payload'],
config?: UseCreateViewModelConfig<TViewModel>
]): TViewModel;
/**
* Creates new instance of ViewModelSimple
*
* [**Documentation**](https://js2me.github.io/mobx-view-model/react/api/use-create-view-model.html)
*/
declare function useCreateViewModel<TViewModelSimple extends ViewModelSimple>(VM: Class<TViewModelSimple>, ...args: TViewModelSimple extends ViewModelSimple<infer TPayload> ? IsPartial<TPayload> extends true ? [payload?: TPayload] : [payload: TPayload] : []): TViewModelSimple;
/**
* Creates new instance of ViewModelSimple
*
* [**Documentation**](https://js2me.github.io/mobx-view-model/react/api/use-create-view-model.html)
*/
declare function useCreateViewModel<TViewModelSimple>(VM: Class<TViewModelSimple>): TViewModelSimple;
/**
* Get access to **already created** instance of ViewModel
*
* [**Documentation**](https://js2me.github.io/mobx-view-model/react/api/use-view-model.html)
*/
declare const useViewModel: <T extends AnyViewModel | AnyViewModelSimple>(vmLookup?: ViewModelLookup<T>) => T;
type FixedComponentType<P extends AnyObject = {}> =
/**
* Fixes typings loss with use `withViewModel` with inline function component
*/
((props: P) => React.ReactNode) | React.ComponentClass<P>;
type ExtractReactRef<T> = Defined<T> extends React.ForwardedRef<infer TForwardedRef> ? TForwardedRef : Defined<T> extends React.LegacyRef<infer TRef> ? TRef : T;
/**
* This type is needed to declare prop types for your View component wrapped into `withViewModel` HOC
*
* Use second generic type add typings for `forwardedRef` prop
*/
type ViewModelProps<VM, TForwardedRef = unknown> = IsAny<TForwardedRef> extends true ? {
model: VM;
forwardedRef?: React.ForwardedRef<TForwardedRef>;
} : IsUnknown<TForwardedRef> extends true ? {
model: VM;
} : {
model: VM;
forwardedRef?: React.ForwardedRef<TForwardedRef>;
};
type ViewModelPropsChargedProps<TComponentOriginProps extends AnyObject, TViewModel, TForwardedRef = unknown> = HasKey<TComponentOriginProps, 'ref'> extends true ? Omit<TComponentOriginProps, 'ref'> & ViewModelProps<TViewModel, ExtractReactRef<TComponentOriginProps['ref']>> : HasKey<TComponentOriginProps, 'forwardedRef'> extends true ? TComponentOriginProps : TComponentOriginProps & ViewModelProps<TViewModel, IsUnknown<TForwardedRef> extends true ? any : TForwardedRef>;
type VMInputPayloadPropObj<VM> = VM extends ViewModel<infer TPayload, any> ? TPayload extends EmptyObject ? {} : IsPartial<TPayload> extends true ? {
payload?: TPayload;
} : {
payload: TPayload;
} : VM extends ViewModelSimple<infer TPayload> ? TPayload extends EmptyObject ? {} : IsPartial<TPayload> extends true ? {
payload?: TPayload;
} : {
payload: TPayload;
} : {};
/**
* @deprecated use `VMComponentProps`
*/
type ViewModelInputProps<VM, TForwardedRef = unknown> = VMInputPayloadPropObj<VM> & {
ref?: React.LegacyRef<TForwardedRef>;
};
type WithViewModelReactHook = (allProps: AnyObject, ctx: AnyObject, viewModels: Maybe<ViewModelStore>, ref?: any) => void;
interface ViewModelHocConfig<VM extends AnyViewModel> extends Omit<UseCreateViewModelConfig<VM>, 'component' | 'componentProps'> {
/**
* Component to render if the view model initialization takes too long
*
* [**Documentation**](https://js2me.github.io/mobx-view-model/react/api/with-view-model.html#fallback)
*/
fallback?: React.ComponentType;
/**
* Function to invoke additional React hooks in the resulting component
*
* [**Documentation**](https://js2me.github.io/mobx-view-model/react/api/with-view-model.html#reacthook)
*/
reactHook?: WithViewModelReactHook;
/**
* Function that should return the payload for the VM
* by default, it is - (props) => props.payload
*
* [**Documentation**](https://js2me.github.io/mobx-view-model/react/api/with-view-model.html#getpayload)
*/
getPayload?: (allProps: any) => any;
/**
* Forwards ref using `React.forwardRef` but pass it to props as prop `ref`
*
* [**Documentation**](https://js2me.github.io/mobx-view-model/react/api/with-view-model.html#forwardref)
*/
forwardRef?: boolean;
}
interface ViewModelSimpleHocConfig<_VM> {
/**
* Component to render if the view model initialization takes too long
*
* [**Documentation**](https://js2me.github.io/mobx-view-model/react/api/with-view-model.html#fallback)
*/
fallback?: React.ComponentType;
/**
* Function to invoke additional React hooks in the resulting component
*
* [**Documentation**](https://js2me.github.io/mobx-view-model/react/api/with-view-model.html#reacthook)
*/
reactHook?: WithViewModelReactHook;
/**
* Function that should return the payload for the VM
* by default, it is - (props) => props.payload
*/
getPayload?: (allProps: any) => any;
/**
* Forwards ref using `React.forwardRef` but pass it to props as prop `ref`
*
* [**Documentation**](https://js2me.github.io/mobx-view-model/react/api/with-view-model.html#forwardref)
*/
forwardRef?: boolean;
}
type AllViewModelPropsKeys = keyof Required<ViewModelProps<any, any>>;
type VMComponentProps<TViewModel, TComponentOriginProps extends AnyObject = AnyObject, TForwardedRef = unknown> = Omit<TComponentOriginProps, AllViewModelPropsKeys> & VMInputPayloadPropObj<TViewModel> & (HasKey<TComponentOriginProps, 'ref'> extends true ? {} : HasKey<TComponentOriginProps, 'forwardedRef'> extends true ? Required<TComponentOriginProps>['forwardedRef'] extends React.LegacyRef<any> ? {
ref?: TComponentOriginProps['forwardedRef'];
} : Pick<TComponentOriginProps, 'forwardedRef'> : IsUnknown<TForwardedRef> extends true ? {} : {
ref?: React.LegacyRef<TForwardedRef>;
});
type VMComponent<TViewModel, TComponentOriginProps extends AnyObject = AnyObject, TForwardedRef = unknown> = (props: VMComponentProps<TViewModel, TComponentOriginProps, TForwardedRef>) => React.ReactNode;
/**
* A Higher-Order Component that connects React components to their ViewModels, providing seamless MobX integration.
*
* [**Documentation**](https://js2me.github.io/mobx-view-model/react/api/with-view-model.html)
*/
declare function withViewModel<TViewModel extends AnyViewModel, TComponentOriginProps extends AnyObject = AnyObject, TForwardedRef = unknown>(model: Class<TViewModel>, component: React.ComponentType<ViewModelPropsChargedProps<TComponentOriginProps, TViewModel, TForwardedRef>>, config?: ViewModelHocConfig<TViewModel>): VMComponent<TViewModel, TComponentOriginProps, TForwardedRef>;
/**
* A Higher-Order Component that connects React components to their ViewModels, providing seamless MobX integration.
*
* [**Documentation**](https://js2me.github.io/mobx-view-model/react/api/with-view-model.html)
*/
declare function withViewModel<TViewModel extends AnyViewModel, TForwardedRef = unknown>(model: Class<TViewModel>, config?: ViewModelHocConfig<TViewModel>): <TComponentOriginProps extends AnyObject = ViewModelProps<TViewModel>>(Component?: React.ComponentType<ViewModelPropsChargedProps<TComponentOriginProps, TViewModel, TForwardedRef>>) => VMComponent<TViewModel, TComponentOriginProps, TForwardedRef>;
/**
* A Higher-Order Component that connects React components to their ViewModels, providing seamless MobX integration.
*
* [**Documentation**](https://js2me.github.io/mobx-view-model/react/api/with-view-model.html)
*/
declare function withViewModel<TViewModel, TForwardedRef = unknown>(model: Class<TViewModel>, config?: ViewModelSimpleHocConfig<TViewModel>): <TComponentOriginProps extends AnyObject = ViewModelProps<TViewModel>>(Component?: FixedComponentType<ViewModelPropsChargedProps<TComponentOriginProps, TViewModel, TForwardedRef>>) => VMComponent<TViewModel, TComponentOriginProps, TForwardedRef>;
/**
* A Higher-Order Component that connects React components to their ViewModels, providing seamless MobX integration.
*
* [**Documentation**](https://js2me.github.io/mobx-view-model/react/api/with-view-model.html)
*/
declare function withViewModel<TViewModel extends AnyViewModelSimple, TComponentOriginProps extends AnyObject = AnyObject, TForwardedRef = unknown>(model: Class<TViewModel>, component: FixedComponentType<ViewModelPropsChargedProps<TComponentOriginProps, TViewModel, TForwardedRef>>, config?: ViewModelSimpleHocConfig<TViewModel>): VMComponent<TViewModel, TComponentOriginProps, TForwardedRef>;
/**
* A Higher-Order Component that connects React components to their ViewModels, providing seamless MobX integration.
*
* [**Documentation**](https://js2me.github.io/mobx-view-model/react/api/with-view-model.html)
*/
declare function withViewModel<TViewModel, TComponentOriginProps extends AnyObject = ViewModelProps<TViewModel>, TForwardedRef = unknown>(model: Class<TViewModel>, component: FixedComponentType<ViewModelPropsChargedProps<TComponentOriginProps, TViewModel, TForwardedRef>>, config?: ViewModelSimpleHocConfig<TViewModel>): VMComponent<TViewModel, TComponentOriginProps, TForwardedRef>;
interface ViewModelObservableConfig {
/**
* [**Documentation**](https://js2me.github.io/mobx-view-model/api/view-models/view-models-config.html#disablewrapping)
*/
disableWrapping?: boolean;
/**
* [**Documentation**](https://js2me.github.io/mobx-view-model/api/view-models/view-models-config.html#usedecorators)
*/
useDecorators: boolean;
/**
* [**Documentation**](https://js2me.github.io/mobx-view-model/api/view-models/view-models-config.html#custom-context-annotationsarray)
*/
custom?: (context: AnyObject, annotationsArray: ObservableAnnotationsArray) => void;
}
type GenerateViewModelIdFn = (ctx: AnyObject) => string;
type CreateViewModelFactoryFn<TViewModel extends AnyViewModel = AnyViewModel> = (config: ViewModelCreateConfig<TViewModel>) => TViewModel;
/**
* Configuration options for view models.
* [**Documentation**](https://js2me.github.io/mobx-view-model/api/view-models/view-models-config)
*/
interface ViewModelsConfig<TViewModel extends AnyViewModel = AnyViewModel> {
/** [**Documentation**](https://js2me.github.io/mobx-view-model/api/view-models/view-models-config#startviewtransitions) */
startViewTransitions: {
mount: boolean;
unmount: boolean;
payloadChange: boolean;
};
/** [**Documentation**](https://js2me.github.io/mobx-view-model/api/view-models/view-models-config#comparepayload) */
comparePayload?: PayloadCompareFn | 'strict' | 'shallow' | false;
/** [**Documentation**](https://js2me.github.io/mobx-view-model/api/view-models/view-models-config#payloadobservable) */
payloadObservable?: 'ref' | 'deep' | 'shallow' | 'struct' | false;
/** [**Documentation**](https://js2me.github.io/mobx-view-model/api/view-models/view-models-config#payloadcomputed) */
payloadComputed?: 'struct' | boolean | ((a: any, b: any) => boolean);
/** [**Documentation**](https://js2me.github.io/mobx-view-model/api/view-models/view-models-config#generateid) */
generateId: GenerateViewModelIdFn;
/** [**Documentation**](https://js2me.github.io/mobx-view-model/api/view-models/view-models-config#factory) */
factory: CreateViewModelFactoryFn<TViewModel>;
/** [**Documentation**](https://js2me.github.io/mobx-view-model/api/view-models/view-models-config#fallbackcomponent) */
fallbackComponent?: React.ComponentType;
/** [**Documentation**](https://js2me.github.io/mobx-view-model/api/view-models/view-models-config#onmount) */
onMount?: (viewModel: TViewModel) => void;
/** [**Documentation**](https://js2me.github.io/mobx-view-model/api/view-models/view-models-config#onunmount) */
onUnmount?: (viewModel: TViewModel) => void;
/** [**Documentation**](https://js2me.github.io/mobx-view-model/api/view-models/view-models-config#hooks) */
readonly hooks: {
/** [**Documentation**](https://js2me.github.io/mobx-view-model/api/view-models/view-models-config#hooks) */
readonly storeCreate: PubSub<[
viewModelStore: ViewModelStore<AnyViewModel>
]>;
};
processViewComponent?: (component: React.ComponentType<any> | undefined, VM: Class<TViewModel>, config: ViewModelHocConfig<any>) => Maybe<React.ComponentType<any>>;
/** [**Documentation**](https://js2me.github.io/mobx-view-model/api/view-models/view-models-config#wrapviewsinobserver) */
wrapViewsInObserver?: boolean;
/** [**Documentation**](https://js2me.github.io/mobx-view-model/api/view-models/view-models-config#observable) */
observable: {
viewModels: ViewModelObservableConfig;
viewModelStores: ViewModelObservableConfig;
};
}
/**
* [**Documentation**](https://js2me.github.io/mobx-view-model/api/view-models/view-models-config)
*/
type ViewModelsRawConfig<TViewModel extends AnyViewModel = AnyViewModel> = Omit<ViewModelsConfig<TViewModel>, 'startViewTransitions' | 'observable' | 'factory' | 'generateId' | 'hooks'> & {
startViewTransitions?: DeepPartial<ViewModelsConfig['startViewTransitions']> | boolean;
observable?: DeepPartial<ViewModelsConfig['observable']>;
factory?: ViewModelsConfig['factory'];
generateId?: ViewModelsConfig['generateId'];
};
/**
* Global configuration options for view models
*/
declare const viewModelsConfig: ViewModelsConfig<AnyViewModel>;
declare const applyObservable: (context: AnyObject, annotationsArray: ObservableAnnotationsArray, observableConfig: ViewModelObservableConfig) => void;
/**
* [**Documentation**](https://js2me.github.io/mobx-view-model/api/view-models/view-models-config)
*/
declare const mergeVMConfigs: (...configs: Maybe<ViewModelsRawConfig>[]) => ViewModelsConfig<AnyViewModel>;
declare const generateVmId: GenerateViewModelIdFn;
declare const isViewModel: <TPayload extends AnyObject = EmptyObject, ParentViewModel extends AnyViewModel | AnyViewModelSimple | null = null>(value: AnyObject) => value is ViewModel<TPayload, ParentViewModel>;
declare const isViewModelClass: <TPayload extends AnyObject = EmptyObject, ParentViewModel extends AnyViewModel | AnyViewModelSimple | null = null>(value: Function) => value is Class<ViewModel<TPayload, ParentViewModel>>;
declare const isViewModeSimpleClass: <TPayload extends AnyObject = EmptyObject, ParentViewModel extends AnyViewModel | AnyViewModelSimple | null = null>(value: Function) => value is Class<ViewModelSimple<TPayload, ParentViewModel>>;
/**
* This is a provider for the `ActiveViewModelContext`.
* This HOC is not recommended for public usage.
* Better to use `withViewModel` HOC.
*/
declare const ActiveViewModelProvider: React.ComponentType<{
value: AnyViewModel | AnyViewModelSimple;
children?: ReactNode;
}>;
type OnlyViewModelProps<TViewModel extends AnyViewModel> = {
model: Class<TViewModel>;
children?: ReactNode | ((model: TViewModel) => ReactNode);
} & (IsPartial<TViewModel['payload']> extends true ? {
payload?: TViewModel['payload'];
config?: UseCreateViewModelConfig<TViewModel>;
} : {
payload: TViewModel['payload'];
config?: UseCreateViewModelConfig<TViewModel>;
});
declare const OnlyViewModel: (<TViewModel extends AnyViewModel>({ model, config, payload, children, }: OnlyViewModelProps<TViewModel>) => string | number | boolean | Iterable<ReactNode> | react_jsx_runtime.JSX.Element | null | undefined) & {
displayName: string;
};
declare const ViewModelsProvider: React.ComponentType<{
value: ViewModelStore;
children?: ReactNode;
}>;
declare const ActiveViewModelContext: react.Context<AnyViewModel | AnyViewModelSimple>;
/**
* Context which contains the view models store instance.
* This context is used to access the view models store inside the React components.
* @see {@link ViewModelStore}
*/
declare const ViewModelsContext: react.Context<ViewModelStore<AnyViewModel>>;
export { ActiveViewModelContext, ActiveViewModelProvider, OnlyViewModel, ViewModelBase, ViewModelStoreBase, ViewModelsContext, ViewModelsProvider, applyObservable, generateVmId, isViewModeSimpleClass, isViewModel, isViewModelClass, mergeVMConfigs, useCreateViewModel, useViewModel, viewModelsConfig, withLazyViewModel, withViewModel };
export type { AllViewModelPropsKeys, AnyViewModel, AnyViewModelSimple, CreateViewModelFactoryFn, ExtractReactRef, GenerateViewModelIdFn, LazyViewAndModel, LazyViewModelHocConfig, LazyViewModelSimpleHocConfig, OnlyViewModelProps, PayloadCompareFn, UseCreateViewModelConfig, VMComponent, VMComponentProps, VMLazyComponent, ViewModel, ViewModelCreateConfig, ViewModelGenerateIdConfig, ViewModelHocConfig, ViewModelInputProps, ViewModelLookup, ViewModelObservableConfig, ViewModelParams, ViewModelParent, ViewModelPayload, ViewModelProps, ViewModelSimple, ViewModelSimpleHocConfig, ViewModelStore, ViewModelStoreConfig, ViewModelsConfig, ViewModelsRawConfig, WithViewModelReactHook };