Skip to content

Commit 9be4809

Browse files
fix: useeffect that handle enable change (#440)
1 parent f2cfa8f commit 9be4809

File tree

3 files changed

+51
-4
lines changed

3 files changed

+51
-4
lines changed

packages/use-dataloader/src/__tests__/dataloader.test.ts

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -189,21 +189,22 @@ describe('Dataloader class', () => {
189189
const instance = new DataLoader({
190190
key: 'test',
191191
method,
192-
pollingInterval: PROMISE_TIMEOUT,
192+
pollingInterval: PROMISE_TIMEOUT * 2,
193193
})
194194
await instance.load()
195195
expect(method).toBeCalledTimes(1)
196-
await new Promise(resolve => setTimeout(resolve, PROMISE_TIMEOUT * 2))
196+
await new Promise(resolve => setTimeout(resolve, PROMISE_TIMEOUT * 3))
197197
expect(method).toBeCalledTimes(2)
198-
await new Promise(resolve => setTimeout(resolve, PROMISE_TIMEOUT * 2))
198+
await new Promise(resolve => setTimeout(resolve, PROMISE_TIMEOUT * 3))
199199
expect(method).toBeCalledTimes(3)
200200
await instance.load()
201201
await instance.load()
202-
await instance.load()
202+
await new Promise(resolve => setTimeout(resolve))
203203
expect(method).toBeCalledTimes(4)
204204
await instance.load()
205205
await instance.load()
206206
await instance.load(true)
207+
await new Promise(resolve => setTimeout(resolve))
207208
expect(method).toBeCalledTimes(6)
208209
instance.destroy()
209210
})

packages/use-dataloader/src/__tests__/useDataLoader.test.tsx

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -62,6 +62,46 @@ describe('useDataLoader', () => {
6262
expect(result.current.data).toBe(true)
6363
})
6464

65+
test('should render correctly without requets enabled then enable it', async () => {
66+
const method = jest.fn(
67+
() =>
68+
new Promise(resolve => {
69+
setTimeout(() => resolve(true), PROMISE_TIMEOUT)
70+
}),
71+
)
72+
let enabled = false
73+
const { rerender, result, waitForNextUpdate } = renderHook<
74+
UseDataLoaderHookProps,
75+
UseDataLoaderResult
76+
>(
77+
props =>
78+
useDataLoader(props.key, props.method, {
79+
enabled,
80+
}),
81+
{
82+
initialProps: {
83+
...initialProps,
84+
key: 'test-not-enabled-then-reload',
85+
method,
86+
},
87+
wrapper,
88+
},
89+
)
90+
expect(result.current.data).toBe(undefined)
91+
expect(result.current.isLoading).toBe(false)
92+
expect(method).toBeCalledTimes(0)
93+
enabled = true
94+
rerender()
95+
expect(method).toBeCalledTimes(1)
96+
expect(result.current.data).toBe(undefined)
97+
expect(result.current.isLoading).toBe(true)
98+
await waitForNextUpdate()
99+
expect(result.current.isLoading).toBe(false)
100+
expect(result.current.isSuccess).toBe(true)
101+
expect(result.current.previousData).toBe(undefined)
102+
expect(result.current.data).toBe(true)
103+
})
104+
65105
test('should render correctly without valid key', () => {
66106
const { result } = renderHook<UseDataLoaderHookProps, UseDataLoaderResult>(
67107
props => useDataLoader(props.key, props.method),

packages/use-dataloader/src/useDataLoader.ts

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -104,6 +104,12 @@ const useDataLoader = <T>(
104104
[isSuccess, isLoading, enabled, pollingInterval],
105105
)
106106

107+
useEffect(() => {
108+
if (enabled && isIdle) {
109+
request.launch?.()
110+
}
111+
}, [request, enabled, isIdle])
112+
107113
useEffect(() => {
108114
isFetchingRef.current = isLoading || isPolling
109115
}, [isLoading, isPolling])

0 commit comments

Comments
 (0)