@@ -2,21 +2,22 @@ import { useEffect, useMemo, useState, type DependencyList } from "react";
2
2
import { createObjectHash } from "./useLoader/createObjectHash" ;
3
3
import { useRenderer } from ".." ;
4
4
5
- export interface RendererLoader < TData = unknown > {
5
+ export interface RendererLoader < TData = unknown , TError = unknown > {
6
6
data : TData | null ;
7
7
loading : boolean ;
8
8
cacheHit : boolean ;
9
9
cacheKey : null | string ;
10
+ error : null | TError ;
10
11
}
11
12
12
13
export interface UseLoaderOptions {
13
14
cacheKey ?: DependencyList ;
14
15
}
15
16
16
- export function useLoader < TData = unknown > (
17
+ export function useLoader < TData = unknown , TError = unknown > (
17
18
loaderFn : ( ) => Promise < TData > ,
18
19
options ?: UseLoaderOptions
19
- ) : RendererLoader < TData > {
20
+ ) : RendererLoader < TData , TError > {
20
21
const { getElement, loaderCache } = useRenderer ( ) ;
21
22
22
23
const element = getElement ( ) ;
@@ -29,15 +30,16 @@ export function useLoader<TData = unknown>(
29
30
return loaderCache . read < TData > ( cacheKey ) ;
30
31
} , [ cacheKey ] ) ;
31
32
32
- const [ loader , setLoader ] = useState < RendererLoader < TData > > (
33
+ const [ loader , setLoader ] = useState < RendererLoader < TData , TError > > (
33
34
cachedData
34
35
? {
35
36
data : cachedData ,
36
37
loading : false ,
37
38
cacheHit : true ,
38
- cacheKey
39
+ cacheKey,
40
+ error : null
39
41
}
40
- : { data : null , loading : true , cacheHit : false , cacheKey : null }
42
+ : { data : null , loading : true , cacheHit : false , cacheKey : null , error : null }
41
43
) ;
42
44
43
45
useEffect ( ( ) => {
@@ -46,15 +48,25 @@ export function useLoader<TData = unknown>(
46
48
}
47
49
48
50
if ( cachedData ) {
49
- setLoader ( { data : cachedData , loading : false , cacheKey, cacheHit : true } ) ;
51
+ setLoader ( { data : cachedData , loading : false , cacheKey, cacheHit : true , error : null } ) ;
50
52
return ;
51
53
}
52
54
53
- setLoader ( { data : loader . data , loading : true , cacheKey, cacheHit : false } ) ;
54
- loaderFn ( ) . then ( data => {
55
- loaderCache . write ( cacheKey , data ) ;
56
- setLoader ( { data, loading : false , cacheKey, cacheHit : false } ) ;
55
+ setLoader ( {
56
+ data : loader . data ,
57
+ error : loader . error ,
58
+ loading : true ,
59
+ cacheKey,
60
+ cacheHit : false
57
61
} ) ;
62
+ loaderFn ( )
63
+ . then ( data => {
64
+ loaderCache . write ( cacheKey , data ) ;
65
+ setLoader ( { data, error : null , loading : false , cacheKey, cacheHit : false } ) ;
66
+ } )
67
+ . catch ( error => {
68
+ setLoader ( { data : null , error, loading : false , cacheKey, cacheHit : false } ) ;
69
+ } ) ;
58
70
} , [ cacheKey ] ) ;
59
71
60
72
return loader ;
0 commit comments