diff --git a/public/src/client/topic.js b/public/src/client/topic.js index 1cdd1cabbc..50a8ebe705 100644 --- a/public/src/client/topic.js +++ b/public/src/client/topic.js @@ -116,7 +116,8 @@ define('forum/topic', [ }; function handleBookmark(tid) { - var bookmark = localStorage.getItem('topic:' + tid + ':bookmark'); + // use the user's bookmark data if available, fallback to local if available + var bookmark = ajaxify.data.bookmark || localStorage.getItem('topic:' + tid + ':bookmark'); var postIndex = getPostIndex(); if (postIndex && window.location.search.indexOf('page=') === -1) { @@ -128,7 +129,7 @@ define('forum/topic', [ timeout: 0, type: 'info', clickfn : function() { - navigator.scrollToPost(parseInt(bookmark, 10), true); + navigator.scrollToPost(parseInt(bookmark - 1, 10), true); }, closefn : function() { localStorage.removeItem('topic:' + tid + ':bookmark'); @@ -197,10 +198,28 @@ define('forum/topic', [ } } - var currentBookmark = localStorage.getItem('topic:' + ajaxify.data.tid + ':bookmark'); + var bookmarkKey = 'topic:' + ajaxify.data.tid + ':bookmark'; + var currentBookmark = ajaxify.data.bookmark || localStorage.getItem(bookmarkKey); + + if (!currentBookmark || parseInt(postIndex, 10) > parseInt(currentBookmark, 10)) { + if (app.user.uid) { + var payload = { + 'tid': ajaxify.data.tid, + 'index': postIndex + }; + socket.emit('topics.bookmark', payload, function(err) { + if (err) { + console.warn('Error saving bookmark:', err); + } + ajaxify.data.bookmark = postIndex; + }); + } else { + localStorage.setItem(bookmarkKey, postIndex); + } + } + // removes the bookmark alert when we get to / past the bookmark if (!currentBookmark || parseInt(postIndex, 10) >= parseInt(currentBookmark, 10)) { - localStorage.setItem('topic:' + ajaxify.data.tid + ':bookmark', postIndex); app.removeAlert('bookmark'); } diff --git a/src/socket.io/topics.js b/src/socket.io/topics.js index 06ea14d9d7..dcafbeced8 100644 --- a/src/socket.io/topics.js +++ b/src/socket.io/topics.js @@ -96,6 +96,10 @@ SocketTopics.postcount = function(socket, tid, callback) { topics.getTopicField(tid, 'postcount', callback); }; +SocketTopics.bookmark = function(socket, payload, callback) { + topics.setUserBookmark(payload.tid, socket.uid, payload.index, callback); +}; + SocketTopics.markAsRead = function(socket, tids, callback) { if (!Array.isArray(tids) || !socket.uid) { return callback(new Error('[[error:invalid-data]]')); diff --git a/src/topics.js b/src/topics.js index ae1222a904..21788c3c8d 100644 --- a/src/topics.js +++ b/src/topics.js @@ -222,7 +222,8 @@ var async = require('async'), category: async.apply(Topics.getCategoryData, tid), threadTools: async.apply(plugins.fireHook, 'filter:topic.thread_tools', {topic: topicData, uid: uid, tools: []}), tags: async.apply(Topics.getTopicTagsObjects, tid), - isFollowing: async.apply(Topics.isFollowing, [tid], uid) + isFollowing: async.apply(Topics.isFollowing, [tid], uid), + bookmark: async.apply(Topics.getUserBookmark, tid, uid) }, function(err, results) { if (err) { return callback(err); @@ -233,6 +234,7 @@ var async = require('async'), topicData.thread_tools = results.threadTools.tools; topicData.tags = results.tags; topicData.isFollowing = results.isFollowing[0]; + topicData.bookmark = results.bookmark; topicData.unreplied = parseInt(topicData.postcount, 10) === 1; topicData.deleted = parseInt(topicData.deleted, 10) === 1; @@ -328,6 +330,14 @@ var async = require('async'), }); } + Topics.getUserBookmark = function (tid, uid, callback) { + db.sortedSetScore('topic:' + tid + ':bookmarks', uid, callback); + }; + + Topics.setUserBookmark = function(tid, uid, index, callback) { + db.sortedSetAdd('topic:' + tid + ':bookmarks', index, uid, callback); + }; + Topics.getTopicField = function(tid, field, callback) { db.getObjectField('topic:' + tid, field, callback); };