Skip to content

Commit 3e57d55

Browse files
fix: optimistic isloading value on hook mount (#831)
1 parent 32e748c commit 3e57d55

File tree

1 file changed

+21
-12
lines changed

1 file changed

+21
-12
lines changed

packages/use-dataloader/src/useDataLoader.ts

Lines changed: 21 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
import { useCallback, useEffect, useRef, useState } from 'react'
1+
import { useCallback, useEffect, useMemo, useRef, useState } from 'react'
22
import { useDataLoaderContext } from './DataLoaderProvider'
33
import { StatusEnum } from './constants'
44
import DataLoader from './dataloader'
@@ -41,9 +41,25 @@ function useDataLoader<ResultType, ErrorType = Error>(
4141
}
4242
}, [request, forceRerender])
4343

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+
4459
const previousDataRef = useRef(request.data)
4560

46-
const isLoading = request.status === StatusEnum.LOADING
61+
const isLoading =
62+
request.status === StatusEnum.LOADING || optimisticIsLoadingRef.current
4763

4864
const isSuccess = request.status === StatusEnum.SUCCESS
4965

@@ -87,18 +103,11 @@ function useDataLoader<ResultType, ErrorType = Error>(
87103
}, [request.data, keepPreviousData])
88104

89105
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) {
99107
request.load().then(onSuccessRef.current).catch(onErrorRef.current)
100108
}
101-
}, [enabled, request, keepPreviousData, dataLifetime])
109+
optimisticIsLoadingRef.current = false
110+
}, [needLoad, request])
102111

103112
useEffect(() => {
104113
let interval: NodeJS.Timer

0 commit comments

Comments
 (0)