mirror of
https://github.com/discourse/discourse.git
synced 2025-02-02 15:02:01 +08:00
92 lines
2.1 KiB
JavaScript
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 };
|
|
});
|
|
}
|
|
});
|