import { ajax } from 'discourse/lib/ajax'; import RestModel from 'discourse/models/rest'; import { popupAjaxError } from 'discourse/lib/ajax-error'; export default RestModel.extend({ canToggle: function() { return this.get('can_undo') || this.get('can_act'); }.property('can_undo', 'can_act'), // Remove it removeAction: function() { this.setProperties({ acted: false, count: this.get('count') - 1, can_act: true, can_undo: false }); }, togglePromise(post) { return this.get('acted') ? this.undo(post) : this.act(post); }, toggle(post) { if (!this.get('acted')) { this.act(post); return true; } else { this.undo(post); return false; } }, // Perform this action act(post, opts) { if (!opts) opts = {}; const action = this.get('actionType.name_key'); // Mark it as acted this.setProperties({ acted: true, count: this.get('count') + 1, can_act: false, can_undo: true }); if (action === 'notify_moderators' || action === 'notify_user') { this.set('can_undo',false); this.set('can_defer_flags',false); } // Create our post action const self = this; return ajax("/post_actions", { type: 'POST', data: { id: this.get('flagTopic') ? this.get('flagTopic.id') : post.get('id'), post_action_type_id: this.get('id'), message: opts.message, is_warning: opts.isWarning, take_action: opts.takeAction, flag_topic: this.get('flagTopic') ? true : false }, returnXHR: true, }).then(function(data) { if (!self.get('flagTopic')) { post.updateActionsSummary(data.result); } const remaining = parseInt(data.xhr.getResponseHeader('Discourse-Actions-Remaining') || 0); const max = parseInt(data.xhr.getResponseHeader('Discourse-Actions-Max') || 0); return { acted: true, remaining, max }; }).catch(function(error) { popupAjaxError(error); self.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.get('id') } }).then(result => { post.updateActionsSummary(result); return { acted: false }; }); }, deferFlags(post) { return ajax("/post_actions/defer_flags", { type: "POST", data: { post_action_type_id: this.get("id"), id: post.get('id') } }).then(() => this.set('count', 0)); } });