diff --git a/webclient/src/App.js b/webclient/src/App.js index 4495d6c..87e7c7e 100644 --- a/webclient/src/App.js +++ b/webclient/src/App.js @@ -1,4 +1,4 @@ -import React from 'react'; +import React, { useState, useEffect, useRef, useCallback } from 'react'; import { BrowserRouter as Router, Route, Link, Switch } from 'react-router-dom'; import localForage from 'localforage'; import './Style-light.css'; @@ -15,70 +15,63 @@ import Submit from './Submit.js'; import Results from './Results.js'; import ScrollToTop from './ScrollToTop.js'; -class App extends React.Component { - constructor(props) { - super(props); +function App() { + const [theme, setTheme] = useState(localStorage.getItem('theme') || ''); + const cache = useRef({}); + const [isFullScreen, setIsFullScreen] = useState(!!document.fullscreenElement); - this.state = { - theme: localStorage.getItem('theme') || '', - }; + const updateCache = useCallback((key, value) => { + cache.current[key] = value; + }, []); - this.cache = {}; - } - - updateCache = (key, value) => { - this.cache[key] = value; - } - - light() { - this.setState({ theme: '' }); + const light = () => { + setTheme(''); localStorage.setItem('theme', ''); - } + }; - dark() { - this.setState({ theme: 'dark' }); + const dark = () => { + setTheme('dark'); localStorage.setItem('theme', 'dark'); - } + }; - black() { - this.setState({ theme: 'black' }); + const black = () => { + setTheme('black'); localStorage.setItem('theme', 'black'); - } + }; - red() { - this.setState({ theme: 'red' }); + const red = () => { + setTheme('red'); localStorage.setItem('theme', 'red'); - } + }; - componentDidMount() { - if (!this.cache.length) { + useEffect(() => { + if (Object.keys(cache.current).length === 0) { localForage.iterate((value, key) => { - this.updateCache(key, value); + updateCache(key, value); + }).then(() => { + console.log('loaded cache from localforage'); }); - console.log('loaded cache from localforage'); } - } + }, [updateCache]); - goFullScreen() { + const goFullScreen = () => { if ('wakeLock' in navigator) { navigator.wakeLock.request('screen'); } - - document.body.requestFullscreen({ navigationUI: 'hide' }).then(() => { - window.addEventListener('resize', () => this.forceUpdate()); - this.forceUpdate(); - }); + document.body.requestFullscreen({ navigationUI: 'hide' }); }; - exitFullScreen() { - document.exitFullscreen().then(() => { - this.forceUpdate(); - }); + const exitFullScreen = () => { + document.exitFullscreen(); }; - render() { - const theme = this.state.theme; + useEffect(() => { + const onFullScreenChange = () => setIsFullScreen(!!document.fullscreenElement); + document.addEventListener('fullscreenchange', onFullScreenChange); + return () => document.removeEventListener('fullscreenchange', onFullScreenChange); + }, []); + useEffect(() => { if (theme === 'dark') { document.body.style.backgroundColor = '#1a1a1a'; } else if (theme === 'black') { @@ -88,49 +81,49 @@ class App extends React.Component { } else { document.body.style.backgroundColor = '#eeeeee'; } + }, [theme]); - const fullScreenAvailable = document.fullscreenEnabled || - document.mozFullscreenEnabled || - document.webkitFullscreenEnabled || - document.msFullscreenEnabled; + const fullScreenAvailable = document.fullscreenEnabled || + document.mozFullscreenEnabled || + document.webkitFullscreenEnabled || + document.msFullscreenEnabled; - return ( -
- QotNews + return ( +
+ QotNews
- this.light()}>Light - this.dark()}>Dark - this.black()}>Black - this.red()}>Red
-
- Hacker News, Reddit, Lobsters, and Tildes articles rendered in reader mode.
-