Files
AG2L-pwa/pages/_app.js
T
2019-02-11 14:58:45 +01:00

126 lines
3.5 KiB
JavaScript

import React from 'react';
import App, { Container } from 'next/app';
import { MuiThemeProvider } from '@material-ui/core/styles';
import CssBaseline from '@material-ui/core/CssBaseline';
import JssProvider from 'react-jss/lib/JssProvider';
import getPageContext from '../src/getPageContext';
import Router from 'next/router'
import getConfig from 'next/config'
import Head from 'next/head'
import { initGA, logPageView } from '../utils/analytics'
const { publicRuntimeConfig } = getConfig()
function tokenIsValid(tokenExpireString) {
if (!!tokenExpireString)
return true
let tokenExpireDate = new Date(tokenExpireString)
return (tokenExpireDate.getTime() > Date().now.getTime())
}
class MyApp extends App {
constructor(props) {
super(props);
this.pageContext = getPageContext();
}
pageContext = null;
static async getInitialProps({ Component, ctx }) {
let err = false;
let pageProps = {}
if (Component.getInitialProps) {
pageProps = await Component.getInitialProps(ctx)
}
return { pageProps: { ...pageProps } }
}
async componentDidMount() {
// Remove the server-side injected CSS.
const jssStyles = document.querySelector('#jss-server-side');
if (jssStyles && jssStyles.parentNode) {
jssStyles.parentNode.removeChild(jssStyles);
}
if (process.env.DEV !== 1) {
initGA()
logPageView()
Router.router.events.on('routeChangeComplete', logPageView)
}
if (!!localStorage.AG2LToken
|| (!!localStorage.AG2LTokenExpireDateTime && tokenIsValid(localStorage.AG2LTokenExpireDateTime))) {
const res = await fetch(publicRuntimeConfig.apiUrl.token,
{
method: "POST",
headers: {
"Accept": "application/json"
},
body: 'username=AG2L&grant_type=password&password=AG2L'
})
if(res.ok == true)
{
const data = await res.json()
localStorage.AG2LToken = data.access_token
localStorage.AG2LTokenExpireDateTime = new Date(Date.now() + data.expires_in).getTime()
}
else
{
//TODO: + trycatch
}
}
}
componentWillUnmount() {
if (process.env.DEV !== 1) {
Router.router.events.off('routeChangeComplete', logPageView);
}
}
render() {
const { Component, pageProps, menu } = this.props;
return (
<Container>
<Head>
<title>e-declic</title>
</Head>
{/* Wrap every page in Jss and Theme providers */}
<JssProvider
registry={this.pageContext.sheetsRegistry}
generateClassName={this.pageContext.generateClassName}
>
{/* MuiThemeProvider makes the theme available down the React
tree thanks to React context. */}
<MuiThemeProvider
theme={this.pageContext.theme}
sheetsManager={this.pageContext.sheetsManager}
>
{/* CssBaseline kickstart an elegant, consistent, and simple baseline to build upon. */}
<CssBaseline />
{/* Pass pageContext to the _document though the renderPage enhancer
to render collected styles on server side.
messagingSingleton={messagingSingleton} */}
<Component pageContext={this.pageContext} menu={menu} {...pageProps} />
</MuiThemeProvider>
</JssProvider>
<noscript>This is a modern pwa site. You must allow javascript !</noscript>
</Container>
);
}
}
export default MyApp;