Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Release v9.0.0 #151

Merged
merged 122 commits into from
Oct 7, 2019
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
Show all changes
122 commits
Select commit Hold shift + click to select a range
a5ec15d
Update upgrade instructions.
ghengeveld Aug 23, 2019
4c0c7c5
Update dependency eslint to v6.2.2 (#89)
renovate[bot] Aug 24, 2019
5d0df23
Change root package name to avoid ambiguity.
ghengeveld Aug 25, 2019
0ef2f6c
Update dependency babel-eslint to v10.0.3 (#90)
renovate[bot] Aug 26, 2019
f5dda65
Update contribution guide.
ghengeveld Aug 26, 2019
9e7dac7
Text wrapping.
ghengeveld Aug 28, 2019
24ea2b0
Clarify behavior when 'initialValue' is set.
ghengeveld Aug 28, 2019
e7f9ab3
Update dependency eslint-plugin-jest to v22.16.0 (#94)
renovate[bot] Aug 29, 2019
4b179bc
Auto detect React version for ESLint.
ghengeveld Aug 30, 2019
bd48e66
Add Discord badge.
ghengeveld Aug 30, 2019
58a98d8
Add brand images.
ghengeveld Aug 30, 2019
be2f03f
Update dependency @storybook/react to v5.2.0-rc.2 (#91)
renovate[bot] Sep 2, 2019
0bd142d
Update dependency eslint to v6.3.0 (#95)
renovate[bot] Sep 2, 2019
202d3e0
Setup Chromatic.
ghengeveld Sep 4, 2019
3159615
Update babel monorepo to v7.6.0 (#106)
renovate[bot] Sep 6, 2019
91a7d88
Update dependency eslint-plugin-jest to v22.17.0 (#101)
renovate[bot] Sep 6, 2019
1e3b57d
Update dependency @testing-library/react to v9.1.4 (#99)
renovate[bot] Sep 6, 2019
8125fbf
Pin dependency storybook-chromatic to 2.2.2 (#100)
renovate[bot] Sep 6, 2019
7552f1a
Add displayName to the createInstance type signature. (#102)
artdent Sep 6, 2019
1797535
Transferred ownership of the repo to async-library.
ghengeveld Sep 6, 2019
ced2ba2
Fix merge error.
ghengeveld Sep 6, 2019
352875a
remove non implemented types (#107)
Khartir Sep 6, 2019
1ea71b6
Add a unit test for the createInstance displayName arg. (#108)
artdent Sep 9, 2019
85ffab0
Update dependency eslint-config-prettier to v6.2.0 (#98)
renovate[bot] Sep 9, 2019
c3fe2cc
Update dependency now to v16.2.0 (#96)
renovate[bot] Sep 9, 2019
d21d7df
updated contribute.md to run examples (#110)
Avi98 Sep 14, 2019
702a32f
Replace occurences of Async.Loading with Async.Pending and isLoading …
ghengeveld Sep 14, 2019
bef2266
Update bootstrap script to include building packages.
ghengeveld Sep 14, 2019
42f68fb
Replace synthetic default imports with star import in ts definit… (#112)
rokoroku Sep 16, 2019
2e41b88
Update Chromatic app code.
ghengeveld Sep 16, 2019
491d7ec
Merge branch 'master' into next
ghengeveld Sep 17, 2019
5b53428
Add delay for Chromatic to avoid flake.
ghengeveld Sep 17, 2019
ff9e875
Add Chromatic badge.
ghengeveld Sep 17, 2019
b9ca8ce
Use the right color for Chromatic.
ghengeveld Sep 17, 2019
2a99f66
Setup CodeSandbox CI.
ghengeveld Sep 18, 2019
62cbfd1
Fix a merge issue.
ghengeveld Sep 18, 2019
d162c3f
Update dependency @storybook/react to v5.2.0-rc.6 (#97)
renovate[bot] Sep 18, 2019
7c926dc
docs: add Khartir as a contributor (#117)
allcontributors[bot] Sep 19, 2019
da64f0c
docs: add phryneas as a contributor (#118)
allcontributors[bot] Sep 19, 2019
e63d58a
docs: add FredKSchott as a contributor (#120)
allcontributors[bot] Sep 19, 2019
7940c5a
docs: add Avi98 as a contributor (#119)
allcontributors[bot] Sep 19, 2019
2bd3875
Update README.md
ghengeveld Sep 19, 2019
b530856
Update README.md
ghengeveld Sep 19, 2019
37a952f
docs: add byCedric as a contributor (#121)
allcontributors[bot] Sep 19, 2019
713d50b
docs: add tomshane as a contributor (#122)
allcontributors[bot] Sep 19, 2019
dba4d2f
docs: add ghengeveld as a contributor (#123)
allcontributors[bot] Sep 19, 2019
a8ab4ba
docs: add philip-peterson as a contributor (#124)
allcontributors[bot] Sep 19, 2019
3dcad77
docs: add sibelius as a contributor (#125)
allcontributors[bot] Sep 19, 2019
a67f736
docs: add jimthedev as a contributor (#126)
allcontributors[bot] Sep 19, 2019
4a1b18c
docs: add msokk as a contributor (#127)
allcontributors[bot] Sep 19, 2019
965601e
docs: add brabeji as a contributor (#128)
allcontributors[bot] Sep 19, 2019
9a709ae
docs: add unorsk as a contributor (#129)
allcontributors[bot] Sep 19, 2019
66d864a
docs: add matthisk as a contributor (#130)
allcontributors[bot] Sep 19, 2019
9306af2
docs: add dhurlburtusa as a contributor (#131)
allcontributors[bot] Sep 19, 2019
a6834b8
docs: add dhurlburtusa as a contributor (#132)
allcontributors[bot] Sep 19, 2019
35d4449
docs: add noelyoo as a contributor (#133)
allcontributors[bot] Sep 19, 2019
61d81ec
docs: add aratcliffe as a contributor (#134)
allcontributors[bot] Sep 19, 2019
c045219
docs: add kentcdodds as a contributor (#135)
allcontributors[bot] Sep 19, 2019
c05ac0b
docs: add noelyoo as a contributor (#136)
allcontributors[bot] Sep 19, 2019
b6db87d
docs: add walter-ind as a contributor (#137)
allcontributors[bot] Sep 19, 2019
7cf04ae
docs: add phryneas as a contributor (#138)
allcontributors[bot] Sep 19, 2019
bdb47b2
docs: add artdent as a contributor (#139)
allcontributors[bot] Sep 19, 2019
2dea878
docs: add Avi98 as a contributor (#140)
allcontributors[bot] Sep 19, 2019
a59c985
docs: add rokoroku as a contributor (#141)
allcontributors[bot] Sep 19, 2019
df67695
Update README.md
ghengeveld Sep 19, 2019
e107a1d
Drop the avatar size and add the badge back.
ghengeveld Sep 19, 2019
95c27d1
Add the All Contributors badge.
ghengeveld Sep 19, 2019
69a13cc
No need to brag.
ghengeveld Sep 19, 2019
b678e3c
docs: add elsangedy as a contributor (#142)
allcontributors[bot] Sep 19, 2019
428256a
Make sure useFetch rejects with an Error type. (#114)
artdent Sep 19, 2019
11d753c
Bump all dependencies. (#147)
ghengeveld Sep 28, 2019
fabbc25
Make sure the promise render prop is always defined (#148)
ghengeveld Sep 28, 2019
3508370
Fix test for promise prop.
ghengeveld Sep 28, 2019
23f8d1e
Use catch instead of then(..., onReject).
ghengeveld Sep 28, 2019
16b9385
Merge branch 'master' into next
ghengeveld Sep 28, 2019
ebe1802
Allow overriding the 'resource' argument of 'fetch' when invokin… (#150)
ghengeveld Sep 28, 2019
a36c8a9
Add upgrade note for v9.
ghengeveld Sep 28, 2019
69c7d08
Lock down all version ranges.
ghengeveld Sep 29, 2019
09d9914
Fix eslint config.
ghengeveld Sep 29, 2019
9faff46
Attempt at fixing CircleCI memory issue.
ghengeveld Sep 29, 2019
3e51b7c
Bump deps.
ghengeveld Sep 29, 2019
11f8996
Update lockfile.
ghengeveld Sep 29, 2019
4cfaa0c
Add experimental Suspense support (#153)
ghengeveld Sep 30, 2019
f3ad45b
Merge branch 'next' into release
ghengeveld Sep 30, 2019
10352c2
Disable propType eslint rule for stories.
ghengeveld Sep 30, 2019
9b05882
Merge branch 'next' into release
ghengeveld Sep 30, 2019
ae4f0fd
Merge branch 'master' into next
ghengeveld Sep 30, 2019
8b8d761
Update dependency now to v16.3.0 (#156)
renovate[bot] Sep 30, 2019
2c769e8
Add CodeFund sponsorship message to README (#144)
Oct 1, 2019
edad9f5
Merge branch 'master' into next
ghengeveld Oct 2, 2019
93c7cbd
Setup gitbook.
ghengeveld Oct 5, 2019
e36cd0f
Fix gitbook config.
ghengeveld Oct 5, 2019
80585db
Use gitbook summary.
ghengeveld Oct 5, 2019
a0567e7
GitBook: [next] 7 pages modified
ghengeveld Oct 5, 2019
fde7e09
Clean up usage examples.
ghengeveld Oct 5, 2019
d3fedaa
Add shortcut links to API docs.
ghengeveld Oct 6, 2019
4c851a4
Move gitbook to docs.
ghengeveld Oct 6, 2019
b6df223
Clean up the readme and docs.
ghengeveld Oct 6, 2019
87dbdef
Fix introduction link.
ghengeveld Oct 6, 2019
86d8051
Restructure docs.
ghengeveld Oct 6, 2019
60b26b0
Place introduction outside the getting started section.
ghengeveld Oct 6, 2019
17496c2
Improve interfaces docs.
ghengeveld Oct 6, 2019
54ce390
Minor improvements.
ghengeveld Oct 6, 2019
00a5820
Fix links.
ghengeveld Oct 6, 2019
fa88098
Fix links.
ghengeveld Oct 6, 2019
3e13ec3
Fix links.
ghengeveld Oct 6, 2019
90b7891
Add createInstance to interfaces.
ghengeveld Oct 6, 2019
3f267a9
Upgrade dependencies and remove the lockfile.
ghengeveld Oct 6, 2019
554b75c
Fix Travis link.
ghengeveld Oct 6, 2019
f6514b8
Minor clarification.
ghengeveld Oct 6, 2019
39d38a5
Make a clear distinction between 'state' and 'options' by avoiding 'p…
ghengeveld Oct 7, 2019
34e2f01
Fix link.
ghengeveld Oct 7, 2019
608f471
Merge branch 'next' into release
ghengeveld Oct 7, 2019
6855a62
Add upgrade docs.
ghengeveld Oct 7, 2019
b629377
Change the way to override 'resource' from useFetch's 'run' function.
ghengeveld Oct 7, 2019
f902546
Avoid memory leaks by using a mock promise.
ghengeveld Oct 7, 2019
9578281
Fix FetchError prototype chain.
ghengeveld Oct 7, 2019
494df62
Avoid using ESLint config override file because CodeFactor doesn't su…
ghengeveld Oct 7, 2019
1223710
Merge branch 'master' into next
ghengeveld Oct 7, 2019
c48f9f4
Merge branch 'next' into release
ghengeveld Oct 7, 2019
2f88009
Make sure neverSettle is an instance of Promise.
ghengeveld Oct 7, 2019
e66dd46
Exclude some impossible to test paths from code coverage.
ghengeveld Oct 7, 2019
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Prev Previous commit
Next Next commit
Add experimental Suspense support (#153)
* Add experimental Suspense support.

* Add PropType and type definition.

* Skip Suspense test when running against 16.3.

* Lock down all version ranges.

* Fix eslint config.

* Disable rules of hooks for examples.

* Attempt at fixing CircleCI memory issue.

* Update lockfile.

* Bump deps.

* Revert "Disable rules of hooks for examples."

This reverts commit d3d931a.
  • Loading branch information
ghengeveld authored Sep 30, 2019
commit 4cfaa0cfa6d84da43123300bc98bdb19a1482bff
18 changes: 18 additions & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -138,6 +138,7 @@ React Async has no direct relation to Concurrent React. They are conceptually cl
meant to make dealing with asynchronous business logic easier. Concurrent React will make those features have less
impact on performance and usability. When Suspense lands, React Async will make full use of Suspense features. In fact,
you can already **start using React Async right now**, and in a later update, you'll **get Suspense features for free**.
In fact, React Async already has experimental support for Suspense, by passing the `suspense` option.

[concurrent react]: https://github.com/sw-yx/fresh-concurrent-react/blob/master/Intro.md#introduction-what-is-concurrent-react

Expand Down Expand Up @@ -441,6 +442,7 @@ These can be passed in an object to `useAsync()`, or as props to `<Async>` and c
- `reducer` State reducer to control internal state updates.
- `dispatcher` Action dispatcher to control internal action dispatching.
- `debugLabel` Unique label used in DevTools.
- `suspense` Enable **experimental** Suspense integration.

`useFetch` additionally takes these options:

Expand Down Expand Up @@ -557,6 +559,22 @@ dispatcher at some point.
A unique label to describe this React Async instance, used in React DevTools (through `useDebugValue`) and React Async
DevTools.

#### `suspense`

> `boolean`

Enables **experimental** Suspense integration. This will make React Async throw a promise while loading, so you can use
Suspense to render a fallback UI, instead of using `<IfPending>`. Suspense differs in 2 main ways:

- `<Suspense>` should be an ancestor of your Async component, instead of a descendant. It can be anywhere up in the
component hierarchy.
- You can have a single `<Suspense>` wrap multiple Async components, in which case it will render the fallback UI until
all promises are settled.

> Note that the way Suspense is integrated right now may change. Until Suspense for data fetching is officially
> released, we may make breaking changes to its integration in React Async in a minor or patch release. Among other
> things, we'll probably add a cache of sorts.

#### `defer`

> `boolean`
Expand Down
1 change: 1 addition & 0 deletions examples/with-suspense/.env
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
SKIP_PREFLIGHT_CHECK=true
7 changes: 7 additions & 0 deletions examples/with-suspense/README.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,7 @@
# Basic fetch with Suspense

This demonstrates how Suspense can be used to render a fallback UI while loading.

<a href="https://react-async.async-library.now.sh/examples/with-suspense">
<img src="https://img.shields.io/badge/live-demo-blue.svg" alt="live demo">
</a>
42 changes: 42 additions & 0 deletions examples/with-suspense/package.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,42 @@
{
"name": "with-suspense-example",
"version": "8.0.0",
"private": true,
"homepage": "https://react-async.async-library.now.sh/examples/with-suspense",
"scripts": {
"postinstall": "relative-deps",
"prestart": "relative-deps",
"prebuild": "relative-deps",
"pretest": "relative-deps",
"start": "react-scripts start",
"build": "react-scripts build",
"test": "react-scripts test",
"now-build": "SKIP_PREFLIGHT_CHECK=true react-scripts build"
},
"dependencies": {
"react": "16.10.1",
"react-async": "8.0.0",
"react-async-devtools": "8.0.0",
"react-dom": "16.10.1",
"react-scripts": "3.1.2"
},
"devDependencies": {
"relative-deps": "0.1.2"
},
"relativeDependencies": {
"react-async": "../../packages/react-async/pkg",
"react-async-devtools": "../../packages/react-async-devtools/pkg"
},
"eslintConfig": {
"extends": "react-app"
},
"browserslist": [
">0.2%",
"not dead",
"not ie <= 11",
"not op_mini all"
],
"engines": {
"node": ">=8"
}
}
Binary file added examples/with-suspense/public/favicon.ico
Binary file not shown.
13 changes: 13 additions & 0 deletions examples/with-suspense/public/index.html
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8" />
<meta name="viewport" content="width=device-width, initial-scale=1, shrink-to-fit=no" />
<meta name="theme-color" content="#000000" />
<title>React App</title>
</head>
<body>
<noscript> You need to enable JavaScript to run this app. </noscript>
<div id="root"></div>
</body>
</html>
29 changes: 29 additions & 0 deletions examples/with-suspense/src/index.css
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
body {
margin: 20px;
padding: 0;
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen", "Ubuntu",
"Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue", sans-serif;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
}

.user {
display: inline-block;
margin: 20px;
text-align: center;
}

.avatar {
background: #eee;
border-radius: 64px;
width: 128px;
height: 128px;
}

.name {
margin-top: 10px;
}

.placeholder {
opacity: 0.5;
}
61 changes: 61 additions & 0 deletions examples/with-suspense/src/index.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,61 @@
import React, { Suspense } from "react"
import { useAsync, IfFulfilled, IfRejected } from "react-async"
import ReactDOM from "react-dom"
import DevTools from "react-async-devtools"
import "./index.css"

const loadUser = ({ userId }) =>
fetch(`https://reqres.in/api/users/${userId}`)
.then(res => (res.ok ? res : Promise.reject(res)))
.then(res => res.json())
.then(({ data }) => data)

const UserPlaceholder = () => (
<div className="user placeholder">
<div className="avatar" />
<div className="name">══════</div>
</div>
)

const UserDetails = ({ data }) => (
<div className="user">
<img className="avatar" src={data.avatar} alt="" />
<div className="name">
{data.first_name} {data.last_name}
</div>
</div>
)

const User = ({ userId }) => {
const state = useAsync({
suspense: true,
promiseFn: loadUser,
debugLabel: `User ${userId}`,
userId,
})
return (
<>
<IfFulfilled state={state}>{data => <UserDetails data={data} />}</IfFulfilled>
<IfRejected state={state}>{error => <p>{error.message}</p>}</IfRejected>
</>
)
}

export const App = () => (
<>
<DevTools />
<Suspense
fallback={
<>
<UserPlaceholder />
<UserPlaceholder />
</>
}
>
<User userId={1} />
<User userId={2} />
</Suspense>
</>
)

if (process.env.NODE_ENV !== "test") ReactDOM.render(<App />, document.getElementById("root"))
9 changes: 9 additions & 0 deletions examples/with-suspense/src/index.test.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
import React from "react"
import ReactDOM from "react-dom"
import { App } from "./"

it("renders without crashing", () => {
const div = document.createElement("div")
ReactDOM.render(<App />, div)
ReactDOM.unmountComponentAtNode(div)
})
6 changes: 5 additions & 1 deletion packages/react-async/src/Async.js
Original file line number Diff line number Diff line change
Expand Up @@ -193,7 +193,11 @@ export const createInstance = (defaultProps = {}, displayName = "Async") => {
}

render() {
const { children } = this.props
const { children, suspense } = this.props
if (suspense && this.state.isPending && this.promise !== neverSettle) {
// Rely on Suspense to handle the loading state
throw this.promise
}
if (typeof children === "function") {
return <Provider value={this.state}>{children(this.state)}</Provider>
}
Expand Down
1 change: 1 addition & 0 deletions packages/react-async/src/index.d.ts
Original file line number Diff line number Diff line change
Expand Up @@ -50,6 +50,7 @@ export interface AsyncOptions<T> {
props: AsyncProps<T>
) => void
debugLabel?: string
suspense?: boolean
[prop: string]: any
}

Expand Down
1 change: 1 addition & 0 deletions packages/react-async/src/propTypes.js
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ export default PropTypes && {
reducer: PropTypes.func,
dispatcher: PropTypes.func,
debugLabel: PropTypes.string,
suspense: PropTypes.bool,
},
Initial: {
children: childrenFn.isRequired,
Expand Down
17 changes: 16 additions & 1 deletion packages/react-async/src/specs.js
Original file line number Diff line number Diff line change
Expand Up @@ -2,7 +2,7 @@
/* eslint-disable react/prop-types */

import "@testing-library/jest-dom/extend-expect"
import React from "react"
import React, { Suspense } from "react"
import { render, fireEvent } from "@testing-library/react"

export const resolveIn = ms => value => new Promise(resolve => setTimeout(resolve, ms, value))
Expand Down Expand Up @@ -65,6 +65,21 @@ export const common = Async => () => {
await findByText("done")
expect(onCancel).not.toHaveBeenCalled()
})

// Skip when testing for backwards-compatibility with React 16.3
const testSuspense = Suspense ? test : test.skip
testSuspense("supports Suspense", async () => {
const promiseFn = () => resolveIn(150)("done")
const { findByText } = render(
<Suspense fallback={<div>fallback</div>}>
<Async suspense promiseFn={promiseFn}>
{({ data }) => data || null}
</Async>
</Suspense>
)
await findByText("fallback")
await findByText("done")
})
}

export const withPromise = Async => () => {
Expand Down
5 changes: 5 additions & 0 deletions packages/react-async/src/useAsync.js
Original file line number Diff line number Diff line change
Expand Up @@ -147,6 +147,11 @@ const useAsync = (arg1, arg2) => {

useDebugValue(state, ({ status }) => `[${counter.current}] ${status}`)

if (options.suspense && state.isPending && lastPromise.current !== neverSettle) {
// Rely on Suspense to handle the loading state
throw lastPromise.current
}

return useMemo(
() => ({
...state,
Expand Down
15 changes: 11 additions & 4 deletions stories/index.stories.js
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
import React from "react"
import React, { Suspense } from "react"
import { storiesOf } from "@storybook/react"

import { useAsync } from "../packages/react-async/src"
Expand Down Expand Up @@ -43,9 +43,16 @@ const App = () => {
return (
<>
<DevTools />
<Photo photoId={1} />
<Photo photoId={2} />
<Photo photoId={3} />
<div>
<Photo photoId={1} />
<Photo photoId={2} />
<Photo photoId={3} />
</div>
<Suspense fallback={<>Suspended...</>}>
<Photo suspense photoId={4} />
<Photo suspense photoId={5} />
<Photo suspense photoId={6} />
</Suspense>
</>
)
}
Expand Down