discourse/app/assets/javascripts/discourse/models/action-summary.js.es6
2019-11-12 11:49:31 +01:00

92 lines
2.1 KiB
JavaScript

import { or } from "@ember/object/computed";
import { ajax } from "discourse/lib/ajax";
import RestModel from "discourse/models/rest";
import { popupAjaxError } from "discourse/lib/ajax-error";
export default RestModel.extend({
canToggle: or("can_undo", "can_act"),
// Remove it
removeAction: function() {
this.setProperties({
acted: false,
count: this.count - 1,
can_act: true,
can_undo: false
});
},
togglePromise(post) {
return this.acted ? this.undo(post) : this.act(post);
},
toggle(post) {
if (!this.acted) {
this.act(post);
return true;
} else {
this.undo(post);
return false;
}
},
// Perform this action
act(post, opts) {
if (!opts) opts = {};
// Mark it as acted
this.setProperties({
acted: true,
count: this.count + 1,
can_act: false,
can_undo: true
});
// Create our post action
return ajax("/post_actions", {
type: "POST",
data: {
id: this.flagTopic ? this.get("flagTopic.id") : post.get("id"),
post_action_type_id: this.id,
message: opts.message,
is_warning: opts.isWarning,
take_action: opts.takeAction,
flag_topic: this.flagTopic ? true : false
},
returnXHR: true
})
.then(data => {
if (!this.flagTopic) {
post.updateActionsSummary(data.result);
}
const remaining = parseInt(
data.xhr.getResponseHeader("Discourse-Actions-Remaining") || 0,
10
);
const max = parseInt(
data.xhr.getResponseHeader("Discourse-Actions-Max") || 0,
10
);
return { acted: true, remaining, max };
})
.catch(error => {
popupAjaxError(error);
this.removeAction(post);
});
},
// Undo this action
undo(post) {
this.removeAction(post);
// Remove our post action
return ajax("/post_actions/" + post.get("id"), {
type: "DELETE",
data: { post_action_type_id: this.id }
}).then(result => {
post.updateActionsSummary(result);
return { acted: false };
});
}
});