Skip to content

Commit 81d5624

Browse files
authored
Merge pull request #9855 from marmelab/refactor-middlewares
Move middlewares to dataProvider hooks
2 parents 7e61cca + 9b398be commit 81d5624

15 files changed

+922
-122
lines changed

docs/Upgrade.md

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1335,6 +1335,40 @@ The `data-generator-retail` package has been updated to provide types for all it
13351335

13361336
React-admin no longer supports ([deprecated React PropTypes](https://legacy.reactjs.org/blog/2017/04/07/react-v15.5.0.html#new-deprecation-warnings)). We encourage you to switch to TypeScript to type component props.
13371337

1338+
### Mutation Middlewares No Longer Receive The Mutation Options
1339+
1340+
Mutations middlewares no longer receive the mutation options:
1341+
1342+
```diff
1343+
import * as React from 'react';
1344+
import {
1345+
useRegisterMutationMiddleware,
1346+
CreateParams,
1347+
- MutateOptions,
1348+
CreateMutationFunction
1349+
} from 'react-admin';
1350+
1351+
const MyComponent = () => {
1352+
const createMiddleware = async (
1353+
resource: string,
1354+
params: CreateParams,
1355+
- options: MutateOptions,
1356+
next: CreateMutationFunction
1357+
) => {
1358+
// Do something before the mutation
1359+
1360+
// Call the next middleware
1361+
- await next(resource, params, options);
1362+
+ await next(resource, params);
1363+
1364+
// Do something after the mutation
1365+
}
1366+
const memoizedMiddleWare = React.useCallback(createMiddleware, []);
1367+
useRegisterMutationMiddleware(memoizedMiddleWare);
1368+
// ...
1369+
}
1370+
```
1371+
13381372
## Upgrading to v4
13391373

13401374
If you are on react-admin v3, follow the [Upgrading to v4](https://marmelab.com/react-admin/doc/4.16/Upgrade.html) guide before upgrading to v5.

docs/useRegisterMutationMiddleware.md

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -28,21 +28,19 @@ import * as React from 'react';
2828
import {
2929
useRegisterMutationMiddleware,
3030
CreateParams,
31-
MutateOptions,
3231
CreateMutationFunction
3332
} from 'react-admin';
3433

3534
const MyComponent = () => {
3635
const createMiddleware = async (
3736
resource: string,
3837
params: CreateParams,
39-
options: MutateOptions,
4038
next: CreateMutationFunction
4139
) => {
4240
// Do something before the mutation
4341

4442
// Call the next middleware
45-
await next(resource, params, options);
43+
await next(resource, params);
4644

4745
// Do something after the mutation
4846
}
@@ -65,11 +63,11 @@ React-admin will wrap each call to the `dataProvider.create()` mutation with the
6563
A middleware function must have the following signature:
6664

6765
```jsx
68-
const middlware = async (resource, params, options, next) => {
66+
const middlware = async (resource, params, next) => {
6967
// Do something before the mutation
7068

7169
// Call the next middleware
72-
await next(resource, params, options);
70+
await next(resource, params);
7371

7472
// Do something after the mutation
7573
}
@@ -97,13 +95,12 @@ const ThumbnailInput = () => {
9795
const middleware = useCallback(async (
9896
resource,
9997
params,
100-
options,
10198
next
10299
) => {
103100
const b64 = await convertFileToBase64(params.data.thumbnail);
104101
// Update the parameters that will be sent to the dataProvider call
105102
const newParams = { ...params, data: { ...data, thumbnail: b64 } };
106-
await next(resource, newParams, options);
103+
await next(resource, newParams);
107104
}, []);
108105
useRegisterMutationMiddleware(middleware);
109106

packages/ra-core/src/controller/create/CreateController.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { ReactNode } from 'react';
12
import {
23
useCreateController,
34
CreateControllerProps,
@@ -21,7 +22,7 @@ export const CreateController = ({
2122
children,
2223
...props
2324
}: {
24-
children: (params: CreateControllerResult) => JSX.Element;
25+
children: (params: CreateControllerResult) => ReactNode;
2526
} & CreateControllerProps) => {
2627
const controllerProps = useCreateController(props);
2728
return children(controllerProps);

packages/ra-core/src/controller/create/useCreateController.spec.tsx

Lines changed: 10 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@ import {
1818
useInput,
1919
} from '../..';
2020
import { CoreAdminContext } from '../../core';
21-
import { testDataProvider, useCreate } from '../../dataProvider';
21+
import { testDataProvider } from '../../dataProvider';
2222
import { useNotificationContext } from '../../notification';
2323
import {
2424
Middleware,
@@ -35,9 +35,9 @@ describe('useCreateController', () => {
3535
const location: Location = {
3636
key: 'a_key',
3737
pathname: '/foo',
38-
search: undefined,
38+
search: '',
3939
state: undefined,
40-
hash: undefined,
40+
hash: '',
4141
};
4242

4343
it('should return location state record when set', () => {
@@ -563,20 +563,17 @@ describe('useCreateController', () => {
563563
const dataProvider = testDataProvider({
564564
create,
565565
});
566-
const middleware: Middleware<ReturnType<typeof useCreate>[0]> = jest.fn(
567-
(resource, params, options, next) => {
568-
return next(
569-
resource,
570-
{ ...params, meta: { addedByMiddleware: true } },
571-
options
572-
);
566+
const middleware: Middleware<DataProvider['create']> = jest.fn(
567+
(resource, params, next) => {
568+
return next(resource, {
569+
...params,
570+
meta: { addedByMiddleware: true },
571+
});
573572
}
574573
);
575574

576575
const Child = () => {
577-
useRegisterMutationMiddleware<ReturnType<typeof useCreate>[0]>(
578-
middleware
579-
);
576+
useRegisterMutationMiddleware<DataProvider['create']>(middleware);
580577
return null;
581578
};
582579
render(
@@ -616,7 +613,6 @@ describe('useCreateController', () => {
616613
{
617614
data: { foo: 'bar' },
618615
},
619-
expect.any(Object),
620616
expect.any(Function)
621617
);
622618
});

packages/ra-core/src/controller/create/useCreateController.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ export const useCreateController = <
8484
} = mutationOptions;
8585
const {
8686
registerMutationMiddleware,
87-
getMutateWithMiddlewares,
87+
mutateWithMiddlewares,
8888
unregisterMutationMiddleware,
8989
} = useMutationMiddlewares();
9090

@@ -139,6 +139,7 @@ export const useCreateController = <
139139
},
140140
...otherMutationOptions,
141141
returnPromise: true,
142+
mutateWithMiddlewares,
142143
});
143144

144145
const save = useCallback(
@@ -157,9 +158,8 @@ export const useCreateController = <
157158
? transform(data)
158159
: data
159160
).then(async (data: Partial<RecordType>) => {
160-
const mutate = getMutateWithMiddlewares(create);
161161
try {
162-
await mutate(
162+
await create(
163163
resource,
164164
{ data, meta: metaFromSave ?? meta },
165165
callTimeOptions
@@ -176,7 +176,7 @@ export const useCreateController = <
176176
}
177177
}
178178
}),
179-
[create, getMutateWithMiddlewares, meta, resource, transform]
179+
[create, meta, resource, transform]
180180
);
181181

182182
const getResourceLabel = useGetResourceLabel();

packages/ra-core/src/controller/edit/EditController.tsx

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
import { ReactNode } from 'react';
12
import {
23
useEditController,
34
EditControllerProps,
@@ -21,7 +22,7 @@ export const EditController = ({
2122
children,
2223
...props
2324
}: {
24-
children: (params: EditControllerResult) => JSX.Element;
25+
children: (params: EditControllerResult) => ReactNode;
2526
} & EditControllerProps) => {
2627
const controllerProps = useEditController(props);
2728
return children(controllerProps);

packages/ra-core/src/controller/edit/useEditController.spec.tsx

Lines changed: 17 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -15,14 +15,14 @@ import {
1515
useEditController,
1616
} from '..';
1717
import { CoreAdminContext } from '../../core';
18-
import { testDataProvider, useUpdate } from '../../dataProvider';
18+
import { testDataProvider } from '../../dataProvider';
1919
import undoableEventEmitter from '../../dataProvider/undoableEventEmitter';
2020
import { Form, InputProps, useInput } from '../../form';
2121
import { useNotificationContext } from '../../notification';
2222
import { DataProvider } from '../../types';
2323
import { Middleware, useRegisterMutationMiddleware } from '../saveContext';
2424
import { EditController } from './EditController';
25-
import { TestMemoryRouter } from '../../routing';
25+
import { RedirectionSideEffect, TestMemoryRouter } from '../../routing';
2626

2727
describe('useEditController', () => {
2828
const defaultProps = {
@@ -131,10 +131,14 @@ describe('useEditController', () => {
131131
Promise.resolve({ data: { id: 12, title: 'hello' } })
132132
);
133133
const dataProvider = ({ getOne } as unknown) as DataProvider;
134-
const Component = ({ redirect = undefined }) => (
134+
const Component = ({
135+
redirect = undefined,
136+
}: {
137+
redirect?: RedirectionSideEffect;
138+
}) => (
135139
<CoreAdminContext dataProvider={dataProvider}>
136140
<EditController {...defaultProps} redirect={redirect}>
137-
{({ redirect }) => <div>{redirect}</div>}
141+
{({ redirect }) => <div>{redirect.toString()}</div>}
138142
</EditController>
139143
</CoreAdminContext>
140144
);
@@ -224,7 +228,7 @@ describe('useEditController', () => {
224228
<p>{record?.test}</p>
225229
<button
226230
aria-label="save"
227-
onClick={() => save({ test: 'updated' })}
231+
onClick={() => save!({ test: 'updated' })}
228232
/>
229233
</>
230234
);
@@ -268,7 +272,7 @@ describe('useEditController', () => {
268272
<p>{record?.test}</p>
269273
<button
270274
aria-label="save"
271-
onClick={() => save({ test: 'updated' })}
275+
onClick={() => save!({ test: 'updated' })}
272276
/>
273277
</>
274278
);
@@ -1044,20 +1048,17 @@ describe('useEditController', () => {
10441048
getOne: () => Promise.resolve({ data: { id: 12 } }),
10451049
update,
10461050
});
1047-
const middleware: Middleware<ReturnType<typeof useUpdate>[0]> = jest.fn(
1048-
(resource, params, options, next) => {
1049-
return next(
1050-
resource,
1051-
{ ...params, meta: { addedByMiddleware: true } },
1052-
options
1053-
);
1051+
const middleware: Middleware<DataProvider['update']> = jest.fn(
1052+
(resource, params, next) => {
1053+
return next(resource, {
1054+
...params,
1055+
meta: { addedByMiddleware: true },
1056+
});
10541057
}
10551058
);
10561059

10571060
const Child = () => {
1058-
useRegisterMutationMiddleware<ReturnType<typeof useUpdate>[0]>(
1059-
middleware
1060-
);
1061+
useRegisterMutationMiddleware<DataProvider['update']>(middleware);
10611062
return null;
10621063
};
10631064
render(
@@ -1102,7 +1103,6 @@ describe('useEditController', () => {
11021103
id: 12,
11031104
data: { foo: 'bar' },
11041105
},
1105-
expect.any(Object),
11061106
expect.any(Function)
11071107
);
11081108
});

packages/ra-core/src/controller/edit/useEditController.ts

Lines changed: 3 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -91,7 +91,7 @@ export const useEditController = <
9191
} = mutationOptions;
9292
const {
9393
registerMutationMiddleware,
94-
getMutateWithMiddlewares,
94+
mutateWithMiddlewares,
9595
unregisterMutationMiddleware,
9696
} = useMutationMiddlewares();
9797
const {
@@ -192,6 +192,7 @@ export const useEditController = <
192192
...otherMutationOptions,
193193
mutationMode,
194194
returnPromise: mutationMode === 'pessimistic',
195+
mutateWithMiddlewares,
195196
}
196197
);
197198

@@ -216,10 +217,8 @@ export const useEditController = <
216217
})
217218
: data
218219
).then(async (data: Partial<RecordType>) => {
219-
const mutate = getMutateWithMiddlewares(update);
220-
221220
try {
222-
await mutate(
221+
await update(
223222
resource,
224223
{
225224
id,
@@ -239,7 +238,6 @@ export const useEditController = <
239238
}),
240239
[
241240
id,
242-
getMutateWithMiddlewares,
243241
mutationMeta,
244242
resource,
245243
transform,

0 commit comments

Comments
 (0)