Skip to content

Commit e8aabe4

Browse files
authored
Merge pull request #5 from byCedric/fix/persist-result-after-rejection
Fix resolved only displaying after rejected defer when persisted
2 parents 24ff556 + 6ebbd6a commit e8aabe4

File tree

2 files changed

+42
-1
lines changed

2 files changed

+42
-1
lines changed

src/index.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -156,7 +156,8 @@ export const createInstance = (defaultProps = {}) => {
156156
<Consumer>
157157
{state => {
158158
if (state.data === undefined) return null
159-
if (state.isLoading && !persist) return null
159+
if (!persist && state.isLoading) return null
160+
if (!persist && state.error !== undefined) return null
160161
return isFunction(children) ? children(state.data, state) : children || null
161162
}}
162163
</Consumer>

src/spec.js

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -373,3 +373,43 @@ test("An unrelated change in props does not update the Context", async () => {
373373
)
374374
expect(one).toBe(two)
375375
})
376+
377+
test("Async.Resolved does not render after deferFn rejection", async () => {
378+
const promiseFn = () => resolveTo("ok")
379+
const deferFn = () => rejectTo("notok")
380+
const { getByText, queryByText } = render(
381+
<Async promiseFn={promiseFn} deferFn={deferFn}>
382+
<Async.Rejected>fail</Async.Rejected>
383+
<Async.Resolved>{(data, { run }) => <button onClick={run}>next</button>}</Async.Resolved>
384+
</Async>
385+
)
386+
387+
expect(queryByText("next")).toBeNull()
388+
await waitForElement(() => getByText("next"))
389+
expect(queryByText("next")).toBeInTheDocument()
390+
expect(queryByText("fail")).toBeNull()
391+
fireEvent.click(getByText("next"))
392+
await waitForElement(() => getByText("fail"))
393+
expect(queryByText("next")).toBeNull()
394+
expect(queryByText("fail")).toBeInTheDocument()
395+
})
396+
397+
test("Async.Resolved renders after deferFn rejection with persist", async () => {
398+
const promiseFn = () => resolveTo("ok")
399+
const deferFn = () => rejectTo("notok")
400+
const { getByText, queryByText } = render(
401+
<Async promiseFn={promiseFn} deferFn={deferFn}>
402+
<Async.Rejected>fail</Async.Rejected>
403+
<Async.Resolved persist>{(data, { run }) => <button onClick={run}>next</button>}</Async.Resolved>
404+
</Async>
405+
)
406+
407+
expect(queryByText("next")).toBeNull()
408+
await waitForElement(() => getByText("next"))
409+
expect(queryByText("next")).toBeInTheDocument()
410+
expect(queryByText("fail")).toBeNull()
411+
fireEvent.click(getByText("next"))
412+
await waitForElement(() => getByText("fail"))
413+
expect(queryByText("next")).toBeInTheDocument()
414+
expect(queryByText("fail")).toBeInTheDocument()
415+
})

0 commit comments

Comments
 (0)