update counter when user navigates to /unread
fix new topic alert on /unread
moved unread code from footer to unread
v1.18.x
Barış Soner Uşaklı 6 years ago
parent 2f57a4b9a6
commit f103390aa5

@ -112,7 +112,13 @@ app.cacheBuster = null;
* config (obj) * config (obj)
* next (string) * next (string)
*/ */
require(['benchpress', 'translator', 'forum/header/notifications', 'forum/header/chat'], function (Benchpress, translator, Notifications, Chat) { require([
'benchpress',
'translator',
'forum/unread',
'forum/header/notifications',
'forum/header/chat',
], function (Benchpress, translator, Unread, Notifications, Chat) {
app.user = data.header.user; app.user = data.header.user;
data.header.config = data.config; data.header.config = data.config;
config = data.config; config = data.config;
@ -136,7 +142,7 @@ app.cacheBuster = null;
Object.values(toRender).forEach(function (element, idx) { Object.values(toRender).forEach(function (element, idx) {
element.html(html[idx]); element.html(html[idx]);
}); });
Unread.initUnreadTopics();
Notifications.prepareDOM(); Notifications.prepareDOM();
Chat.prepareDOM(); Chat.prepareDOM();
app.reskin(data.config.bootswatchSkin); app.reskin(data.config.bootswatchSkin);

@ -4,101 +4,21 @@
define('forum/footer', [ define('forum/footer', [
'components', 'components',
'translator', 'translator',
'forum/unread',
'forum/header/notifications', 'forum/header/notifications',
'forum/header/chat', 'forum/header/chat',
], function (components, translator, Notifications, Chat) { ], function (components, translator, Unread, Notifications, Chat) {
Notifications.prepareDOM(); Notifications.prepareDOM();
Chat.prepareDOM(); Chat.prepareDOM();
translator.prepareDOM(); translator.prepareDOM();
function updateUnreadTopicCount(url, count) { socket.on('event:unread.updateChatCount', function (count) {
if (!utils.isNumber(count)) {
return;
}
$('a[href="' + config.relative_path + url + '"].navigation-link i')
.toggleClass('unread-count', count > 0)
.attr('data-content', count > 99 ? '99+' : count);
}
function updateUnreadChatCount(count) {
components.get('chat/icon') components.get('chat/icon')
.toggleClass('unread-count', count > 0) .toggleClass('unread-count', count > 0)
.attr('data-content', count > 99 ? '99+' : count); .attr('data-content', count > 99 ? '99+' : count);
}
function initUnreadTopics() {
var unreadTopics = {};
function onNewPost(data) {
if (data && data.posts && data.posts.length) {
var post = data.posts[0];
if (parseInt(post.uid, 10) !== parseInt(app.user.uid, 10) && !unreadTopics[post.topic.tid]) {
increaseUnreadCount(data);
markTopicsUnread(post.topic.tid);
unreadTopics[post.topic.tid] = true;
}
}
}
function increaseUnreadCount(data) {
var post = data.posts[0];
var unreadTopicCount = parseInt($('a[href="' + config.relative_path + '/unread"].navigation-link i').attr('data-content'), 10) + 1;
updateUnreadTopicCount('/unread', unreadTopicCount);
var isNewTopic = post.isMain && parseInt(post.uid, 10) !== parseInt(app.user.uid, 10);
if (isNewTopic) {
var unreadNewTopicCount = parseInt($('a[href="' + config.relative_path + '/unread?filter=new"].navigation-link i').attr('data-content'), 10) + 1;
updateUnreadTopicCount('/unread?filter=new', unreadNewTopicCount);
}
var isUnreplied = parseInt(post.topic.postcount, 10) <= 1;
if (isUnreplied) {
var unreadUnrepliedTopicCount = parseInt($('a[href="' + config.relative_path + '/unread?filter=unreplied"].navigation-link i').attr('data-content'), 10) + 1;
updateUnreadTopicCount('/unread?filter=unreplied', unreadUnrepliedTopicCount);
}
if ($('a[href="' + config.relative_path + '/unread?filter=watched"].navigation-link i').length) {
socket.emit('topics.isFollowed', post.topic.tid, function (err, isFollowed) {
if (err) {
return app.alertError(err.message);
}
if (isFollowed) {
var unreadWatchedTopicCount = parseInt($('a[href="' + config.relative_path + '/unread?filter=watched"].navigation-link i').attr('data-content'), 10) + 1;
updateUnreadTopicCount('/unread?filter=watched', unreadWatchedTopicCount);
}
}); });
}
}
function markTopicsUnread(tid) {
$('[data-tid="' + tid + '"]').addClass('unread');
}
$(window).on('action:ajaxify.end', function (ev, data) {
if (data.url) {
var tid = data.url.match(/^topic\/(\d+)/);
if (tid && tid[1]) {
delete unreadTopics[tid[1]];
}
}
});
socket.on('event:new_post', onNewPost);
}
function updateUnreadCounters(data) {
updateUnreadTopicCount('/unread', data.unreadTopicCount);
updateUnreadTopicCount('/unread?filter=new', data.unreadNewTopicCount);
updateUnreadTopicCount('/unread?filter=watched', data.unreadWatchedTopicCount);
updateUnreadTopicCount('/unread?filter=unreplied', data.unreadUnrepliedTopicCount);
}
socket.on('event:unread.updateCount', updateUnreadCounters);
socket.on('event:unread.updateChatCount', updateUnreadChatCount);
if (app.user.uid > 0) { if (app.user.uid > 0) {
initUnreadTopics(); Unread.initUnreadTopics();
} }
}); });

@ -10,6 +10,8 @@ define('forum/unread', ['topicSelect', 'components', 'topicList'], function (top
topicList.init('unread'); topicList.init('unread');
topicSelect.init(); topicSelect.init();
updateUnreadTopicCount('/' + ajaxify.data.selectedFilter.url, ajaxify.data.topicCount);
$('#markSelectedRead').on('click', function () { $('#markSelectedRead').on('click', function () {
var tids = topicSelect.getSelectedTids(); var tids = topicSelect.getSelectedTids();
if (!tids.length) { if (!tids.length) {
@ -77,6 +79,81 @@ define('forum/unread', ['topicSelect', 'components', 'topicList'], function (top
} }
} }
function updateUnreadTopicCount(url, count) {
if (!utils.isNumber(count)) {
return;
}
$('a[href="' + config.relative_path + url + '"].navigation-link i')
.toggleClass('unread-count', count > 0)
.attr('data-content', count > 99 ? '99+' : count);
}
Unread.initUnreadTopics = function () {
var unreadTopics = {};
function onNewPost(data) {
if (data && data.posts && data.posts.length) {
var post = data.posts[0];
if (parseInt(post.uid, 10) !== parseInt(app.user.uid, 10) && !unreadTopics[post.topic.tid]) {
increaseUnreadCount(post);
markTopicsUnread(post.topic.tid);
unreadTopics[post.topic.tid] = true;
}
}
}
function increaseUnreadCount(post) {
var unreadTopicCount = parseInt($('a[href="' + config.relative_path + '/unread"].navigation-link i').attr('data-content'), 10) + 1;
updateUnreadTopicCount('/unread', unreadTopicCount);
var isNewTopic = post.isMain && parseInt(post.uid, 10) !== parseInt(app.user.uid, 10);
if (isNewTopic) {
var unreadNewTopicCount = parseInt($('a[href="' + config.relative_path + '/unread?filter=new"].navigation-link i').attr('data-content'), 10) + 1;
updateUnreadTopicCount('/unread?filter=new', unreadNewTopicCount);
}
var isUnreplied = parseInt(post.topic.postcount, 10) <= 1;
if (isUnreplied) {
var unreadUnrepliedTopicCount = parseInt($('a[href="' + config.relative_path + '/unread?filter=unreplied"].navigation-link i').attr('data-content'), 10) + 1;
updateUnreadTopicCount('/unread?filter=unreplied', unreadUnrepliedTopicCount);
}
if ($('a[href="' + config.relative_path + '/unread?filter=watched"].navigation-link i').length) {
socket.emit('topics.isFollowed', post.topic.tid, function (err, isFollowed) {
if (err) {
return app.alertError(err.message);
}
if (isFollowed) {
var unreadWatchedTopicCount = parseInt($('a[href="' + config.relative_path + '/unread?filter=watched"].navigation-link i').attr('data-content'), 10) + 1;
updateUnreadTopicCount('/unread?filter=watched', unreadWatchedTopicCount);
}
});
}
}
function markTopicsUnread(tid) {
$('[data-tid="' + tid + '"]').addClass('unread');
}
$(window).on('action:ajaxify.end', function () {
if (ajaxify.data.template.topic) {
delete unreadTopics[ajaxify.data.tid];
}
});
socket.removeListener('event:new_post', onNewPost);
socket.on('event:new_post', onNewPost);
socket.removeListener('event:unread.updateCount', updateUnreadCounters);
socket.on('event:unread.updateCount', updateUnreadCounters);
};
function updateUnreadCounters(data) {
updateUnreadTopicCount('/unread', data.unreadTopicCount);
updateUnreadTopicCount('/unread?filter=new', data.unreadNewTopicCount);
updateUnreadTopicCount('/unread?filter=watched', data.unreadWatchedTopicCount);
updateUnreadTopicCount('/unread?filter=unreplied', data.unreadUnrepliedTopicCount);
}
return Unread; return Unread;
}); });

@ -83,7 +83,7 @@ define('topicList', [
}; };
function onNewTopic(data) { function onNewTopic(data) {
if ((ajaxify.data.selectedCids && ajaxify.data.selectedCids.indexOf(parseInt(data.cid, 10)) === -1) || if ((ajaxify.data.selectedCids && ajaxify.data.selectedCids.length && ajaxify.data.selectedCids.indexOf(parseInt(data.cid, 10)) === -1) ||
(ajaxify.data.selectedFilter && ajaxify.data.selectedFilter.filter === 'watched') || (ajaxify.data.selectedFilter && ajaxify.data.selectedFilter.filter === 'watched') ||
(ajaxify.data.template.category && parseInt(ajaxify.data.cid, 10) !== parseInt(data.cid, 10))) { (ajaxify.data.template.category && parseInt(ajaxify.data.cid, 10) !== parseInt(data.cid, 10))) {
return; return;

@ -77,7 +77,7 @@ module.exports = function (Groups) {
}; };
function inviteOrRequestMembership(groupName, uid, type, callback) { function inviteOrRequestMembership(groupName, uid, type, callback) {
if (!parseInt(uid, 10)) { if (!(parseInt(uid, 10) > 0)) {
return callback(new Error('[[error:not-logged-in]]')); return callback(new Error('[[error:not-logged-in]]'));
} }
var hookName = type === 'invite' ? 'action:group.inviteMember' : 'action:group.requestMembership'; var hookName = type === 'invite' ? 'action:group.inviteMember' : 'action:group.requestMembership';

@ -215,26 +215,26 @@ module.exports = function (Topics) {
if (topic && topic.cid && cidMatch(topic.cid) && !blockedUids.includes(parseInt(topic.uid, 10))) { if (topic && topic.cid && cidMatch(topic.cid) && !blockedUids.includes(parseInt(topic.uid, 10))) {
topic.tid = parseInt(topic.tid, 10); topic.tid = parseInt(topic.tid, 10);
if ((results.isTopicsFollowed[index] || !isCidIgnored[topic.cid])) { if ((results.isTopicsFollowed[index] || !isCidIgnored[topic.cid])) {
counts[''] += 1;
tidsByFilter[''].push(topic.tid); tidsByFilter[''].push(topic.tid);
} }
if (results.isTopicsFollowed[index]) { if (results.isTopicsFollowed[index]) {
counts.watched += 1;
tidsByFilter.watched.push(topic.tid); tidsByFilter.watched.push(topic.tid);
} }
if (topic.postcount <= 1) { if (topic.postcount <= 1) {
counts.unreplied += 1;
tidsByFilter.unreplied.push(topic.tid); tidsByFilter.unreplied.push(topic.tid);
} }
if (!userRead[topic.tid]) { if (!userRead[topic.tid]) {
counts.new += 1;
tidsByFilter.new.push(topic.tid); tidsByFilter.new.push(topic.tid);
} }
} }
}); });
counts[''] = tidsByFilter[''].length;
counts.watched = tidsByFilter.watched.length;
counts.unreplied = tidsByFilter.unreplied.length;
counts.new = tidsByFilter.new.length;
next(null, { next(null, {
counts: counts, counts: counts,
@ -439,10 +439,8 @@ module.exports = function (Topics) {
}; };
Topics.hasReadTopics = function (tids, uid, callback) { Topics.hasReadTopics = function (tids, uid, callback) {
if (!parseInt(uid, 10)) { if (!(parseInt(uid, 10) > 0)) {
return callback(null, tids.map(function () { return setImmediate(callback, null, tids.map(() => false));
return false;
}));
} }
async.waterfall([ async.waterfall([

Loading…
Cancel
Save