From c2e3ab5df441e298fbc07e26eec69679fb681b31 Mon Sep 17 00:00:00 2001
From: meskio <meskio@sindominio.net>
Date: Sat, 19 Sep 2020 13:24:49 +0200
Subject: [PATCH] Add router and dashboard

---
 package.json     |  1 +
 src/App.js       | 20 +++++++++-------
 src/Dashboard.js | 59 ++++++++++++++++++++++++++++++++++++++++++++++++
 src/Head.js      |  4 ++++
 4 files changed, 76 insertions(+), 8 deletions(-)
 create mode 100644 src/Dashboard.js

diff --git a/package.json b/package.json
index 1fc5beb..9b39a3a 100644
--- a/package.json
+++ b/package.json
@@ -10,6 +10,7 @@
     "react": "^16.13.1",
     "react-bootstrap": "^1.3.0",
     "react-dom": "^16.13.1",
+    "react-router-dom": "^5.2.0",
     "react-scripts": "3.4.3"
   },
   "scripts": {
diff --git a/src/App.js b/src/App.js
index 39d46e6..6b9a965 100644
--- a/src/App.js
+++ b/src/App.js
@@ -1,6 +1,7 @@
 import React from 'react';
-//import { BrowserRouter, Switch, Route } from 'react-router-dom';
+import { BrowserRouter, Switch, Route } from 'react-router-dom';
 import MemberList from './member';
+import Dashboard from './Dashboard';
 import AuthContext from './AuthContext';
 import SignIn from './SignIn';
 import Head from './Head';
@@ -9,15 +10,18 @@ function Panel(props) {
     return (
         <div>
             <Head onLogout={props.onLogout} />
-            <MemberList />
-        </div>
-    );
-          /*<BrowserRouter>
+            <BrowserRouter>
               <Switch>
-                  <Route path="/sign-in" component={SignIn} />
-                  <Route path="/" component={Head} />
+                <Route path="/members">
+                    <MemberList />
+                </Route>
+                <Route path="/">
+                    <Dashboard />
+                </Route>
               </Switch>
-          </BrowserRouter>*/
+            </BrowserRouter>
+        </div>
+    );
 }
 
 class App extends React.Component {
diff --git a/src/Dashboard.js b/src/Dashboard.js
new file mode 100644
index 0000000..104ba0c
--- /dev/null
+++ b/src/Dashboard.js
@@ -0,0 +1,59 @@
+import React from 'react';
+import AuthContext from './AuthContext';
+import { Container, Spinner, Alert, Row } from 'react-bootstrap';
+
+class Dashboard extends React.Component {
+    static contextType = AuthContext;
+
+    constructor(props) {
+        super(props);
+        this.state = {
+            name: null,
+            balance: null,
+            isLoading: false,
+            error: null
+        };
+    }
+
+    componentDidMount() {
+        this.setState({ isLoading: true });
+
+        fetch('/api/member/'+this.context.num.toString(),
+              { headers: { 'x-authentication': this.context.token }})
+            .then(response => {
+                if (!response.ok) {
+                    throw new Error(response.status.toString()+' '+response.statusText);
+                }
+                return response.json();
+            })
+            .then(member => this.setState({ balance: member.balance, name: member.name, isLoading: false }))
+            .catch(e => this.setState({ error: e.message, isLoading: false }));
+    }
+
+    render() {
+        if (this.state.isLoading) {
+            return (
+              <Row className="justify-content-md-center">
+                <Spinner animation="border" />
+              </Row>
+            );
+        }
+
+        if (this.state.error != null) {
+            return (
+                <Alert variant="danger">
+                   Ha ocurrido un error cargando tu saldo: {this.state.error}
+                </Alert>
+            );
+        }
+
+        return (
+            <Container>
+                <h1>{this.state.name}</h1>
+                <p>Saldo: {(this.state.balance/100).toFixed(2)}</p>
+            </Container>
+        );
+    }
+}
+
+export default Dashboard;
diff --git a/src/Head.js b/src/Head.js
index f885d69..f9a141d 100644
--- a/src/Head.js
+++ b/src/Head.js
@@ -10,6 +10,10 @@ function Head(props) {
             </Navbar.Brand>
             <Navbar.Toggle aria-controls="basic-navbar-nav" />
             <Navbar.Collapse id="basic-navbar-nav">
+                <Nav className="mr-auto">
+                    <Nav.Link href="/">Dashboard</Nav.Link>
+                    <Nav.Link href="/members">Socias</Nav.Link>
+                </Nav>
                 <Form inline>
                   <Button
                     variant="outline-success"
-- 
GitLab