Skip to content

Commit cd529bd

Browse files
committed
Fix useDeleteController should get the record from closest RecordContext
1 parent da67192 commit cd529bd

File tree

2 files changed

+63
-7
lines changed

2 files changed

+63
-7
lines changed
Lines changed: 55 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,55 @@
1+
import * as React from 'react';
2+
import { fireEvent, render, screen, waitFor } from '@testing-library/react';
3+
import { Route, Routes } from 'react-router';
4+
import { testDataProvider } from '../../dataProvider/testDataProvider';
5+
import { CoreAdminContext } from '../../core/CoreAdminContext';
6+
import { TestMemoryRouter } from '../../routing/TestMemoryRouter';
7+
import { useDeleteController } from './useDeleteController';
8+
import { RecordContextProvider } from '../record';
9+
import { ResourceContextProvider } from '../..';
10+
11+
describe('useDeleteController', () => {
12+
it('should get the record and the resource from closest context providers', async () => {
13+
const dataProvider = testDataProvider({
14+
delete: jest.fn((ressource, params) => {
15+
return Promise.resolve({ data: params?.previousData });
16+
}),
17+
});
18+
19+
const MockComponent = () => {
20+
const { handleDelete } = useDeleteController({
21+
mutationMode: 'pessimistic',
22+
});
23+
return <button onClick={handleDelete}>Delete</button>;
24+
};
25+
26+
render(
27+
<TestMemoryRouter>
28+
<CoreAdminContext dataProvider={dataProvider}>
29+
<Routes>
30+
<Route
31+
path="/"
32+
element={
33+
<ResourceContextProvider value="posts">
34+
<RecordContextProvider value={{ id: 1 }}>
35+
<MockComponent />
36+
</RecordContextProvider>
37+
</ResourceContextProvider>
38+
}
39+
/>
40+
</Routes>
41+
</CoreAdminContext>
42+
</TestMemoryRouter>
43+
);
44+
45+
const button = await screen.findByText('Delete');
46+
fireEvent.click(button);
47+
48+
await waitFor(() =>
49+
expect(dataProvider.delete).toHaveBeenCalledWith('posts', {
50+
id: 1,
51+
previousData: { id: 1 },
52+
})
53+
);
54+
});
55+
});

packages/ra-core/src/controller/button/useDeleteController.tsx

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,14 @@
11
import { useCallback, useMemo } from 'react';
22
import { UseMutationOptions } from '@tanstack/react-query';
33

4-
import { useDelete } from '../../dataProvider';
5-
import { useUnselect } from '../';
6-
import { useRedirect, RedirectionSideEffect } from '../../routing';
7-
import { useNotify } from '../../notification';
4+
import { useDelete } from '../../dataProvider/useDelete';
5+
import { useUnselect } from '../list/useUnselect';
6+
import { useRecordContext } from '../record/useRecordContext';
7+
import { useRedirect, RedirectionSideEffect } from '../../routing/useRedirect';
8+
import { useNotify } from '../../notification/useNotify';
89
import { RaRecord, MutationMode, DeleteParams } from '../../types';
9-
import { useResourceContext } from '../../core';
10-
import { useTranslate } from '../../i18n';
10+
import { useResourceContext } from '../../core/useResourceContext';
11+
import { useTranslate } from '../../i18n/useTranslate';
1112

1213
/**
1314
* Prepare a set of callbacks for a delete button
@@ -67,13 +68,13 @@ export const useDeleteController = <
6768
props: UseDeleteControllerParams<RecordType, ErrorType>
6869
): UseDeleteControllerReturn => {
6970
const {
70-
record,
7171
redirect: redirectTo = 'list',
7272
mutationMode,
7373
mutationOptions = {},
7474
successMessage,
7575
} = props;
7676
const { meta: mutationMeta, ...otherMutationOptions } = mutationOptions;
77+
const record = useRecordContext(props);
7778
const resource = useResourceContext(props);
7879
const notify = useNotify();
7980
const unselect = useUnselect(resource);

0 commit comments

Comments
 (0)