You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

221 lines
6.3 KiB
JavaScript

'use strict';
/* globals config, app, ajaxify, define, socket, templates, utils */
define('forum/topic/events', [
'forum/topic/postTools',
'forum/topic/threadTools',
'forum/topic/posts',
'components',
'translator'
], function(postTools, threadTools, posts, components, translator) {
var Events = {};
var events = {
'event:user_status_change': onUserStatusChange,
'event:voted': updatePostVotesAndUserReputation,
'event:favourited': updateFavouriteCount,
'event:topic_deleted': threadTools.setDeleteState,
'event:topic_restored': threadTools.setDeleteState,
'event:topic_purged': onTopicPurged,
'event:topic_locked': threadTools.setLockedState,
'event:topic_unlocked': threadTools.setLockedState,
'event:topic_pinned': threadTools.setPinnedState,
'event:topic_unpinned': threadTools.setPinnedState,
'event:topic_moved': onTopicMoved,
'event:post_edited': onPostEdited,
'event:post_purged': onPostPurged,
'event:post_deleted': togglePostDeleteState,
'event:post_restored': togglePostDeleteState,
'posts.favourite': togglePostFavourite,
'posts.unfavourite': togglePostFavourite,
'posts.upvote': togglePostVote,
'posts.downvote': togglePostVote,
'posts.unvote': togglePostVote,
'event:new_notification': onNewNotification,
'event:new_post': posts.onNewPost
};
Events.init = function() {
Events.removeListeners();
for(var eventName in events) {
if (events.hasOwnProperty(eventName)) {
socket.on(eventName, events[eventName]);
}
}
};
Events.removeListeners = function() {
for(var eventName in events) {
if (events.hasOwnProperty(eventName)) {
socket.removeListener(eventName, events[eventName]);
}
}
};
function onUserStatusChange(data) {
app.updateUserStatus($('[data-uid="' + data.uid + '"] [component="user/status"]'), data.status);
}
function updatePostVotesAndUserReputation(data) {
var votes = components.get('post/vote-count', data.post.pid),
reputationElements = $('.reputation[data-uid="' + data.post.uid + '"]');
votes.html(data.post.votes).attr('data-votes', data.post.votes);
reputationElements.html(data.user.reputation).attr('data-reputation', data.user.reputation);
}
function updateFavouriteCount(data) {
$('[data-pid="' + data.post.pid + '"] .favouriteCount').html(data.post.reputation).attr('data-favourites', data.post.reputation);
}
function onTopicPurged() {
if (ajaxify.data.category && ajaxify.data.category.slug) {
ajaxify.go('category/' + ajaxify.data.category.slug, null, true);
}
}
function onTopicMoved(data) {
if (data && data.slug) {
ajaxify.go('topic/' + data.slug, null, true);
}
}
function onPostEdited(data) {
if (!data || !data.post) {
return;
}
var editedPostEl = components.get('post/content', data.post.pid),
editorEl = $('[data-pid="' + data.post.pid + '"] [component="post/editor"]'),
topicTitle = components.get('topic/title'),
breadCrumb = components.get('breadcrumb/current');
if (topicTitle.length && data.topic.title && topicTitle.html() !== data.topic.title) {
var newUrl = 'topic/' + data.topic.slug + (window.location.search ? window.location.search : '');
history.replaceState({url: newUrl}, null, window.location.protocol + '//' + window.location.host + config.relative_path + '/' + newUrl);
topicTitle.fadeOut(250, function() {
topicTitle.html(data.topic.title).fadeIn(250);
});
breadCrumb.fadeOut(250, function() {
breadCrumb.html(data.topic.title).fadeIn(250);
});
}
editedPostEl.fadeOut(250, function() {
editedPostEl.html(data.post.content);
editedPostEl.find('img:not(.not-responsive)').addClass('img-responsive');
app.replaceSelfLinks(editedPostEl.find('a'));
posts.wrapImagesInLinks(editedPostEl.parent());
editedPostEl.fadeIn(250);
$(window).trigger('action:posts.edited', data);
});
var editData = {
editor: data.editor,
relativeEditTime: utils.toISOString(data.post.edited)
};
templates.parse('partials/topic/post-editor', editData, function(html) {
translator.translate(html, function(translated) {
html = $(translated);
editorEl.replaceWith(html);
html.find('.timeago').timeago();
});
});
if (data.topic.tags && tagsUpdated(data.topic.tags)) {
templates.parse('partials/post_bar', 'tags', {tags: data.topic.tags}, function(html) {
var tags = $('.tags');
tags.fadeOut(250, function() {
tags.html(html).fadeIn(250);
});
});
}
}
function tagsUpdated(tags) {
if (tags.length !== $('.tags').first().children().length) {
return true;
}
for (var i=0; i<tags.length; ++i) {
if (!$('.tags .tag-item[data-tag="' + tags[i].value + '"]').length) {
return true;
}
}
return false;
}
function onPostPurged(pid) {
components.get('post', 'pid', pid).fadeOut(500, function() {
$(this).remove();
ajaxify.data.postcount --;
postTools.updatePostCount(ajaxify.data.postcount);
posts.showBottomPostBar();
});
postTools.updatePostCount();
}
function togglePostDeleteState(data) {
var postEl = components.get('post', 'pid', data.pid);
if (!postEl.length) {
return;
}
postEl.toggleClass('deleted');
var isDeleted = postEl.hasClass('deleted');
postTools.toggle(data.pid, isDeleted);
if (!app.user.isAdmin && parseInt(data.uid, 10) !== parseInt(app.user.uid, 10)) {
if (isDeleted) {
postEl.find('[component="post/content"]').translateHtml('[[topic:post_is_deleted]]');
} else {
postEl.find('[component="post/content"]').html(data.content);
}
}
}
function togglePostFavourite(data) {
var favBtn = $('[data-pid="' + data.post.pid + '"] [component="post/favourite"]');
if (!favBtn.length) {
return;
}
favBtn.attr('data-favourited', data.isFavourited);
favBtn.find('[component="post/favourite/on"]').toggleClass('hidden', !data.isFavourited);
favBtn.find('[component="post/favourite/off"]').toggleClass('hidden', data.isFavourited);
}
function togglePostVote(data) {
var post = $('[data-pid="' + data.post.pid + '"]');
post.find('[component="post/upvote"]').toggleClass('upvoted', data.upvote);
post.find('[component="post/downvote"]').toggleClass('downvoted', data.downvote);
}
function onNewNotification(data) {
var tid = ajaxify.data.tid;
if (data && data.tid && parseInt(data.tid, 10) === parseInt(tid, 10)) {
socket.emit('topics.markTopicNotificationsRead', tid);
}
}
return Events;
});