11import { useMemo } from 'react' ;
2- import {
3- useQueries ,
4- UseQueryOptions ,
5- UseQueryResult ,
6- } from '@tanstack/react-query' ;
2+ import { useQuery , UseQueryOptions } from '@tanstack/react-query' ;
73import useAuthProvider from './useAuthProvider' ;
84import { HintedString } from '../types' ;
95import { 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 = <
111117export 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