@@ -12,31 +12,29 @@ import { QueryClient, useQueries } from '@tanstack/react-query';
1212import { createElement , Fragment , useEffect , useMemo } from 'react' ;
1313import { jwtDecode } from './lib/jwt-decode/index.js' ;
1414
15- interface QraftSecureRequestFnBaseProps {
16- requestFn < TData , TError > (
17- schema : OperationSchema ,
18- requestInfo : RequestFnInfo ,
19- options ?: RequestFnOptions
20- ) : Promise < RequestFnResponse < TData , TError > > ;
15+ type RequestFn = < TData , TError > (
16+ schema : OperationSchema ,
17+ requestInfo : RequestFnInfo ,
18+ options ?: RequestFnOptions
19+ ) => Promise < RequestFnResponse < TData , TError > > ;
20+
21+ interface QraftSecureRequestFnBaseProps < TRequestFn extends RequestFn > {
22+ requestFn : TRequestFn ;
2123 securitySchemes : SecuritySchemeHandlers < string > ;
2224}
2325
24- type RequestFn = QraftSecureRequestFnBaseProps [ 'requestFn' ] ;
25-
26- export interface QraftSecureRequestFnProps
27- extends QraftSecureRequestFnBaseProps {
28- children (
29- secureRequestFn : QraftSecureRequestFnBaseProps [ 'requestFn' ]
30- ) : ReactNode ;
26+ export interface QraftSecureRequestFnProps < TRequestFn extends RequestFn >
27+ extends QraftSecureRequestFnBaseProps < TRequestFn > {
28+ children ( secureRequestFn : TRequestFn ) : ReactNode ;
3129 queryClient ?: QueryClient ;
3230}
3331
34- export function QraftSecureRequestFn ( {
32+ export function QraftSecureRequestFn < TRequestFn extends RequestFn > ( {
3533 children,
3634 requestFn,
3735 securitySchemes,
3836 queryClient : inQueryClient ,
39- } : QraftSecureRequestFnProps ) {
37+ } : QraftSecureRequestFnProps < TRequestFn > ) {
4038 const queryClient = useMemo (
4139 ( ) =>
4240 inQueryClient ??
@@ -72,13 +70,13 @@ export function QraftSecureRequestFn({
7270 } ) ;
7371}
7472
75- export const useSecuritySchemeAuth = ( {
73+ export const useSecuritySchemeAuth = < TRequestFn extends RequestFn > ( {
7674 securitySchemes,
7775 requestFn,
7876 queryClient,
79- } : QraftSecureRequestFnBaseProps & {
77+ } : QraftSecureRequestFnBaseProps < TRequestFn > & {
8078 queryClient : QueryClient ;
81- } ) : RequestFn => {
79+ } ) : TRequestFn => {
8280 useQueries (
8381 {
8482 queries : Object . entries ( securitySchemes ) . map ( ( [ securitySchemeName ] ) => {
@@ -101,7 +99,7 @@ export const useSecuritySchemeAuth = ({
10199 return useMemo (
102100 ( ) => createSecureRequestFn ( securitySchemes , requestFn , queryClient ) ,
103101 [ securitySchemes , requestFn , queryClient ]
104- ) ;
102+ ) as TRequestFn ;
105103} ;
106104
107105/**
@@ -113,11 +111,11 @@ export const useSecuritySchemeAuth = ({
113111 * @param requestFn Qraft `requestFn`
114112 * @param queryClient QueryClient instance.
115113 */
116- export function createSecureRequestFn (
114+ export function createSecureRequestFn < TRequestFn extends RequestFn > (
117115 securitySchemes : SecuritySchemeHandlers < string > ,
118- requestFn : RequestFn ,
116+ requestFn : TRequestFn ,
119117 queryClient : QueryClient
120- ) : RequestFn {
118+ ) : TRequestFn {
121119 return async function secureRequestFn (
122120 schema : OperationSchema ,
123121 requestInfo : RequestFnInfo ,
@@ -147,7 +145,7 @@ export function createSecureRequestFn(
147145 ) ,
148146 options
149147 ) ;
150- } ;
148+ } as TRequestFn ;
151149}
152150
153151/**
@@ -174,14 +172,25 @@ async function createSecureRequestInfo(
174172) : Promise < RequestFnInfo > {
175173 const prevSecurityResult = queryClient . getQueryData < SecurityScheme > ( queryKey ) ;
176174
177- const securityResult = await queryClient . fetchQuery ( {
178- queryKey,
179- queryFn : ( { signal } ) =>
180- handler ( {
181- signal,
182- isRefreshing : Boolean ( prevSecurityResult ) ,
183- } ) ,
184- } ) ;
175+ const abortQuery = ( ) => queryClient . cancelQueries ( { queryKey, exact : true } ) ;
176+
177+ requestInfo . signal ?. addEventListener ( 'abort' , abortQuery ) ;
178+
179+ const securityResult = await queryClient
180+ . fetchQuery ( {
181+ queryKey,
182+ queryFn : ( { signal } ) =>
183+ handler ( {
184+ signal,
185+ isRefreshing : Boolean ( prevSecurityResult ) ,
186+ } ) ,
187+ } )
188+ . catch ( ( error ) => {
189+ throw requestInfo . signal ?. aborted ? requestInfo . signal . reason : error ;
190+ } )
191+ . finally (
192+ ( ) => void requestInfo . signal ?. removeEventListener ( 'abort' , abortQuery )
193+ ) ;
185194
186195 if ( ! shallowEqualObjects ( securityResult , prevSecurityResult ) ) {
187196 const securityRefreshInterval = getSecurityRefreshInterval ( securityResult ) ;
0 commit comments