swyxio / async-react-future

high level api's to try with async react
https://codesandbox.io/s/ryrk0o5xzm
20 stars 1 forks source link

async-react-future - import * from './future' today!

A compilation of everything everyone is doing with Async React, for easy demoing and experimentation.

WARNING: THIS IS NOT TO BE USED FOR PRODUCTION

This library helps people experiment with Async React as explored by the community.

NPM

See it in action

Non Suspense Demo Clones ### Simple movie demo clone - no Suspense, no react-loadable [![Edit async-react-future simple non suspense clone](https://codesandbox.io/static/img/play-codesandbox.svg)](https://codesandbox.io/s/0po13wpz6v) ### Movie demo clone - no Suspense, with react-loadable [![Edit async-react-future react-loadable non suspense clone](https://codesandbox.io/static/img/play-codesandbox.svg)](https://codesandbox.io/s/wn4w6ywqxw)

Full movie demo clone - with Suspense

Edit async-react-future demo clone


Install

npm install --save async-react-future

API Documentation

Note: all of the below must be used inside ReactDOM's coming <AsyncMode>.

./future

Dan Movie Demo Components

Placeholder > Placeholder component from Dan's demo This is a simple wrapper for Timeout; frankly if you know Timeout well you don't have to use this. You want one of these above any suspending you're going to do. #### Props ```js const { delayMs = 1, // note that react has hardcorded expirations at 1s and 5s fallback = 'Loading', // any jsx here will do children // required } = props; ``` #### Usage Example ```js import { future: { Placeholder } } from 'async-react-future'; // later... }> {/* stuff with suspenders in here */} ```
Component > new React.Component from Dan's demo Just adds deferSetState to React.Component, which passes things through ReactDom.deferredUpdates before setting component state #### Props N/A #### Usage Example ```js import { future: { Component } } from 'async-react-future'; class App extends Component { state = { showDetail: false }; handleClick = id => { this.deferSetState({ showDetail: true }); }; render() { // use this.handleClick somewhere } } ```
Img > Img component from Dan's demo Suspends image fetching. pretty much. #### Props ```js const { src, // required alt = '', // probably required ...rest } = props; ``` #### Usage Example ```js import { future: { Img } } from 'async-react-future'; // later poster ```

Misc components

Never > Never component from Suspense test Throws a promise that resolves after some arbitrarily large number of seconds. The idea is that this component will never resolve. It's always wrapped by a Timeout. Source: https://github.com/acdlite/react/blob/7166ce6d9b7973ddd5e06be9effdfaaeeff57ed6/packages/react-reconciler/src/__tests__/ReactSuspense-test.js#L558 #### Props N/A #### Usage Example ```js import { future: { Never } } from 'async-react-future'; function Delay({ms}) { return ( {didTimeout => { if (didTimeout) { // Once ms has elapsed, render null. This allows the rest of the // tree to resume rendering. return null; } return ; }} ); } ```
Delay > Delay component from Suspense test Delay a render of peer components by `ms` milliseconds. Can be used to debounce, for example. Once ms has elapsed, render null. This allows the rest of the tree to resume rendering. Source: https://github.com/acdlite/react/blob/7166ce6d9b7973ddd5e06be9effdfaaeeff57ed6/packages/react-reconciler/src/__tests__/ReactSuspense-test.js#L558 #### Props N/A #### Usage Example ```js import React, {Fragment} from 'react'; import { future: { Delay } } from 'async-react-future'; function DebouncedText({text, ms}) { return ( {/* defined elsewhere */} ); } ```
LowPriority > LowPriority component from Peggy's ReactEurope demo Defers (makes low priority) prop changes to its children through manipulating a `value` prop on a `stateKey`. from https://github.com/peggyrayzis/react-europe-apollo #### Props ```js const { stateKey, // required, string value, // required, any children // function as a child, gets the deferred props passed to LowPriority } = this.props; ``` #### Usage Example ```js import { future: { LowPriority } } from 'async-react-future'; import React, {Timeout} from 'react' // later {/* not deferred */} {selectedDog => ( // deferred {expired => expired && selectedDog ? ( {/* defined elsewhere */} ) : ( {/* defined elsewhere */} ) } )} ```

./mockapi

Raw Data > Raw movie data to make demo clones * moviesOverview (array of movie objects) * movieDetailsJSON (an object map of movie id: movie detail object) * movieReviewsJSON (an object map of movie id: movie review object) #### Usage Example ```js import { mockapi: { moviesOverview }, movieDemo: { MovieListPage} } from 'async-react-future'; // later ```
Fetch Data > Async wrappers with delays for the raw data * fetchMovieList * fetchMovieDetails * fetchMovieReviews #### Usage Example ```js import { future: { createFetcher }, mockapi: { fetchMofetchMovieReviewsvieList }, movieDemo: { MovieListPage} } from 'async-react-future'; const movieReviewsFetcher = createFetcher(fetchMovieReviews); function MovieReviews({ movieId }) { const reviews = movieReviewsFetcher.read(movieId); return
{reviews.map(review =>
{review}
)}
; } ```
Utilities Just a `delay` function for now #### Usage Example ```js export const fetchMovieDetails = async (id, delayMS = 100) => { await delay(delayMS); return movieDetailsJSON[id]; }; ```

./movieDemo

Styled components that help to rapidly recreate demo clones and minimize code people have to dig through.

Pages

MovieListPage > A MovieListPage A MovieListPage #### Usage Example ```js import { mockapi: { moviesOverview }, movieDemo: { MovieListPage} } from 'async-react-future'; // later ```

The rest of this documentation is yet to be completed.

Utilities

Spinner > A simple Spinner A simple css spinner that always spins, pass `size={'large'}` for 2x size #### Usage Example ```js import { future: { Placeholder } movieDemo: { Spinner } } from 'async-react-future'; // later... }> {/* stuff with suspenders in here */} ```

Attribution

I have studied a lot of people's code and you are likely to see shades of your code pop up here and there. I don't claim any rights at all to any of this. I'll try to attribute as many people as possible but apologies in advance if I forgot to include you.

Library was bootstrapped with: https://github.com/transitive-bullshit/create-react-library

License

MIT © sw-yx