Skip to content

Commit 8ffe4eb

Browse files
committed
fix: use React namespace for react typings
1 parent 2910a45 commit 8ffe4eb

File tree

7 files changed

+34
-32
lines changed

7 files changed

+34
-32
lines changed

.changeset/shiny-peaches-hope.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"mobx-view-model": patch
3+
---
4+
5+
use `React.*` global namespace to fix most typing bugs with React (18->19)
Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,9 @@
1-
import type { ComponentType, ReactNode } from 'react';
1+
import type { ReactNode } from 'react';
22
import { ViewModelsContext } from '../contexts/index.js';
33
import type { ViewModelStore } from '../view-model/index.js';
44

55
export const ViewModelsProvider =
6-
ViewModelsContext.Provider as unknown as ComponentType<{
6+
ViewModelsContext.Provider as unknown as React.ComponentType<{
77
value: ViewModelStore;
88
children?: ReactNode;
99
}>;

src/config/types.ts

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import type { ComponentType } from 'react';
21
import type { AnyObject, Class, DeepPartial, Maybe } from 'yummies/utils/types';
32

43
import type { ViewModelHocConfig } from '../hoc/with-view-model.js';
@@ -56,17 +55,17 @@ export interface ViewModelsConfig {
5655
/** [**Documentation**](https://js2me.github.io/mobx-view-model/api/view-models/view-models-config#factory) */
5756
factory: CreateViewModelFactoryFn<AnyViewModel>;
5857
/** [**Documentation**](https://js2me.github.io/mobx-view-model/api/view-models/view-models-config#fallbackcomponent) */
59-
fallbackComponent?: ComponentType;
58+
fallbackComponent?: React.ComponentType;
6059
/** [**Documentation**](https://js2me.github.io/mobx-view-model/api/view-models/view-models-config#onmount) */
6160
onMount?: (viewModel: AnyViewModel) => void;
6261
/** [**Documentation**](https://js2me.github.io/mobx-view-model/api/view-models/view-models-config#onunmount) */
6362
onUnmount?: (viewModel: AnyViewModel) => void;
6463
/** [**Documentation**](https://js2me.github.io/mobx-view-model/api/view-models/view-models-config#processviewcomponent) */
6564
processViewComponent?: (
66-
component: ComponentType<any> | undefined,
65+
component: React.ComponentType<any> | undefined,
6766
VM: Class<AnyViewModel>,
6867
config: ViewModelHocConfig<any>,
69-
) => Maybe<ComponentType<any>>;
68+
) => Maybe<React.ComponentType<any>>;
7069
/** [**Documentation**](https://js2me.github.io/mobx-view-model/api/view-models/view-models-config#wrapviewsinobserver) */
7170
wrapViewsInObserver?: boolean;
7271
/** [**Documentation**](https://js2me.github.io/mobx-view-model/api/view-models/view-models-config#observable) */

src/hoc/with-lazy-view-model.tsx

Lines changed: 6 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import type { ComponentProps, ComponentType } from 'react';
21
import {
32
type LoadableConfig,
43
type LoadableMixin,
@@ -18,16 +17,16 @@ import {
1817

1918
export interface LazyViewAndModel<
2019
TViewModel extends AnyViewModel | AnyViewModelSimple,
21-
TView extends ComponentType<any>,
20+
TView extends React.ComponentType<any>,
2221
> {
2322
Model: Class<TViewModel> | PackedAsyncModule<Class<TViewModel>>;
2423
View?: TView | PackedAsyncModule<TView>;
2524
}
2625

2726
export type VMLazyComponent<
2827
TViewModel extends AnyViewModel | AnyViewModelSimple,
29-
TView extends ComponentType<any>,
30-
> = VMComponent<TViewModel, ComponentProps<TView>> & LoadableMixin;
28+
TView extends React.ComponentType<any>,
29+
> = VMComponent<TViewModel, React.ComponentProps<TView>> & LoadableMixin;
3130

3231
export interface LazyViewModelHocConfig<TViewModel extends AnyViewModel>
3332
extends ViewModelHocConfig<TViewModel>,
@@ -45,7 +44,7 @@ export interface LazyViewModelSimpleHocConfig<
4544
*/
4645
export function withLazyViewModel<
4746
TViewModel extends AnyViewModel,
48-
TView extends ComponentType<any>,
47+
TView extends React.ComponentType<any>,
4948
>(
5049
loadFunction: () => MaybePromise<LazyViewAndModel<TViewModel, TView>>,
5150
configOrFallbackComponent?:
@@ -60,7 +59,7 @@ export function withLazyViewModel<
6059
*/
6160
export function withLazyViewModel<
6261
TViewModel extends AnyViewModelSimple,
63-
TView extends ComponentType<any>,
62+
TView extends React.ComponentType<any>,
6463
>(
6564
loadFunction: () => MaybePromise<LazyViewAndModel<TViewModel, TView>>,
6665
configOrFallbackComponent?:
@@ -75,7 +74,7 @@ export function withLazyViewModel<
7574
*/
7675
export function withLazyViewModel<
7776
TViewModel extends AnyViewModel | AnyViewModelSimple,
78-
TView extends ComponentType<any>,
77+
TView extends React.ComponentType<any>,
7978
>(
8079
loadFunction: () => MaybePromise<LazyViewAndModel<TViewModel, TView>>,
8180
configOrFallbackComponent?:

src/hoc/with-view-model.test.tsx

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ import {
88
import { comparer, makeObservable, observable, runInAction } from 'mobx';
99
import { observer } from 'mobx-react-lite';
1010
import {
11-
type ComponentType,
1211
type PropsWithChildren,
1312
type ReactNode,
1413
useEffect,
@@ -338,7 +337,7 @@ describe('withViewModel', () => {
338337

339338
const vmConnectedComponentViewRenderSpy = vi.fn();
340339

341-
let VMConnectedComponentView: ComponentType<ViewModelProps<VM>> = ({
340+
let VMConnectedComponentView: React.ComponentType<ViewModelProps<VM>> = ({
342341
model,
343342
}: ViewModelProps<VM>) => {
344343
vmConnectedComponentViewRenderSpy();

src/hoc/with-view-model.tsx

Lines changed: 15 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,5 @@
11
import { observer } from 'mobx-react-lite';
2-
import {
3-
type ComponentClass,
4-
type ComponentType,
5-
type ReactNode,
6-
useContext,
7-
} from 'react';
2+
import { useContext } from 'react';
83
import type {
94
AnyObject,
105
Class,
@@ -33,7 +28,7 @@ type FixedComponentType<P extends AnyObject = {}> =
3328
/**
3429
* Fixes typings loss with use `withViewModel` with inline function component
3530
*/
36-
((props: P) => ReactNode) | ComponentClass<P>;
31+
((props: P) => React.ReactNode) | React.ComponentClass<P>;
3732

3833
declare const process: { env: { NODE_ENV?: string } };
3934

@@ -68,7 +63,7 @@ export interface ViewModelHocConfig<VM extends AnyViewModel>
6863
/**
6964
* Component to render if the view model initialization takes too long
7065
*/
71-
fallback?: ComponentType;
66+
fallback?: React.ComponentType;
7267

7368
/**
7469
* Function to invoke additional React hooks in the resulting component
@@ -90,7 +85,7 @@ export interface ViewModelSimpleHocConfig<_VM> {
9085
/**
9186
* Component to render if the view model initialization takes too long
9287
*/
93-
fallback?: ComponentType;
88+
fallback?: React.ComponentType;
9489

9590
/**
9691
* Function to invoke additional React hooks in the resulting component
@@ -116,7 +111,9 @@ export type VMComponentProps<
116111
export type VMComponent<
117112
TViewModel,
118113
TComponentOriginProps extends AnyObject = ViewModelProps<TViewModel>,
119-
> = (props: VMComponentProps<TViewModel, TComponentOriginProps>) => ReactNode;
114+
> = (
115+
props: VMComponentProps<TViewModel, TComponentOriginProps>,
116+
) => React.ReactNode;
120117

121118
/**
122119
* A Higher-Order Component that connects React components to their ViewModels, providing seamless MobX integration.
@@ -128,7 +125,9 @@ export function withViewModel<
128125
TComponentOriginProps extends AnyObject = ViewModelProps<TViewModel>,
129126
>(
130127
model: Class<TViewModel>,
131-
component: ComponentType<TComponentOriginProps & ViewModelProps<TViewModel>>,
128+
component: React.ComponentType<
129+
TComponentOriginProps & ViewModelProps<TViewModel>
130+
>,
132131
config?: ViewModelHocConfig<TViewModel>,
133132
): VMComponent<TViewModel, TComponentOriginProps>;
134133

@@ -141,7 +140,9 @@ export function withViewModel<TViewModel extends AnyViewModel>(
141140
model: Class<TViewModel>,
142141
config?: ViewModelHocConfig<TViewModel>,
143142
): <TComponentOriginProps extends AnyObject = ViewModelProps<TViewModel>>(
144-
Component?: ComponentType<TComponentOriginProps & ViewModelProps<TViewModel>>,
143+
Component?: React.ComponentType<
144+
TComponentOriginProps & ViewModelProps<TViewModel>
145+
>,
145146
) => VMComponent<TViewModel, TComponentOriginProps>;
146147

147148
/**
@@ -228,7 +229,7 @@ export function withViewModel(
228229
},
229230
};
230231

231-
return (Component: ComponentType<any>) =>
232+
return (Component: React.ComponentType<any>) =>
232233
withViewModelWrapper(VM, finalConfig, Component);
233234
}
234235
}
@@ -238,7 +239,7 @@ const REACT_MEMO_SYMBOL = Symbol.for('react.memo');
238239
const withViewModelWrapper = (
239240
VM: Class<any>,
240241
config: ViewModelHocConfig<any>,
241-
OriginalComponent?: ComponentType<any>,
242+
OriginalComponent?: React.ComponentType<any>,
242243
) => {
243244
const processViewComponent =
244245
config.vmConfig?.processViewComponent ??

src/view-model/view-model.store.types.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
import type { ComponentType } from 'react';
21
import type { AnyObject, Class, Maybe } from 'yummies/utils/types';
32
import type { ViewModelsRawConfig } from '../config/index.js';
43
import type { VMComponent, VMLazyComponent } from '../hoc/index.js';
@@ -21,13 +20,13 @@ export interface ViewModelGenerateIdConfig<VM extends AnyViewModel> {
2120
id?: Maybe<string>;
2221
ctx: AnyObject;
2322
parentViewModelId: string | null;
24-
fallback?: ComponentType;
23+
fallback?: React.ComponentType;
2524
}
2625

2726
export interface ViewModelCreateConfig<VM extends AnyViewModel>
2827
extends ViewModelParams<VM['payload'], VM['parentViewModel']> {
2928
VM: Class<VM>;
30-
fallback?: ComponentType;
29+
fallback?: React.ComponentType;
3130
component?: VMComponent<AnyViewModel, any>;
3231
props?: AnyObject;
3332
}

0 commit comments

Comments
 (0)