Skip to content

Commit 3a35c12

Browse files
committed
feat: add hooks property for viewModelsConfig
1 parent ef6710d commit 3a35c12

File tree

6 files changed

+64
-41
lines changed

6 files changed

+64
-41
lines changed

.changeset/silly-badgers-begin.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
---
2+
"mobx-view-model": minor
3+
---
4+
5+
added `hooks` parameter for `viewModelsConfig`

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -51,7 +51,7 @@
5151
},
5252
"dependencies": {
5353
"react-simple-loadable": "^2.3.9",
54-
"yummies": "^6.0.0"
54+
"yummies": "^6.1.1"
5555
},
5656
"peerDependencies": {
5757
"mobx": "^6.12.4",

pnpm-lock.yaml

Lines changed: 5 additions & 5 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

src/config/global-config.ts

Lines changed: 32 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,42 @@
1-
import { createGlobalConfig } from 'yummies/complex';
1+
import { createGlobalConfig, createPubSub } from 'yummies/complex';
22
import { generateVmId } from '../utils/generate-vm-id.js';
3+
import type { ViewModelStore } from '../view-model/view-model.store.js';
34
import type { ViewModelsConfig } from './types.js';
45
import { mergeVMConfigs } from './utils/merge-vm-configs.js';
56

67
/**
78
* Global configuration options for view models
89
*/
9-
export const viewModelsConfig = createGlobalConfig<ViewModelsConfig>({
10-
comparePayload: false,
11-
payloadComputed: 'struct',
12-
payloadObservable: 'ref',
13-
wrapViewsInObserver: true,
14-
startViewTransitions: {
15-
mount: false,
16-
payloadChange: false,
17-
unmount: false,
18-
},
19-
observable: {
20-
viewModels: {
21-
useDecorators: true,
10+
export const viewModelsConfig = createGlobalConfig<ViewModelsConfig>(
11+
{
12+
comparePayload: false,
13+
payloadComputed: 'struct',
14+
payloadObservable: 'ref',
15+
wrapViewsInObserver: true,
16+
startViewTransitions: {
17+
mount: false,
18+
payloadChange: false,
19+
unmount: false,
2220
},
23-
viewModelStores: {
24-
useDecorators: true,
21+
observable: {
22+
viewModels: {
23+
useDecorators: true,
24+
},
25+
viewModelStores: {
26+
useDecorators: true,
27+
},
28+
},
29+
generateId: generateVmId,
30+
factory: (config) => {
31+
const VM = config.VM;
32+
return new VM({
33+
...config,
34+
vmConfig: mergeVMConfigs(config.vmConfig),
35+
});
36+
},
37+
hooks: {
38+
storeCreate: createPubSub<[ViewModelStore]>(),
2539
},
2640
},
27-
generateId: generateVmId,
28-
factory: (config) => {
29-
const VM = config.VM;
30-
return new VM({
31-
...config,
32-
vmConfig: mergeVMConfigs(config.vmConfig),
33-
});
34-
},
35-
});
41+
Symbol.for('VIEW_MODELS_CONFIG'),
42+
);

src/config/types.ts

Lines changed: 19 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1+
import type { PubSub } from 'yummies/complex';
12
import type { AnyObject, Class, DeepPartial, Maybe } from 'yummies/types';
2-
33
import type { ViewModelHocConfig } from '../hoc/with-view-model.js';
44
import type {
55
AnyViewModel,
66
PayloadCompareFn,
77
ViewModelCreateConfig,
8+
ViewModelStore,
89
} from '../view-model/index.js';
9-
1010
import type { ObservableAnnotationsArray } from './utils/apply-observable.js';
1111

1212
export interface ViewModelObservableConfig {
@@ -37,7 +37,9 @@ export type CreateViewModelFactoryFn<
3737
* Configuration options for view models.
3838
* [**Documentation**](https://js2me.github.io/mobx-view-model/api/view-models/view-models-config)
3939
*/
40-
export interface ViewModelsConfig<VM extends AnyViewModel = AnyViewModel> {
40+
export interface ViewModelsConfig<
41+
TViewModel extends AnyViewModel = AnyViewModel,
42+
> {
4143
/** [**Documentation**](https://js2me.github.io/mobx-view-model/api/view-models/view-models-config#startviewtransitions) */
4244
startViewTransitions: {
4345
mount: boolean;
@@ -53,17 +55,22 @@ export interface ViewModelsConfig<VM extends AnyViewModel = AnyViewModel> {
5355
/** [**Documentation**](https://js2me.github.io/mobx-view-model/api/view-models/view-models-config#generateid) */
5456
generateId: GenerateViewModelIdFn;
5557
/** [**Documentation**](https://js2me.github.io/mobx-view-model/api/view-models/view-models-config#factory) */
56-
factory: CreateViewModelFactoryFn<VM>;
58+
factory: CreateViewModelFactoryFn<TViewModel>;
5759
/** [**Documentation**](https://js2me.github.io/mobx-view-model/api/view-models/view-models-config#fallbackcomponent) */
5860
fallbackComponent?: React.ComponentType;
5961
/** [**Documentation**](https://js2me.github.io/mobx-view-model/api/view-models/view-models-config#onmount) */
60-
onMount?: (viewModel: VM) => void;
62+
onMount?: (viewModel: TViewModel) => void;
6163
/** [**Documentation**](https://js2me.github.io/mobx-view-model/api/view-models/view-models-config#onunmount) */
62-
onUnmount?: (viewModel: VM) => void;
64+
onUnmount?: (viewModel: TViewModel) => void;
6365
/** [**Documentation**](https://js2me.github.io/mobx-view-model/api/view-models/view-models-config#processviewcomponent) */
66+
readonly hooks: {
67+
readonly storeCreate: PubSub<
68+
[viewModelStore: ViewModelStore<AnyViewModel>]
69+
>;
70+
};
6471
processViewComponent?: (
6572
component: React.ComponentType<any> | undefined,
66-
VM: Class<VM>,
73+
VM: Class<TViewModel>,
6774
config: ViewModelHocConfig<any>,
6875
) => Maybe<React.ComponentType<any>>;
6976
/** [**Documentation**](https://js2me.github.io/mobx-view-model/api/view-models/view-models-config#wrapviewsinobserver) */
@@ -78,9 +85,11 @@ export interface ViewModelsConfig<VM extends AnyViewModel = AnyViewModel> {
7885
/**
7986
* [**Documentation**](https://js2me.github.io/mobx-view-model/api/view-models/view-models-config)
8087
*/
81-
export type ViewModelsRawConfig = Omit<
82-
ViewModelsConfig,
83-
'startViewTransitions' | 'observable' | 'factory' | 'generateId'
88+
export type ViewModelsRawConfig<
89+
TViewModel extends AnyViewModel = AnyViewModel,
90+
> = Omit<
91+
ViewModelsConfig<TViewModel>,
92+
'startViewTransitions' | 'observable' | 'factory' | 'generateId' | 'hooks'
8493
> & {
8594
startViewTransitions?:
8695
| DeepPartial<ViewModelsConfig['startViewTransitions']>

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

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -76,6 +76,8 @@ export class ViewModelStoreBase<VMBase extends AnyViewModel = AnyViewModel>
7676
],
7777
this.vmConfig.observable.viewModelStores,
7878
);
79+
80+
this.vmConfig.hooks.storeCreate(this as ViewModelStore);
7981
}
8082

8183
get mountedViewsCount() {

0 commit comments

Comments
 (0)