Skip to content

Commit cad5198

Browse files
authored
Merge pull request #11139 from marmelab/fix-on-settled
Fix `onSettled` call when provided in hook time options
2 parents e89d57c + 4912a4e commit cad5198

6 files changed

Lines changed: 128 additions & 29 deletions

File tree

packages/ra-core/src/dataProvider/useCreate.spec.tsx

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,33 @@ describe('useCreate', () => {
144144
});
145145
});
146146

147+
it('calls onSettled when provided in hook time options', async () => {
148+
const dataProvider = testDataProvider({
149+
create: jest.fn(() => Promise.resolve({ data: { id: 1 } } as any)),
150+
});
151+
let localCreate;
152+
const onSettled = jest.fn();
153+
const Dummy = () => {
154+
const [create] = useCreate(
155+
'foo',
156+
{ data: { bar: 'baz' } },
157+
{ onSettled }
158+
);
159+
localCreate = create;
160+
return <span />;
161+
};
162+
163+
render(
164+
<CoreAdminContext dataProvider={dataProvider}>
165+
<Dummy />
166+
</CoreAdminContext>
167+
);
168+
localCreate('foo', { data: { foo: 456 } });
169+
await waitFor(() => {
170+
expect(onSettled).toHaveBeenCalled();
171+
});
172+
});
173+
147174
it('accepts a meta parameter', async () => {
148175
const dataProvider = testDataProvider({
149176
create: jest.fn(() => Promise.resolve({ data: { id: 1 } } as any)),

packages/ra-core/src/dataProvider/useCreate.ts

Lines changed: 11 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -93,6 +93,7 @@ export const useCreate = <
9393
const {
9494
mutationMode = 'pessimistic',
9595
getMutateWithMiddlewares,
96+
onSettled,
9697
...mutationOptions
9798
} = options;
9899

@@ -205,16 +206,17 @@ export const useCreate = <
205206
exact: true,
206207
});
207208
},
208-
onSettled: (
209-
result,
210-
error,
211-
variables,
212-
context: { snapshot: Snapshot }
213-
) => {
209+
onSettled: (...args) => {
210+
const [, , , mutateResult] = args;
211+
214212
// For creation, we always refetch after error or success:
215-
context.snapshot.forEach(([queryKey]) => {
216-
queryClient.invalidateQueries({ queryKey });
217-
});
213+
(mutateResult as { snapshot: Snapshot }).snapshot.forEach(
214+
([queryKey]) => {
215+
queryClient.invalidateQueries({ queryKey });
216+
}
217+
);
218+
219+
onSettled?.(...args);
218220
},
219221
}
220222
);

packages/ra-core/src/dataProvider/useDelete.spec.tsx

Lines changed: 33 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,39 @@ describe('useDelete', () => {
207207
});
208208
});
209209

210+
it('calls onSettled when provided in hook time options', async () => {
211+
const dataProvider = testDataProvider({
212+
delete: jest.fn(() => Promise.resolve({ data: { id: 1 } } as any)),
213+
});
214+
let localDeleteOne;
215+
const onSettled = jest.fn();
216+
const Dummy = () => {
217+
const [deleteOne] = useDelete(
218+
'foo',
219+
{
220+
id: 1,
221+
previousData: { id: 1, bar: 'bar' },
222+
},
223+
{ onSettled }
224+
);
225+
localDeleteOne = deleteOne;
226+
return <span />;
227+
};
228+
229+
render(
230+
<CoreAdminContext dataProvider={dataProvider}>
231+
<Dummy />
232+
</CoreAdminContext>
233+
);
234+
localDeleteOne('foo', {
235+
id: 1,
236+
previousData: { foo: 456 },
237+
});
238+
await waitFor(() => {
239+
expect(onSettled).toHaveBeenCalled();
240+
});
241+
});
242+
210243
it('accepts a meta parameter', async () => {
211244
const dataProvider = testDataProvider({
212245
delete: jest.fn(() => Promise.resolve({ data: { id: 1 } } as any)),

packages/ra-core/src/dataProvider/useDelete.ts

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,11 @@ export const useDelete = <
9090
): UseDeleteResult<RecordType, MutationError> => {
9191
const dataProvider = useDataProvider();
9292
const queryClient = useQueryClient();
93-
const { mutationMode = 'pessimistic', ...mutationOptions } = options;
93+
const {
94+
mutationMode = 'pessimistic',
95+
onSettled,
96+
...mutationOptions
97+
} = options;
9498

9599
const [mutate, mutationResult] = useMutationWithMutationMode<
96100
MutationError,
@@ -220,16 +224,17 @@ export const useDelete = <
220224
];
221225
return queryKeys;
222226
},
223-
onSettled: (
224-
result,
225-
error,
226-
variables,
227-
context: { snapshot: Snapshot }
228-
) => {
227+
onSettled: (...args) => {
228+
const [, , , mutateResult] = args;
229+
229230
// For deletion, we always refetch after error or success:
230-
context.snapshot.forEach(([queryKey]) => {
231-
queryClient.invalidateQueries({ queryKey });
232-
});
231+
(mutateResult as { snapshot: Snapshot }).snapshot.forEach(
232+
([queryKey]) => {
233+
queryClient.invalidateQueries({ queryKey });
234+
}
235+
);
236+
237+
onSettled?.(...args);
233238
},
234239
}
235240
);

packages/ra-core/src/dataProvider/useDeleteMany.spec.tsx

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,33 @@ describe('useDeleteMany', () => {
148148
});
149149
});
150150

151+
it('calls onSettled when provided in hook time options', async () => {
152+
const dataProvider = testDataProvider({
153+
deleteMany: jest.fn(() => Promise.resolve({ data: [1, 2] } as any)),
154+
});
155+
let localDeleteMany;
156+
const onSettled = jest.fn();
157+
const Dummy = () => {
158+
const [deleteMany] = useDeleteMany(
159+
'foo',
160+
{ ids: [1, 2] },
161+
{ onSettled }
162+
);
163+
localDeleteMany = deleteMany;
164+
return <span />;
165+
};
166+
167+
render(
168+
<CoreAdminContext dataProvider={dataProvider}>
169+
<Dummy />
170+
</CoreAdminContext>
171+
);
172+
localDeleteMany('foo', { ids: [3, 4] });
173+
await waitFor(() => {
174+
expect(onSettled).toHaveBeenCalled();
175+
});
176+
});
177+
151178
it('accepts a meta parameter', async () => {
152179
const dataProvider = testDataProvider({
153180
deleteMany: jest.fn(() => Promise.resolve({ data: [1, 2] } as any)),

packages/ra-core/src/dataProvider/useDeleteMany.ts

Lines changed: 15 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -90,7 +90,11 @@ export const useDeleteMany = <
9090
): UseDeleteManyResult<RecordType, MutationError> => {
9191
const dataProvider = useDataProvider();
9292
const queryClient = useQueryClient();
93-
const { mutationMode = 'pessimistic', ...mutationOptions } = options;
93+
const {
94+
mutationMode = 'pessimistic',
95+
onSettled,
96+
...mutationOptions
97+
} = options;
9498

9599
const [mutate, mutationResult] = useMutationWithMutationMode<
96100
MutationError,
@@ -247,16 +251,17 @@ export const useDeleteMany = <
247251
];
248252
return queryKeys;
249253
},
250-
onSettled: (
251-
result,
252-
error,
253-
variables,
254-
context: { snapshot: Snapshot }
255-
) => {
254+
onSettled: (...args) => {
255+
const [, , , mutateResult] = args;
256+
256257
// For deletion, we always refetch after error or success:
257-
context.snapshot.forEach(([queryKey]) => {
258-
queryClient.invalidateQueries({ queryKey });
259-
});
258+
(mutateResult as { snapshot: Snapshot }).snapshot.forEach(
259+
([queryKey]) => {
260+
queryClient.invalidateQueries({ queryKey });
261+
}
262+
);
263+
264+
onSettled?.(...args);
260265
},
261266
}
262267
);

0 commit comments

Comments
 (0)