Skip to content

Commit aa55f1d

Browse files
committed
feat: add invalidateQueries parameter for MobxMutation
1 parent 4fbadbf commit aa55f1d

File tree

2 files changed

+40
-2
lines changed

2 files changed

+40
-2
lines changed

src/mobx-mutation.ts

Lines changed: 28 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,10 @@ import {
99
import { LinkedAbortController } from 'linked-abort-controller';
1010
import { action, makeObservable, observable, reaction } from 'mobx';
1111

12-
import { MobxMutationConfig } from './mobx-mutation.types';
12+
import {
13+
MobxMutationConfig,
14+
MobxMutationInvalidateQueriesOptions,
15+
} from './mobx-mutation.types';
1316
import { MobxQueryClient, MobxQueryClientHooks } from './mobx-query-client';
1417

1518
export class MobxMutation<
@@ -33,7 +36,7 @@ export class MobxMutation<
3336
constructor(
3437
protected config: MobxMutationConfig<TData, TVariables, TError, TContext>,
3538
) {
36-
const { queryClient, ...restOptions } = config;
39+
const { queryClient, invalidateQueries, ...restOptions } = config;
3740
this.abortController = new LinkedAbortController(config.abortSignal);
3841
this.queryClient = queryClient;
3942
this.result = undefined as any;
@@ -76,6 +79,29 @@ export class MobxMutation<
7679
}
7780
});
7881

82+
if (invalidateQueries) {
83+
this.onDone((data, payload) => {
84+
let invalidateOptions: MobxMutationInvalidateQueriesOptions;
85+
86+
if (typeof invalidateQueries === 'function') {
87+
invalidateOptions = invalidateQueries(data, payload);
88+
} else {
89+
invalidateOptions = invalidateQueries;
90+
}
91+
92+
if (invalidateOptions.queryKeys?.length) {
93+
invalidateOptions.queryKeys?.forEach((queryKey) => {
94+
this.queryClient.invalidateQueries({
95+
...invalidateOptions,
96+
queryKey,
97+
});
98+
});
99+
} else {
100+
this.queryClient.invalidateQueries(invalidateOptions);
101+
}
102+
});
103+
}
104+
79105
config.onInit?.(this);
80106
this.hooks?.onMutationInit?.(this);
81107
}

src/mobx-mutation.types.ts

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
import {
22
DefaultError,
3+
InvalidateQueryFilters,
34
MutationObserverOptions,
45
QueryClient,
56
} from '@tanstack/query-core';
@@ -22,6 +23,11 @@ export interface MobxMutationFeatures {
2223
resetOnDestroy?: boolean;
2324
}
2425

26+
export interface MobxMutationInvalidateQueriesOptions
27+
extends Omit<InvalidateQueryFilters, 'queryKey'> {
28+
queryKeys?: InvalidateQueryFilters['queryKey'][];
29+
}
30+
2531
export interface MobxMutationConfig<
2632
TData = unknown,
2733
TVariables = void,
@@ -38,6 +44,12 @@ export interface MobxMutationConfig<
3844
*/
3945
disposer?: IDisposer;
4046
abortSignal?: AbortSignal;
47+
invalidateQueries?:
48+
| MobxMutationInvalidateQueriesOptions
49+
| ((
50+
data: TData,
51+
payload: TVariables,
52+
) => MobxMutationInvalidateQueriesOptions);
4153
onInit?: (
4254
mutation: MobxMutation<TData, TVariables, TError, TContext>,
4355
) => void;

0 commit comments

Comments
 (0)