UNPKG

mobx-view-model

Version:

⚡ Clean MVVM for React + MobX | Powerful ViewModels made simple ⚡

650 lines (626 loc) 35.7 kB
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 };