Skip to content

Commit 0aaafcd

Browse files
committed
add imperative function for mutation builder
1 parent 6bb1e39 commit 0aaafcd

File tree

2 files changed

+27
-14
lines changed

2 files changed

+27
-14
lines changed

examples/vite/src/App.tsx

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,6 @@ function App() {
6464
const [postId, setPostId] = useState<number | null>(null);
6565

6666
const posts = postsQuery.useQuery({}, { enabled: !postId });
67-
const deletePost = deletePostMutation.useMutation();
6867
const reset = resetMutation.useMutation();
6968

7069
const deleteMutations = deletePostMutation.useAllMutations();
@@ -102,8 +101,8 @@ function App() {
102101
</a>
103102

104103
<button
105-
onClick={() => deletePost.mutateAsync({ params: { id: post.id } })}
106-
disabled={deletePost.isPending}
104+
onClick={() => deletePostMutation.mutate({ params: { id: post.id } })}
105+
disabled={deletePostMutation.isMutating() > 0}
107106
>
108107
Delete
109108
</button>

src/builder/MutationBuilder.ts

Lines changed: 25 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ import {
22
MutationFilters,
33
MutationFunction,
44
MutationKey,
5+
MutationObserver,
56
MutationState,
67
QueryClient,
78
UseMutationOptions,
@@ -134,24 +135,37 @@ export class MutationBuilderFrozen<T extends BuilderTypeTemplate> {
134135
return useMutationState({ filters: this.getMutationFilters(vars, filters) }, this.config.queryClient)[0];
135136
};
136137

137-
private _client?: MutationBuilderClient<T>;
138-
get client() {
139-
return (this._client ??= new MutationBuilderClient(this));
140-
}
138+
readonly getMutation = (
139+
vars?: T['vars'],
140+
filters?: MutationFilters<T['data'], T['error'], T['vars']>,
141+
queryClient?: QueryClient,
142+
) => {
143+
const client = queryClient || this.config.queryClient!;
144+
return client.getMutationCache().find(this.getMutationFilters(vars, filters));
145+
};
146+
147+
readonly isMutating = (
148+
vars?: T['vars'],
149+
filters?: MutationFilters<T['data'], T['error'], T['vars']>,
150+
queryClient?: QueryClient,
151+
) => {
152+
const client = queryClient || this.config.queryClient!;
153+
return client.isMutating(this.getMutationFilters(vars, filters));
154+
};
155+
156+
readonly mutate = async (vars: T['vars'], opts?: MutationBuilderConfig<T>['options'], queryClient?: QueryClient) => {
157+
const client = queryClient || this.config.queryClient!;
158+
const options = this.getMutationOptions(client, opts);
159+
const observer = new MutationObserver<T['data'], T['error'], T['vars']>(client, options);
160+
return observer.mutate(vars, options).finally(() => observer.reset());
161+
};
141162
}
142163

143164
export type MutationStateHelper<T extends BuilderTypeTemplate> = {
144165
list: MutationState<T['data'], T['error'], T['vars']>[];
145166
getMutation(vars: T['vars']): MutationState<T['data'], T['error'], T['vars']> | undefined;
146167
};
147168

148-
class MutationBuilderClient<T extends BuilderTypeTemplate> {
149-
constructor(private builder: MutationBuilderFrozen<T>) {}
150-
151-
readonly isMutating = (vars: T['vars'], filters?: MutationFilters<T['data'], T['error'], T['vars']>) =>
152-
this.builder.config.queryClient?.isMutating(this.builder.getMutationFilters(vars, filters));
153-
}
154-
155169
export class MutationBuilder<T extends BuilderTypeTemplate = BuilderTypeTemplate> extends MutationBuilderFrozen<T> {
156170
withVars<TVars = T['vars'], const TReset extends boolean = false>(
157171
vars?: TVars,

0 commit comments

Comments
 (0)