Skip to content

Commit b6b10e5

Browse files
authored
Merge pull request marmelab#10362 from marmelab/fix-can-access-resources
Fix `useCanAccessResources` cannot have react-query options
2 parents b7db83d + fffec2c commit b6b10e5

File tree

1 file changed

+25
-52
lines changed

1 file changed

+25
-52
lines changed

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

Lines changed: 25 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,5 @@
11
import { useMemo } from 'react';
2-
import {
3-
useQueries,
4-
UseQueryOptions,
5-
UseQueryResult,
6-
} from '@tanstack/react-query';
2+
import { useQuery, UseQueryOptions } from '@tanstack/react-query';
73
import useAuthProvider from './useAuthProvider';
84
import { HintedString } from '../types';
95
import { useRecordContext } from '../controller';
@@ -50,18 +46,18 @@ export const useCanAccessResources = <
5046
RecordType extends Record<string, any> = Record<string, any>,
5147
ErrorType extends Error = Error,
5248
>(
53-
params: UseCanAccessResourcesOptions<RecordType, ErrorType>
49+
params: UseCanAccessResourcesOptions<RecordType>
5450
): UseCanAccessResourcesResult<ErrorType> => {
5551
const authProvider = useAuthProvider();
5652
const record = useRecordContext<RecordType>(params);
5753

58-
const { action, resources } = params;
54+
const { action, resources, ...options } = params;
5955

60-
const queryResult = useQueries({
61-
queries: resources.map(resource => {
62-
return {
63-
queryKey: ['auth', 'canAccess', resource, action, record],
64-
queryFn: async ({ signal }) => {
56+
const queryResult = useQuery({
57+
queryKey: ['auth', 'canAccess', resources, action, record],
58+
queryFn: async ({ signal }) => {
59+
const queries = await Promise.all(
60+
resources.map(async resource => {
6561
if (!authProvider || !authProvider.canAccess) {
6662
return { canAccess: true, resource };
6763
}
@@ -75,10 +71,20 @@ export const useCanAccessResources = <
7571
});
7672

7773
return { canAccess, resource };
74+
})
75+
);
76+
77+
const result = queries.reduce(
78+
(acc, { resource, canAccess }) => {
79+
acc[resource] = canAccess;
80+
return acc;
7881
},
79-
};
80-
}),
81-
combine: combineSourceAccessResults<ErrorType>,
82+
{} as Record<string, boolean>
83+
);
84+
85+
return result;
86+
},
87+
...options,
8288
});
8389

8490
const result = useMemo(() => {
@@ -111,7 +117,10 @@ export const useCanAccessResources = <
111117
export interface UseCanAccessResourcesOptions<
112118
RecordType extends Record<string, any> = Record<string, any>,
113119
ErrorType extends Error = Error,
114-
> extends Omit<UseQueryOptions<boolean, ErrorType>, 'queryKey' | 'queryFn'> {
120+
> extends Omit<
121+
UseQueryOptions<Record<string, boolean>, ErrorType>,
122+
'queryKey' | 'queryFn'
123+
> {
115124
resources: string[];
116125
action: HintedString<'list' | 'create' | 'edit' | 'show' | 'delete'>;
117126
record?: RecordType;
@@ -143,39 +152,3 @@ export interface UseCanAccessResourcesSuccessResult {
143152
error: null;
144153
isPending: false;
145154
}
146-
147-
const combineSourceAccessResults = <ErrorType>(
148-
results: UseQueryResult<
149-
{
150-
canAccess: boolean;
151-
resource: string;
152-
},
153-
ErrorType
154-
>[]
155-
): {
156-
data?: Record<string, boolean>;
157-
isPending: boolean;
158-
isError: boolean;
159-
error?: ErrorType;
160-
} => {
161-
return {
162-
data: results
163-
? results.reduce(
164-
(acc, { data }) => {
165-
if (!data) {
166-
return acc;
167-
}
168-
const { resource, canAccess } = data;
169-
return {
170-
...acc,
171-
[resource]: canAccess,
172-
};
173-
},
174-
{} as Record<string, boolean>
175-
)
176-
: undefined,
177-
isPending: results.some(result => result.isPending),
178-
isError: results.some(result => result.isError),
179-
error: results.find(result => result.error)?.error || undefined,
180-
};
181-
};

0 commit comments

Comments
 (0)