This repository has been archived on 2023-03-18. You can view files and clone it, but cannot push or open issues or pull requests.
osr-discourse-src/app/assets/javascripts/discourse/models/user-action.js.es6
Maja Komel 4b455e741e DEV: Ember 3.8.0
Co-Authored-By: majakomel <maja.komel@gmail.com>
2019-04-26 12:16:21 +02:00

253 lines
6.5 KiB
JavaScript

import RestModel from "discourse/models/rest";
import { on } from "ember-addons/ember-computed-decorators";
import computed from "ember-addons/ember-computed-decorators";
import UserActionGroup from "discourse/models/user-action-group";
import { postUrl } from "discourse/lib/utilities";
import { userPath } from "discourse/lib/url";
const UserActionTypes = {
likes_given: 1,
likes_received: 2,
bookmarks: 3,
topics: 4,
posts: 5,
replies: 6,
mentions: 7,
quotes: 9,
edits: 11,
messages_sent: 12,
messages_received: 13,
pending: 14
};
const InvertedActionTypes = {};
Object.keys(UserActionTypes).forEach(
k => (InvertedActionTypes[k] = UserActionTypes[k])
);
const UserAction = RestModel.extend({
@on("init")
_attachCategory() {
const categoryId = this.get("category_id");
if (categoryId) {
this.set("category", Discourse.Category.findById(categoryId));
}
},
@computed("action_type")
descriptionKey(action) {
if (action === null || UserAction.TO_SHOW.indexOf(action) >= 0) {
if (this.get("isPM")) {
return this.get("sameUser") ? "sent_by_you" : "sent_by_user";
} else {
return this.get("sameUser") ? "posted_by_you" : "posted_by_user";
}
}
if (this.get("topicType")) {
return this.get("sameUser") ? "you_posted_topic" : "user_posted_topic";
}
if (this.get("postReplyType")) {
if (this.get("reply_to_post_number")) {
return this.get("sameUser")
? "you_replied_to_post"
: "user_replied_to_post";
} else {
return this.get("sameUser")
? "you_replied_to_topic"
: "user_replied_to_topic";
}
}
if (this.get("mentionType")) {
if (this.get("sameUser")) {
return "you_mentioned_user";
} else {
return this.get("targetUser")
? "user_mentioned_you"
: "user_mentioned_user";
}
}
},
@computed("username")
sameUser(username) {
return username === Discourse.User.currentProp("username");
},
@computed("target_username")
targetUser(targetUsername) {
return targetUsername === Discourse.User.currentProp("username");
},
presentName: Ember.computed.or("name", "username"),
targetDisplayName: Ember.computed.or("target_name", "target_username"),
actingDisplayName: Ember.computed.or("acting_name", "acting_username"),
@computed("target_username")
targetUserUrl(username) {
return userPath(username);
},
@computed("username")
usernameLower(username) {
return username.toLowerCase();
},
@computed("usernameLower")
userUrl(usernameLower) {
return userPath(usernameLower);
},
@computed()
postUrl() {
return postUrl(
this.get("slug"),
this.get("topic_id"),
this.get("post_number")
);
},
@computed()
replyUrl() {
return postUrl(
this.get("slug"),
this.get("topic_id"),
this.get("reply_to_post_number")
);
},
replyType: Ember.computed.equal("action_type", UserActionTypes.replies),
postType: Ember.computed.equal("action_type", UserActionTypes.posts),
topicType: Ember.computed.equal("action_type", UserActionTypes.topics),
bookmarkType: Ember.computed.equal("action_type", UserActionTypes.bookmarks),
messageSentType: Ember.computed.equal(
"action_type",
UserActionTypes.messages_sent
),
messageReceivedType: Ember.computed.equal(
"action_type",
UserActionTypes.messages_received
),
mentionType: Ember.computed.equal("action_type", UserActionTypes.mentions),
isPM: Ember.computed.or("messageSentType", "messageReceivedType"),
postReplyType: Ember.computed.or("postType", "replyType"),
removableBookmark: Ember.computed.and("bookmarkType", "sameUser"),
addChild(action) {
let groups = this.get("childGroups");
if (!groups) {
groups = {
likes: UserActionGroup.create({ icon: "heart" }),
stars: UserActionGroup.create({ icon: "star" }),
edits: UserActionGroup.create({ icon: "pencil-alt" }),
bookmarks: UserActionGroup.create({ icon: "bookmark" })
};
}
this.set("childGroups", groups);
const bucket = (function() {
switch (action.action_type) {
case UserActionTypes.likes_given:
case UserActionTypes.likes_received:
return "likes";
case UserActionTypes.edits:
return "edits";
case UserActionTypes.bookmarks:
return "bookmarks";
}
})();
const current = groups[bucket];
if (current) {
current.push(action);
}
},
@computed(
"childGroups",
"childGroups.likes.items",
"childGroups.likes.items.[]",
"childGroups.stars.items",
"childGroups.stars.items.[]",
"childGroups.edits.items",
"childGroups.edits.items.[]",
"childGroups.bookmarks.items",
"childGroups.bookmarks.items.[]"
)
children() {
const g = this.get("childGroups");
let rval = [];
if (g) {
rval = [g.likes, g.stars, g.edits, g.bookmarks].filter(function(i) {
return i.get("items") && i.get("items").length > 0;
});
}
return rval;
},
switchToActing() {
this.setProperties({
username: this.get("acting_username"),
name: this.get("actingDisplayName")
});
}
});
UserAction.reopenClass({
collapseStream(stream) {
const uniq = {};
const collapsed = [];
let pos = 0;
stream.forEach(item => {
const key = "" + item.topic_id + "-" + item.post_number;
const found = uniq[key];
if (found === void 0) {
let current;
if (UserAction.TO_COLLAPSE.indexOf(item.action_type) >= 0) {
current = UserAction.create(item);
item.switchToActing();
current.addChild(item);
} else {
current = item;
}
uniq[key] = pos;
collapsed[pos] = current;
pos += 1;
} else {
if (UserAction.TO_COLLAPSE.indexOf(item.action_type) >= 0) {
item.switchToActing();
collapsed[found].addChild(item);
} else {
collapsed[found].setProperties(
item.getProperties("action_type", "description")
);
}
}
});
return collapsed;
},
TYPES: UserActionTypes,
TYPES_INVERTED: InvertedActionTypes,
TO_COLLAPSE: [
UserActionTypes.likes_given,
UserActionTypes.likes_received,
UserActionTypes.edits,
UserActionTypes.bookmarks
],
TO_SHOW: [
UserActionTypes.likes_given,
UserActionTypes.likes_received,
UserActionTypes.edits,
UserActionTypes.bookmarks,
UserActionTypes.messages_sent,
UserActionTypes.messages_received
]
});
export default UserAction;