| 1 | import React, {Component, Suspense, startTransition} from 'react'; |
| 2 | |
| 3 | import Theme, {ThemeToggleButton} from './Theme'; |
| 4 | |
| 5 | import './Chrome.css'; |
| 6 | |
| 7 | import LargeContent from './LargeContent'; |
| 8 | |
| 9 | export default class Chrome extends Component { |
| 10 | state = {theme: 'light'}; |
| 11 | render() { |
| 12 | const assets = this.props.assets; |
| 13 | return ( |
| 14 | <html lang="en"> |
| 15 | <head> |
| 16 | <meta charSet="utf-8" /> |
| 17 | <meta name="viewport" content="width=device-width, initial-scale=1" /> |
| 18 | <link rel="shortcut icon" href="favicon.ico" /> |
| 19 | <link rel="stylesheet" href={assets['main.css']} /> |
| 20 | <title>{this.props.title}</title> |
| 21 | </head> |
| 22 | <body className={this.state.theme}> |
| 23 | <noscript |
| 24 | dangerouslySetInnerHTML={{ |
| 25 | __html: `<b>Enable JavaScript to run this app.</b>`, |
| 26 | }} |
| 27 | /> |
| 28 | <Suspense fallback="Loading..."> |
| 29 | <Theme.Provider value={this.state.theme}> |
| 30 | <div> |
| 31 | <ThemeToggleButton |
| 32 | onChange={theme => { |
| 33 | startTransition(() => { |
| 34 | this.setState({theme}); |
| 35 | }); |
| 36 | }} |
| 37 | /> |
| 38 | </div> |
| 39 | {this.props.children} |
| 40 | </Theme.Provider> |
| 41 | </Suspense> |
| 42 | <LargeContent /> |
| 43 | <script |
| 44 | dangerouslySetInnerHTML={{ |
| 45 | __html: `assetManifest = ${JSON.stringify(assets)};`, |
| 46 | }} |
| 47 | /> |
| 48 | </body> |
| 49 | </html> |
| 50 | ); |
| 51 | } |
| 52 | } |