diff options
author | Sebastian <sebasjm@gmail.com> | 2021-08-23 16:46:06 -0300 |
---|---|---|
committer | Sebastian <sebasjm@gmail.com> | 2021-08-23 16:48:30 -0300 |
commit | 38acabfa6089ab8ac469c12b5f55022fb96935e5 (patch) | |
tree | 453dbf70000cc5e338b06201af1eaca8343f8f73 /preact/demo/nested-suspense/index.js | |
parent | f26125e039143b92dc0d84e7775f508ab0cdcaa8 (diff) | |
download | node-vendor-38acabfa6089ab8ac469c12b5f55022fb96935e5.tar.gz node-vendor-38acabfa6089ab8ac469c12b5f55022fb96935e5.tar.bz2 node-vendor-38acabfa6089ab8ac469c12b5f55022fb96935e5.zip |
Diffstat (limited to 'preact/demo/nested-suspense/index.js')
-rw-r--r-- | preact/demo/nested-suspense/index.js | 69 |
1 files changed, 69 insertions, 0 deletions
diff --git a/preact/demo/nested-suspense/index.js b/preact/demo/nested-suspense/index.js new file mode 100644 index 0000000..6c525b3 --- /dev/null +++ b/preact/demo/nested-suspense/index.js @@ -0,0 +1,69 @@ +import { createElement, Suspense, lazy, Component } from 'react'; + +const Loading = function() { + return <div>Loading...</div>; +}; +const Error = function({ resetState }) { + return ( + <div> + Error! + <a onClick={resetState} href="#"> + Reset app + </a> + </div> + ); +}; + +const pause = timeout => + new Promise(d => setTimeout(d, timeout), console.log(timeout)); + +const DropZone = lazy(() => + pause(Math.random() * 1000).then(() => import('./dropzone.js')) +); +const Editor = lazy(() => + pause(Math.random() * 1000).then(() => import('./editor.js')) +); +const AddNewComponent = lazy(() => + pause(Math.random() * 1000).then(() => import('./addnewcomponent.js')) +); +const GenerateComponents = lazy(() => + pause(Math.random() * 1000).then(() => import('./component-container.js')) +); + +export default class App extends Component { + state = { hasError: false }; + + static getDerivedStateFromError(error) { + // Update state so the next render will show the fallback UI. + console.warn(error); + return { hasError: true }; + } + + render() { + return this.state.hasError ? ( + <Error resetState={() => this.setState({ hasError: false })} /> + ) : ( + <Suspense fallback={<Loading />}> + <DropZone appearance={0} /> + <Editor title="APP_TITLE"> + <main> + <Suspense fallback={<Loading />}> + <GenerateComponents appearance={1} /> + </Suspense> + <AddNewComponent appearance={2} /> + </main> + <aside> + <section> + <Suspense fallback={<Loading />}> + <GenerateComponents appearance={3} /> + </Suspense> + <AddNewComponent appearance={4} /> + </section> + </aside> + </Editor> + + <footer>Footer here</footer> + </Suspense> + ); + } +} |