removed language support for App and made it a functional component

This commit is contained in:
Kim, Jimin 2021-12-15 10:21:43 +09:00
parent d86e5ae002
commit 591aeec9ad

View file

@ -1,4 +1,4 @@
import React from "react" import React, { useEffect, useState } from "react"
import { Routes, Route } from "react-router-dom" import { Routes, Route } from "react-router-dom"
import styled, { import styled, {
ThemeProvider, ThemeProvider,
@ -249,25 +249,13 @@ const StyledContentContainer = styled.div`
margin-top: 5rem; margin-top: 5rem;
` `
interface AppProps {} const App = () => {
const [isLoading, setIsLoading] = useState(true)
const [currentTheme, setCurrentTheme] = useState(
storage.getItem("theme") || "dark" // get theme from storage and set to "dark" mode if not set already
)
interface AppState { useEffect(() => {
isLoading: boolean
currentTheme: string
currentLanguage: string
}
export default class App extends React.Component<AppProps, AppState> {
constructor(props: AppProps) {
super(props)
this.state = {
isLoading: true,
currentTheme: storage.getItem("theme") || "dark", // get theme from storage and set to "dark" mode if not set already
currentLanguage: storage.getItem("lang") || "en", // get language from storage and set to "en" if not set already
}
}
componentDidMount() {
// show loading screen until all fonts are loaded. // show loading screen until all fonts are loaded.
// Experimental feature. Not fully supported on all browsers (IE, I'm looking at you). // Experimental feature. Not fully supported on all browsers (IE, I'm looking at you).
// https://developer.mozilla.org/en-US/docs/Web/API/FontFaceSet // https://developer.mozilla.org/en-US/docs/Web/API/FontFaceSet
@ -275,26 +263,18 @@ export default class App extends React.Component<AppProps, AppState> {
// checks if document.fonts.onloadingdone is supported on the browser // checks if document.fonts.onloadingdone is supported on the browser
if (typeof document.fonts.onloadingdone != undefined) { if (typeof document.fonts.onloadingdone != undefined) {
document.fonts.onloadingdone = () => { document.fonts.onloadingdone = () => {
this.setState({ isLoading: false }) setIsLoading(false)
} }
} else { } else {
this.setState({ isLoading: false }) setIsLoading(false)
}
} }
}, [])
componentDidUpdate(_: AppProps, prevState: AppState) { useEffect(() => {
if (this.state.currentTheme !== prevState.currentTheme) {
// save theme when it is changed // save theme when it is changed
storage.setItem("theme", this.state.currentTheme) storage.setItem("theme", currentTheme)
} }, [currentTheme])
if (this.state.currentLanguage !== prevState.currentLanguage) {
// save language when it is changed
storage.setItem("lang", this.state.currentLanguage)
}
}
render() {
if (isIE) if (isIE)
return ( return (
<IENotSupported> <IENotSupported>
@ -305,21 +285,16 @@ export default class App extends React.Component<AppProps, AppState> {
return ( return (
<ThemeProvider <ThemeProvider
theme={{ theme={{
currentTheme: this.state.currentTheme, currentTheme: currentTheme,
setTheme: (setThemeTo) => setTheme: (setThemeTo) => {
this.setState({ currentTheme: setThemeTo }), // make setTheme function available in other components setCurrentTheme(setThemeTo)
},
}} }}
> >
<Helmet> <Helmet>
<meta property="og:site_name" content="developomp" /> <meta property="og:site_name" content="developomp" />
<meta property="og:title" content="Home" /> <meta property="og:title" content="Home" />
<meta property="og:description" content="developomp's blog" />
<meta
property="og:description"
content="developomp's blog"
/>
<meta property="og:url" content={process.env.PUBLIC_URL} /> <meta property="og:url" content={process.env.PUBLIC_URL} />
</Helmet> </Helmet>
@ -327,7 +302,7 @@ export default class App extends React.Component<AppProps, AppState> {
<Navbar /> <Navbar />
<StyledContentContainer> <StyledContentContainer>
{this.state.isLoading ? ( {isLoading ? (
<Loading /> <Loading />
) : ( ) : (
<Routes> <Routes>
@ -345,5 +320,6 @@ export default class App extends React.Component<AppProps, AppState> {
<Footer /> <Footer />
</ThemeProvider> </ThemeProvider>
) )
}
} }
export default App