Skip to content

Commit e883d2c

Browse files
authored
Merge pull request #10828 from marmelab/use-can-access-record-key
Improve memory footprint of `useCanAccess` when it targets a record
2 parents c9bb681 + df340c1 commit e883d2c

File tree

4 files changed

+57
-4
lines changed

4 files changed

+57
-4
lines changed

packages/ra-core/package.json

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,7 @@
2828
},
2929
"devDependencies": {
3030
"@hookform/resolvers": "^3.2.0",
31+
"@tanstack/react-query-devtools": "^5.21.7",
3132
"@testing-library/react": "^15.0.7",
3233
"@types/jest": "^29.5.2",
3334
"@types/jscodeshift": "^0.11.11",

packages/ra-core/src/auth/CanAccess.stories.tsx

Lines changed: 49 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,10 @@ import * as React from 'react';
22
import { Location } from 'react-router';
33
import { QueryClient } from '@tanstack/react-query';
44
import { AuthProvider } from '../types';
5-
import { CoreAdminContext } from '../core';
5+
import { CoreAdminContext } from '../core/CoreAdminContext';
66
import { CanAccess } from './CanAccess';
7-
import { TestMemoryRouter } from '..';
7+
import { TestMemoryRouter } from '../routing/TestMemoryRouter';
8+
import { ReactQueryDevtools } from '@tanstack/react-query-devtools';
89

910
export default {
1011
title: 'ra-core/auth/CanAccess',
@@ -109,3 +110,49 @@ export const NoAuthProvider = () => (
109110
</CoreAdminContext>
110111
</TestMemoryRouter>
111112
);
113+
114+
const data = Array.from({ length: 1000 }, (_, i) => {
115+
const post = {
116+
id: i + 1,
117+
title: `Post ${i + 1}`,
118+
body: `This is the body of post ${i + 1}`,
119+
};
120+
121+
Array.from({ length: 100 }, (_, i) => {
122+
post[`property${i + 1}`] = `Another very long property ${i + 1}`;
123+
});
124+
125+
return post;
126+
});
127+
128+
export const ManyCalls = ({
129+
authProvider = defaultAuthProvider,
130+
queryClient,
131+
}: {
132+
authProvider?: AuthProvider | null;
133+
queryClient?: QueryClient;
134+
}) => (
135+
<TestMemoryRouter>
136+
<CoreAdminContext
137+
authProvider={authProvider != null ? authProvider : undefined}
138+
queryClient={queryClient}
139+
>
140+
<div>
141+
{data.map(post => (
142+
<CanAccess
143+
key={post.id}
144+
action="read"
145+
resource="posts"
146+
record={post}
147+
>
148+
<div>{post.title}</div>
149+
</CanAccess>
150+
))}
151+
<ReactQueryDevtools
152+
initialIsOpen={false}
153+
buttonPosition="bottom-right"
154+
/>
155+
</div>
156+
</CoreAdminContext>
157+
</TestMemoryRouter>
158+
);

packages/ra-core/src/auth/useCanAccess.ts

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -62,11 +62,15 @@ export const useCanAccess = <
6262
);
6363
}
6464
const record = useRecordContext<RecordType>(params);
65-
65+
const { record: _record, ...restParams } = params;
6666
const authProviderHasCanAccess = !!authProvider?.canAccess;
6767

6868
const queryResult = useQuery({
69-
queryKey: ['auth', 'canAccess', { ...params, record, resource }],
69+
queryKey: [
70+
'auth',
71+
'canAccess',
72+
{ ...restParams, recordId: record?.id, resource },
73+
],
7074
queryFn: async ({ signal }) => {
7175
if (!authProvider || !authProvider.canAccess) {
7276
return true;

yarn.lock

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16028,6 +16028,7 @@ __metadata:
1602816028
dependencies:
1602916029
"@hookform/resolvers": "npm:^3.2.0"
1603016030
"@tanstack/react-query": "npm:^5.21.7"
16031+
"@tanstack/react-query-devtools": "npm:^5.21.7"
1603116032
"@testing-library/react": "npm:^15.0.7"
1603216033
"@types/jest": "npm:^29.5.2"
1603316034
"@types/jscodeshift": "npm:^0.11.11"

0 commit comments

Comments
 (0)