|
1 | | -import { useCallback, useEffect, useRef, useState } from 'react' |
| 1 | +import { useCallback, useEffect, useMemo, useRef, useState } from 'react' |
2 | 2 | import { useDataLoaderContext } from './DataLoaderProvider' |
3 | 3 | import { StatusEnum } from './constants' |
4 | 4 | import DataLoader from './dataloader' |
@@ -41,9 +41,25 @@ function useDataLoader<ResultType, ErrorType = Error>( |
41 | 41 | } |
42 | 42 | }, [request, forceRerender]) |
43 | 43 |
|
| 44 | + const needLoad = useMemo( |
| 45 | + () => |
| 46 | + !!( |
| 47 | + enabled && |
| 48 | + (!request.dataUpdatedAt || |
| 49 | + !dataLifetime || |
| 50 | + (request.dataUpdatedAt && |
| 51 | + dataLifetime && |
| 52 | + request.dataUpdatedAt + dataLifetime < Date.now())) |
| 53 | + ), |
| 54 | + [enabled, request.dataUpdatedAt, dataLifetime], |
| 55 | + ) |
| 56 | + |
| 57 | + const optimisticIsLoadingRef = useRef(needLoad) |
| 58 | + |
44 | 59 | const previousDataRef = useRef(request.data) |
45 | 60 |
|
46 | | - const isLoading = request.status === StatusEnum.LOADING |
| 61 | + const isLoading = |
| 62 | + request.status === StatusEnum.LOADING || optimisticIsLoadingRef.current |
47 | 63 |
|
48 | 64 | const isSuccess = request.status === StatusEnum.SUCCESS |
49 | 65 |
|
@@ -87,18 +103,11 @@ function useDataLoader<ResultType, ErrorType = Error>( |
87 | 103 | }, [request.data, keepPreviousData]) |
88 | 104 |
|
89 | 105 | useEffect(() => { |
90 | | - // If this request is enabled and not already called |
91 | | - if ( |
92 | | - enabled && |
93 | | - (!request.dataUpdatedAt || |
94 | | - !dataLifetime || |
95 | | - (request.dataUpdatedAt && |
96 | | - dataLifetime && |
97 | | - request.dataUpdatedAt + dataLifetime < Date.now())) |
98 | | - ) { |
| 106 | + if (needLoad) { |
99 | 107 | request.load().then(onSuccessRef.current).catch(onErrorRef.current) |
100 | 108 | } |
101 | | - }, [enabled, request, keepPreviousData, dataLifetime]) |
| 109 | + optimisticIsLoadingRef.current = false |
| 110 | + }, [needLoad, request]) |
102 | 111 |
|
103 | 112 | useEffect(() => { |
104 | 113 | let interval: NodeJS.Timer |
|
0 commit comments