mirror of
https://github.com/status-im/fathom.git
synced 2025-02-28 19:10:36 +00:00
parse json in all responses & handle login error
This commit is contained in:
parent
9200df8569
commit
b5b31d89f8
@ -2,6 +2,7 @@
|
|||||||
|
|
||||||
import { h, render, Component } from 'preact';
|
import { h, render, Component } from 'preact';
|
||||||
import Client from '../lib/client.js';
|
import Client from '../lib/client.js';
|
||||||
|
import Notification from '../components/Notification.js';
|
||||||
|
|
||||||
class LoginForm extends Component {
|
class LoginForm extends Component {
|
||||||
|
|
||||||
@ -11,6 +12,7 @@ class LoginForm extends Component {
|
|||||||
this.state = {
|
this.state = {
|
||||||
email: '',
|
email: '',
|
||||||
password: '',
|
password: '',
|
||||||
|
message: ''
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -23,7 +25,15 @@ class LoginForm extends Component {
|
|||||||
email: this.state.email,
|
email: this.state.email,
|
||||||
password: this.state.password,
|
password: this.state.password,
|
||||||
}
|
}
|
||||||
}).then((r) => { this.props.onSuccess() })
|
}).then((r) => {
|
||||||
|
this.props.onSuccess()
|
||||||
|
}).catch((e) => {
|
||||||
|
this.setState({
|
||||||
|
message: e.message,
|
||||||
|
password: ''
|
||||||
|
})
|
||||||
|
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
render() {
|
render() {
|
||||||
@ -34,17 +44,19 @@ class LoginForm extends Component {
|
|||||||
<form method="POST" onSubmit={this.handleSubmit}>
|
<form method="POST" onSubmit={this.handleSubmit}>
|
||||||
<div class="small-margin">
|
<div class="small-margin">
|
||||||
<label>Email address</label>
|
<label>Email address</label>
|
||||||
<input type="email" name="email" placeholder="Email address" onChange={this.linkState('email')} required="required" />
|
<input type="email" name="email" placeholder="Email address" value={this.state.email} onChange={this.linkState('email')} required="required" />
|
||||||
</div>
|
</div>
|
||||||
<div class="small-margin">
|
<div class="small-margin">
|
||||||
<label>Password</label>
|
<label>Password</label>
|
||||||
<input type="password" name="password" placeholder="**********" onChange={this.linkState('password')} required="required" />
|
<input type="password" name="password" placeholder="**********" value={this.state.password} onChange={this.linkState('password')} required="required" />
|
||||||
</div>
|
</div>
|
||||||
<div class="small-margin">
|
<div class="small-margin">
|
||||||
<input type="submit" value="Sign in" />
|
<input type="submit" value="Sign in" />
|
||||||
</div>
|
</div>
|
||||||
</form>
|
</form>
|
||||||
|
<Notification message={this.state.message} kind="" />
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
40
assets/js/components/Notification.js
Normal file
40
assets/js/components/Notification.js
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
'use strict'
|
||||||
|
|
||||||
|
import { h, render, Component } from 'preact';
|
||||||
|
|
||||||
|
class Notification extends Component {
|
||||||
|
constructor(props) {
|
||||||
|
super(props)
|
||||||
|
|
||||||
|
this.state = {
|
||||||
|
message: props.message,
|
||||||
|
kind: props.kind || 'error'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
clearMessage() {
|
||||||
|
this.setState({ message: '' })
|
||||||
|
}
|
||||||
|
|
||||||
|
componentWillReceiveProps(newProps) {
|
||||||
|
if(newProps.message != this.state.message) {
|
||||||
|
this.setState({ message: newProps.message, kind: newProps.kind || 'error' })
|
||||||
|
window.setTimeout(this.clearMessage.bind(this), 5000)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
render() {
|
||||||
|
if(this.state.message === '') {
|
||||||
|
return ''
|
||||||
|
}
|
||||||
|
|
||||||
|
return (
|
||||||
|
<div class={`notification`}>
|
||||||
|
<div class={`notification-${this.state.kind}`}>
|
||||||
|
{this.state.message}
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
)}
|
||||||
|
}
|
||||||
|
|
||||||
|
export default Notification
|
@ -19,13 +19,21 @@ Client.request = function(resource, args) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return fetch(`/api/${resource}`, args).then((r) => {
|
return fetch(`/api/${resource}`, args)
|
||||||
if( r.ok ) {
|
.then(parseJSON)
|
||||||
return r.json();
|
.then(checkData)
|
||||||
|
}
|
||||||
|
|
||||||
|
function parseJSON(r) {
|
||||||
|
return r.json()
|
||||||
|
}
|
||||||
|
|
||||||
|
function checkData(d) {
|
||||||
|
if(d.Error) {
|
||||||
|
throw new Error(d.Error)
|
||||||
}
|
}
|
||||||
|
|
||||||
throw new Error(r);
|
return d.Data
|
||||||
})
|
|
||||||
}
|
}
|
||||||
|
|
||||||
export default Client
|
export default Client
|
||||||
|
@ -10,7 +10,7 @@ class Login extends Component {
|
|||||||
<div>
|
<div>
|
||||||
<HeaderBar showLogout={false} />
|
<HeaderBar showLogout={false} />
|
||||||
<div class="container">
|
<div class="container">
|
||||||
<LoginForm onSuccess={this.props.onLogin} />
|
<LoginForm onSuccess={this.props.onLogin}/>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
)
|
)
|
||||||
|
@ -110,7 +110,6 @@ a {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@keyframes rotate {
|
@keyframes rotate {
|
||||||
0% { transform: rotate(0deg); }
|
0% { transform: rotate(0deg); }
|
||||||
100% { transform: rotate(360deg); }
|
100% { transform: rotate(360deg); }
|
||||||
@ -121,6 +120,25 @@ a {
|
|||||||
font-size: 120%;
|
font-size: 120%;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.notification {
|
||||||
|
top: 20px;
|
||||||
|
left: 0;
|
||||||
|
right: 0;
|
||||||
|
text-align: center;
|
||||||
|
position: fixed;
|
||||||
|
color: white;
|
||||||
|
|
||||||
|
div {
|
||||||
|
color: white;
|
||||||
|
display: inline-block;
|
||||||
|
padding: 6px 12px;
|
||||||
|
background: green;
|
||||||
|
}
|
||||||
|
|
||||||
|
.notification-error {
|
||||||
|
background: red;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
h1 {
|
h1 {
|
||||||
font-size: 28px;
|
font-size: 28px;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user