use ESM, add server setup, cleanup

Change-Id: Iafac35c2082523ae98c31017d9bad5c4d6e18ef3
diff --git a/client/src/App.js b/client/src/App.js
index 10db90a..cc1b5bf 100644
--- a/client/src/App.js
+++ b/client/src/App.js
@@ -3,52 +3,59 @@
   Author: Larbi Gharib <larbi.gharib@savoirfairelinux.com>
   License: AGPL-3
 */
-
-import React from 'react';
-import CssBaseline from '@material-ui/core/CssBaseline';
+import React, { useState, useEffect } from 'react'
+import { Route, Switch, Redirect, useHistory, useLocation } from 'react-router-dom'
+import { CircularProgress, Container, CssBaseline } from '@material-ui/core'
 import authManager from './AuthManager'
-//import logo from './logo.svg';
-import './App.scss';
-
-import { BrowserRouter as Router, Route, Switch, Link, Redirect } from 'react-router-dom';
+//import logo from './logo.svg'
+import './App.scss'
 
 import SignInPage from "./pages/loginDialog.jsx"
 import JamiMessenger from "./pages/messenger.jsx"
 import AccountSettings from "./pages/accountSettings.jsx"
 import AccountSelection from "./pages/accountSelection.jsx"
-import AddContactPage from "./pages/addContactPage.jsx"
-
+import ServerSetup from "./pages/serverSetup.jsx"
 import NotFoundPage from "./pages/404.jsx"
 
-class App extends React.Component {
-  constructor(props) {
-    super(props);
-    this.state = {
-      authenticated: authManager.isAuthenticated(),
-    };
-    authManager.setOnAuthChanged(authenticated => this.setState({authenticated}))
-  }
+const App = (props) => {
+    const history = useHistory()
+    const { location } = useLocation()
+    const [state, setState] = useState({
+      loaded: false,
+      auth: authManager.getState()
+    })
+    useEffect(() => {
+      authManager.init(auth => {
+        setState({ loaded: true, auth })
+      })
+      return () => authManager.deinit()
+    }, []);
 
-  render() {
     console.log("App render")
-    console.log(this.props)
+    console.log(state)
+    console.log(location)
 
-      return <React.Fragment>
-        <CssBaseline />
-        <Router>
-          <Switch>
-            <Route exact path="/"><Redirect to="/account" /></Route>
-            <Route path="/account/:accountId/settings" component={AccountSettings} />
-            <Route path="/account/:accountId/addContact/:contactId" component={JamiMessenger} />
-            <Route path="/account/:accountId/conversation/:conversationId" component={JamiMessenger} />
-            <Route path="/account/:accountId" component={JamiMessenger} />
-            <Route path="/account" component={AccountSelection} />
-            <Route component={NotFoundPage} />
-          </Switch>
-        </Router>
-        {!this.state.authenticated && <SignInPage open={!this.state.authenticated}/>}
-      </React.Fragment>
-  }
+    if (!state.loaded) {
+      return <Container><CircularProgress /></Container>
+    } else if (!state.auth.setupComplete) {
+      return <Switch>
+          <Route path="/setup" component={ServerSetup} />
+          <Route><Redirect to="/setup" /></Route>
+        </Switch>
+    }
+    return <React.Fragment>
+      <CssBaseline />
+        <Switch>
+          <Route exact path="/"><Redirect to="/account" /></Route>
+          <Route path="/account/:accountId/settings" component={AccountSettings} />
+          <Route path="/account/:accountId/addContact/:contactId" component={JamiMessenger} />
+          <Route path="/account/:accountId/conversation/:conversationId" component={JamiMessenger} />
+          <Route path="/account/:accountId" component={JamiMessenger} />
+          <Route path="/account" component={AccountSelection} />
+          <Route component={NotFoundPage} />
+        </Switch>
+      {!state.auth.authenticated && <SignInPage open={!state.auth.authenticated}/>}
+    </React.Fragment>
 }
 
-export default App
\ No newline at end of file
+export default App