Skip to content

Commit 5286f4e

Browse files
committed
Fix onSettled call when provided in hook time options.
1 parent e89d57c commit 5286f4e

6 files changed

Lines changed: 140 additions & 29 deletions

File tree

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

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,37 @@ 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+
let settled = false;
153+
const Dummy = () => {
154+
const [create] = useCreate(
155+
'foo',
156+
{ data: { bar: 'baz' } },
157+
{
158+
onSettled: () => {
159+
settled = true;
160+
},
161+
}
162+
);
163+
localCreate = create;
164+
return <span />;
165+
};
166+
167+
render(
168+
<CoreAdminContext dataProvider={dataProvider}>
169+
<Dummy />
170+
</CoreAdminContext>
171+
);
172+
localCreate('foo', { data: { foo: 456 } });
173+
await waitFor(() => {
174+
expect(settled).toBe(true);
175+
});
176+
});
177+
147178
it('accepts a meta parameter', async () => {
148179
const dataProvider = testDataProvider({
149180
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: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -207,6 +207,43 @@ 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+
let settled = false;
216+
const Dummy = () => {
217+
const [deleteOne] = useDelete(
218+
'foo',
219+
{
220+
id: 1,
221+
previousData: { id: 1, bar: 'bar' },
222+
},
223+
{
224+
onSettled: () => {
225+
settled = true;
226+
},
227+
}
228+
);
229+
localDeleteOne = deleteOne;
230+
return <span />;
231+
};
232+
233+
render(
234+
<CoreAdminContext dataProvider={dataProvider}>
235+
<Dummy />
236+
</CoreAdminContext>
237+
);
238+
localDeleteOne('foo', {
239+
id: 1,
240+
previousData: { foo: 456 },
241+
});
242+
await waitFor(() => {
243+
expect(settled).toBe(true);
244+
});
245+
});
246+
210247
it('accepts a meta parameter', async () => {
211248
const dataProvider = testDataProvider({
212249
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: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -148,6 +148,37 @@ 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+
let settled = false;
157+
const Dummy = () => {
158+
const [deleteMany] = useDeleteMany(
159+
'foo',
160+
{ ids: [1, 2] },
161+
{
162+
onSettled: () => {
163+
settled = true;
164+
},
165+
}
166+
);
167+
localDeleteMany = deleteMany;
168+
return <span />;
169+
};
170+
171+
render(
172+
<CoreAdminContext dataProvider={dataProvider}>
173+
<Dummy />
174+
</CoreAdminContext>
175+
);
176+
localDeleteMany('foo', { ids: [3, 4] });
177+
await waitFor(() => {
178+
expect(settled).toBe(true);
179+
});
180+
});
181+
151182
it('accepts a meta parameter', async () => {
152183
const dataProvider = testDataProvider({
153184
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)