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.

178 lines
4.9 KiB
JavaScript

'use strict';
/* globals app, ajaxify, define, socket, translator, templates */
define('forum/topic/events', ['forum/topic/browsing', 'forum/topic/postTools', 'forum/topic/threadTools'], function(browsing, postTools, threadTools) {
var Events = {};
var events = {
'event:update_users_in_room': browsing.onUpdateUsersInRoom,
'event:user_enter': browsing.onUserEnter,
'event:user_leave': browsing.onUserLeave,
'event:user_status_change': browsing.onUserStatusChange,
'event:voted': updatePostVotesAndUserReputation,
'event:favourited': updateFavouriteCount,
'event:topic_deleted': toggleTopicDeleteState,
'event:topic_restored': toggleTopicDeleteState,
'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:topic.toggleReply': toggleReply,
};
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 updatePostVotesAndUserReputation(data) {
var votes = $('li[data-pid="' + data.post.pid + '"] .votes'),
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) {
$('li[data-pid="' + data.post.pid + '"] .favouriteCount').html(data.post.reputation).attr('data-favourites', data.post.reputation);
}
function toggleTopicDeleteState(data) {
threadTools.setLockedState(data);
threadTools.setDeleteState(data);
}
function onTopicPurged(tid) {
ajaxify.go('category/' + ajaxify.variables.get('category_id'));
}
function onTopicMoved(data) {
if (data && data.tid > 0) {
ajaxify.go('topic/' + data.tid);
}
}
function onPostEdited(data) {
var editedPostEl = $('#content_' + data.pid),
editedPostTitle = $('#topic_title_' + data.pid);
if (editedPostTitle.length) {
editedPostTitle.fadeOut(250, function() {
editedPostTitle.html(data.title).fadeIn(250);
});
}
editedPostEl.fadeOut(250, function() {
editedPostEl.html(data.content);
editedPostEl.find('img').addClass('img-responsive');
app.replaceSelfLinks(editedPostEl.find('a'));
editedPostEl.fadeIn(250);
$(window).trigger('action:posts.edited');
});
if (data.tags && data.tags.length !== $('.tags').first().children().length) {
templates.parse('partials/post_bar', 'tags', {tags: data.tags}, function(html) {
var tags = $('.tags');
tags.fadeOut(250, function() {
tags.html(html).fadeIn(250);
});
});
}
}
function onPostPurged(pid) {
$('#post-container li[data-pid="' + pid + '"]').fadeOut(500, function() {
$(this).remove();
});
postTools.updatePostCount();
}
function togglePostDeleteState(data) {
var postEl = $('#post-container li[data-pid="' + data.pid + '"]');
if (!postEl.length) {
return;
}
postEl.toggleClass('deleted');
var isDeleted = postEl.hasClass('deleted');
postTools.toggle(data.pid, isDeleted);
if (!app.isAdmin && parseInt(data.uid, 10) !== parseInt(app.uid, 10)) {
if (isDeleted) {
postEl.find('.post-content').translateHtml('[[topic:post_is_deleted]]');
} else {
postEl.find('.post-content').html(data.content);
}
}
}
function togglePostFavourite(data) {
var favBtn = $('li[data-pid="' + data.post.pid + '"] .favourite');
if (!favBtn.length) {
return;
}
favBtn.addClass('btn-warning')
.attr('data-favourited', data.isFavourited);
var icon = favBtn.find('i');
var className = icon.attr('class');
if (data.isFavourited ? className.indexOf('-o') !== -1 : className.indexOf('-o') === -1) {
icon.attr('class', data.isFavourited ? className.replace('-o', '') : className + '-o');
}
}
function togglePostVote(data) {
var post = $('li[data-pid="' + data.post.pid + '"]');
post.find('.upvote').toggleClass('btn-primary upvoted', data.upvote);
post.find('.downvote').toggleClass('btn-primary downvoted', data.downvote);
}
function toggleReply(data) {
$('.thread_active_users [data-uid="' + data.uid + '"]').toggleClass('replying', data.isReplying);
}
return Events;
});