framework/js/src/common/models/Discussion.js

105 lines
2.8 KiB
JavaScript
Raw Normal View History

import Model from '../Model';
import computed from '../utils/computed';
import ItemList from '../utils/ItemList';
import Badge from '../components/Badge';
2015-04-25 20:58:39 +08:00
export default class Discussion extends Model {}
Object.assign(Discussion.prototype, {
title: Model.attribute('title'),
slug: Model.attribute('slug'),
2018-08-24 19:18:04 +08:00
createdAt: Model.attribute('createdAt', Model.transformDate),
2018-08-24 19:13:52 +08:00
user: Model.hasOne('user'),
2018-08-24 19:12:07 +08:00
firstPost: Model.hasOne('firstPost'),
2018-08-24 19:19:06 +08:00
lastPostedAt: Model.attribute('lastPostedAt', Model.transformDate),
2018-08-24 19:14:42 +08:00
lastPostedUser: Model.hasOne('lastPostedUser'),
lastPost: Model.hasOne('lastPost'),
lastPostNumber: Model.attribute('lastPostNumber'),
2018-08-24 19:07:04 +08:00
commentCount: Model.attribute('commentCount'),
2018-08-24 19:26:25 +08:00
replyCount: computed('commentCount', commentCount => Math.max(0, commentCount - 1)),
posts: Model.hasMany('posts'),
mostRelevantPost: Model.hasOne('mostRelevantPost'),
2018-08-24 19:21:58 +08:00
lastReadAt: Model.attribute('lastReadAt', Model.transformDate),
2018-08-24 19:23:28 +08:00
lastReadPostNumber: Model.attribute('lastReadPostNumber'),
isUnread: computed('unreadCount', unreadCount => !!unreadCount),
isRead: computed('unreadCount', unreadCount => app.session.user && !unreadCount),
2018-08-24 19:20:00 +08:00
hiddenAt: Model.attribute('hiddenAt', Model.transformDate),
2018-08-24 19:25:40 +08:00
hiddenUser: Model.hasOne('hiddenUser'),
2018-08-24 19:20:00 +08:00
isHidden: computed('hiddenAt', hiddenAt => !!hiddenAt),
canReply: Model.attribute('canReply'),
canRename: Model.attribute('canRename'),
canHide: Model.attribute('canHide'),
canDelete: Model.attribute('canDelete'),
2015-07-08 09:21:30 +08:00
/**
* Remove a post from the discussion's posts relationship.
*
* @param {Integer} id The ID of the post to remove.
* @public
2015-07-08 09:21:30 +08:00
*/
removePost(id) {
const relationships = this.data.relationships;
const posts = relationships && relationships.posts;
if (posts) {
posts.data.some((data, i) => {
if (id === data.id) {
posts.data.splice(i, 1);
return true;
}
});
}
},
/**
* Get the estimated number of unread posts in this discussion for the current
* user.
*
* @return {Integer}
* @public
*/
unreadCount() {
const user = app.session.user;
2018-08-24 20:05:46 +08:00
if (user && user.markedAllAsReadAt() < this.lastPostedAt()) {
2018-08-24 19:23:28 +08:00
return Math.max(0, this.lastPostNumber() - (this.lastReadPostNumber() || 0));
}
return 0;
},
/**
* Get the Badge components that apply to this discussion.
*
* @return {ItemList}
* @public
*/
badges() {
const items = new ItemList();
if (this.isHidden()) {
items.add('hidden', <Badge type="hidden" icon="fas fa-trash" label={app.translator.trans('core.lib.badge.hidden_tooltip')}/>);
}
return items;
},
2015-04-25 20:58:39 +08:00
/**
* Get a list of all of the post IDs in this discussion.
*
* @return {Array}
* @public
*/
postIds() {
const posts = this.data.relationships.posts;
return posts ? posts.data.map(link => link.id) : [];
}
});