Added base app

Has basic login UI, has methods to run speedtests
This commit is contained in:
Henry Whitaker
2020-04-08 13:57:26 +01:00
parent e9fdc98fd3
commit 0062ac6960
114 changed files with 120193 additions and 1 deletions

89
resources/js/components/ErrorPage.js vendored Normal file
View File

@@ -0,0 +1,89 @@
import React, { Component } from 'react';
import ReactDOM from 'react-dom';
import { BrowserRouter, Route, Link } from "react-router-dom";
import { Container } from 'react-bootstrap';
import { Row } from 'react-bootstrap';
import { Col } from 'react-bootstrap';
import { Button } from 'react-bootstrap';
export default class ErrorPage extends Component {
constructor(props) {
super(props);
var colour = '';
var message = false;
switch(this.props.code.toString()[0]) {
case 2:
case '2':
colour = 'success';
break;
case 4:
case '4':
colour = 'danger';
break;
case 5:
case '5':
default:
colour = 'warning';
break;
}
switch(this.props.code) {
case '400':
message = 'Bad request'
break;
case '401':
message = 'You aren\'t authenticated';
break;
case '403':
message = 'You aren\'t authorised to view this page';
break;
case '404':
message = 'Page not found';
break;
case '405':
message = 'Method not allowed'
break;
case '413':
message = 'Request too large'
break;
case '422':
message = 'Your request was unprocessable'
break;
}
this.state = {
code: this.props.code,
colour: colour,
message: message
};
}
render() {
const colour = this.state.colour;
const code = this.state.code;
const message = this.state.message;
return (
<Container fluid>
<Row className="fullscreen text-center align-items-center">
<Col
lg={{ span: 2, offset: 5}}
md={{ span: 4, offset: 4}}
sm={{ span: 4, offset: 4}}
xs={{ span: 12}}
>
<h1 className={'text-' + colour + ' mb-0'}>{code}</h1>
{message &&
<p className={colour + '-text mt-0 mb-2'}>{message}</p>
}
<Link to="/" className={'waves-effect waves-' + colour + ' btn ' + colour}><Button variant={colour}>Go home</Button></Link>
</Col>
</Row>
</Container>
);
}
}
if (document.getElementById('errorpage')) {
ReactDOM.render(<ErrorPage />, document.getElementById('errorpage'));
}

23
resources/js/components/Example.js vendored Normal file
View File

@@ -0,0 +1,23 @@
import React, { Component } from 'react';
import ReactDOM from 'react-dom';
export default class Index extends Component {
constructor(props) {
super(props)
this.state = {
}
}
render() {
return (
<div>
</div>
);
}
}
if (document.getElementById('main')) {
ReactDOM.render(<Index />, document.getElementById('main'));
}

View File

@@ -0,0 +1,24 @@
import React, { Component } from 'react';
import ReactDOM from 'react-dom';
export default class HomePage extends Component {
constructor(props) {
super(props)
this.state = {
}
}
render() {
return (
<div>
Homepage coming soon...
</div>
);
}
}
if (document.getElementById('homePage')) {
ReactDOM.render(<HomePage />, document.getElementById('homePage'));
}

37
resources/js/components/Loader.js vendored Normal file
View File

@@ -0,0 +1,37 @@
import React, { Component } from 'react';
import ReactDOM from 'react-dom';
import Spinner from 'react-bootstrap/Spinner';
import { Container } from 'react-bootstrap';
import { Row } from 'react-bootstrap';
import { Col } from 'react-bootstrap';
export default class Loader extends Component {
constructor(props) {
super(props);
this.state = {
};
}
render() {
return (
<Container fluid>
<Row className="fullscreen text-center align-items-center">
<Col
lg={{ span: 2, offset: 5}}
md={{ span: 4, offset: 4}}
sm={{ span: 4, offset: 4}}
xs={{ span: 12}}
>
<Spinner animation="grow" size="lg"/>
</Col>
</Row>
</Container>
);
}
}
if (document.getElementById('loader')) {
ReactDOM.render(<Loader />, document.getElementById('loader'));
}

78
resources/js/components/Login.js vendored Normal file
View File

@@ -0,0 +1,78 @@
import React, { Component } from 'react';
import ReactDOM from 'react-dom';
import { Container, Row, Form, Toast } from 'react-bootstrap';
import { Col } from 'react-bootstrap';
import { Button } from 'react-bootstrap';
import Axios from 'axios';
import { Alert } from 'react-bootstrap';
import { toast } from 'react-toastify';
export default class Login extends Component {
constructor(props) {
super(props)
this.state = {
loginEmailInput: '',
loginPasswordInput: '',
toast: null,
}
}
login = (e) => {
e.preventDefault();
var data = {
email: this.state.loginEmailInput,
password: this.state.loginPasswordInput
};
var url = '/api/auth/login';
Axios.post(url, data)
.then((resp) => {
var token = resp.data;
this.props.setToken(token);
})
.catch((err) => {
toast.error('Something went wrong. Please try again.')
});
}
updateTextField = (e) => {
this.setState({
[e.target.id]: e.target.value
});
}
render() {
var error = this.state.error;
return (
<Container>
<Row className="fullscreen align-items-center">
<Col
lg={{ span: 4, offset: 4 }}
md={{ span: 6, offset: 3 }}
sm={{ span: 10, offset: 1 }}
xs={{ span: 12 }}
>
<Form onSubmit={this.login}>
<Form.Group controlId="loginEmailInput">
<Form.Label>Email address</Form.Label>
<Form.Control type="email" placeholder="admin@admin.com" onInput={this.updateTextField} required />
</Form.Group>
<Form.Group controlId="loginPasswordInput">
<Form.Label>Password</Form.Label>
<Form.Control type="password" onInput={this.updateTextField} required />
</Form.Group>
<Button variant="primary" type="submit">Login</Button>
</Form>
</Col>
</Row>
</Container>
);
}
}
if (document.getElementById('login')) {
ReactDOM.render(<Login />, document.getElementById('login'));
}

23
resources/js/components/Navbar.js vendored Normal file
View File

@@ -0,0 +1,23 @@
import React, { Component } from 'react';
import ReactDOM from 'react-dom';
export default class Navbar extends Component {
constructor(props) {
super(props)
this.state = {
}
}
render() {
return (
<div>
</div>
);
}
}
if (document.getElementById('navbar')) {
ReactDOM.render(<Navbar />, document.getElementById('navbar'));
}