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