Better handling of API server errors

This commit is contained in:
Toby Zerner 2015-05-26 11:43:20 +09:30
parent e47678f403
commit 17e57c9baa
5 changed files with 31 additions and 4 deletions

View File

@ -47,7 +47,10 @@ export default class DiscussionList extends Component {
this.loading(true);
this.discussions([]);
m.endComputation();
this.loadResults().then(this.parseResults.bind(this));
this.loadResults().then(this.parseResults.bind(this), response => {
this.loading(false);
m.redraw();
});
}
onunload() {

View File

@ -36,7 +36,7 @@ export default class Model {
this.pushData(data);
return m.request({
return app.request({
method: this.exists ? 'PUT' : 'POST',
url: app.config['api_url']+'/'+this.data().type+(this.exists ? '/'+this.data().id : ''),
data: {data},
@ -51,7 +51,7 @@ export default class Model {
delete() {
if (!this.exists) { return; }
return m.request({
return app.request({
method: 'DELETE',
url: app.config['api_url']+'/'+this.data().type+'/'+this.data().id,
background: true,

View File

@ -36,7 +36,7 @@ export default class Store {
endpoint += '/'+id
params = query
}
return m.request({
return app.request({
method: 'GET',
url: app.config['api_url']+'/'+endpoint,
data: params,

View File

@ -1,10 +1,12 @@
import ItemList from 'flarum/utils/item-list';
import Alert from 'flarum/components/alert';
import ServerError from 'flarum/utils/server-error';
class App {
constructor() {
this.initializers = new ItemList();
this.cache = {};
this.serverError = null;
}
boot() {
@ -15,6 +17,26 @@ class App {
document.title = (title ? title+' - ' : '')+this.config['forum_title'];
}
request(options) {
options.extract = options.extract || function(xhr, xhrOptions) {
if (xhr.status === 500) {
throw new ServerError;
}
return xhr.responseText;
};
return m.request(options).then(response => {
this.alerts.dismiss(this.serverError);
return response;
}, response => {
this.alerts.dismiss(this.serverError);
if (response instanceof ServerError) {
this.alerts.show(this.serverError = new Alert({ type: 'warning', message: 'Oops! Something went wrong on the server. Please try again.' }))
}
throw response;
});
}
handleApiErrors(response) {
this.alerts.clear();

View File

@ -0,0 +1,2 @@
export default class ServerError {
}