From 45df5a3d0b6976b72af2079931be1beadfc66fd0 Mon Sep 17 00:00:00 2001 From: bdharrington7 Date: Tue, 21 Jul 2015 21:20:13 +0800 Subject: [PATCH 1/6] stores the user's bookmark on the server --- public/src/client/topic.js | 17 +++++++++++++---- src/socket.io/topics.js | 5 +++++ src/topics.js | 8 ++++++++ 3 files changed, 26 insertions(+), 4 deletions(-) diff --git a/public/src/client/topic.js b/public/src/client/topic.js index 1cdd1cabbc..c25a910431 100644 --- a/public/src/client/topic.js +++ b/public/src/client/topic.js @@ -197,10 +197,19 @@ define('forum/topic', [ } } - var currentBookmark = localStorage.getItem('topic:' + ajaxify.data.tid + ':bookmark'); - - if (!currentBookmark || parseInt(postIndex, 10) >= parseInt(currentBookmark, 10)) { - localStorage.setItem('topic:' + ajaxify.data.tid + ':bookmark', postIndex); + var bookmarkKey = 'topic:' + ajaxify.data.tid + ':bookmark'; + var currentBookmark = localStorage.getItem(bookmarkKey); + + if (!currentBookmark || parseInt(postIndex, 10) > parseInt(currentBookmark, 10)) { + localStorage.setItem(bookmarkKey, postIndex); + if (app.user.uid) { + var data = { + 'tid': ajaxify.data.tid, + 'uid': app.user.uid, + 'postIndex': postIndex + } + socket.emit('topics.bookmark', data); + } app.removeAlert('bookmark'); } diff --git a/src/socket.io/topics.js b/src/socket.io/topics.js index 6e9cafcf63..02e092aad8 100644 --- a/src/socket.io/topics.js +++ b/src/socket.io/topics.js @@ -96,6 +96,11 @@ SocketTopics.postcount = function(socket, tid, callback) { topics.getTopicField(tid, 'postcount', callback); }; +SocketTopics.bookmark = function(socket, data, callback) { + // data contains tid, uid, and postIndex + topics.setUserBookmark(data, 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 13522aad00..36a7dc89b1 100644 --- a/src/topics.js +++ b/src/topics.js @@ -327,6 +327,14 @@ var async = require('async'), }); } + Topics.getUserBookmark = function (tid, uid, callback) { + Topics.getTopicField(tid + ':bookmarks', uid, callback); + } + + Topics.setUserBookmark = function(data, callback) { + Topics.setTopicField(data.tid + ':bookmarks', data.uid, data.postIndex, callback); + } + Topics.getTopicField = function(tid, field, callback) { db.getObjectField('topic:' + tid, field, callback); }; From 4d99f60b3d1c7788ceafa1ab05eb15b5dda1300e Mon Sep 17 00:00:00 2001 From: bdharrington7 Date: Tue, 21 Jul 2015 23:46:05 +0800 Subject: [PATCH 2/6] uses server-side bookmark if available --- public/src/client/topic.js | 8 +++++--- src/topics.js | 4 +++- 2 files changed, 8 insertions(+), 4 deletions(-) diff --git a/public/src/client/topic.js b/public/src/client/topic.js index c25a910431..f2e1b0bab4 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) { @@ -198,10 +199,9 @@ define('forum/topic', [ } var bookmarkKey = 'topic:' + ajaxify.data.tid + ':bookmark'; - var currentBookmark = localStorage.getItem(bookmarkKey); + var currentBookmark = ajaxify.data.bookmark || localStorage.getItem(bookmarkKey); if (!currentBookmark || parseInt(postIndex, 10) > parseInt(currentBookmark, 10)) { - localStorage.setItem(bookmarkKey, postIndex); if (app.user.uid) { var data = { 'tid': ajaxify.data.tid, @@ -209,6 +209,8 @@ define('forum/topic', [ 'postIndex': postIndex } socket.emit('topics.bookmark', data); + } else { + localStorage.setItem(bookmarkKey, postIndex); } app.removeAlert('bookmark'); } diff --git a/src/topics.js b/src/topics.js index 36a7dc89b1..44e277e04f 100644 --- a/src/topics.js +++ b/src/topics.js @@ -221,7 +221,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); @@ -232,6 +233,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; From 54180acf9b4e2f26152568324515c544b48ba4e6 Mon Sep 17 00:00:00 2001 From: bdharrington7 Date: Wed, 22 Jul 2015 06:55:48 +0800 Subject: [PATCH 3/6] saves updated bookmark in callback --- public/src/client/topic.js | 11 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) diff --git a/public/src/client/topic.js b/public/src/client/topic.js index f2e1b0bab4..858c3d7fd3 100644 --- a/public/src/client/topic.js +++ b/public/src/client/topic.js @@ -208,10 +208,19 @@ define('forum/topic', [ 'uid': app.user.uid, 'postIndex': postIndex } - socket.emit('topics.bookmark', data); + socket.emit('topics.bookmark', data, 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)) { app.removeAlert('bookmark'); } From c0ec6faed343972d961ae7806bf30a0a987de9f1 Mon Sep 17 00:00:00 2001 From: bdharrington7 Date: Mon, 27 Jul 2015 19:59:19 -0700 Subject: [PATCH 4/6] Clarifies code by calling native db method instead of Topics method --- src/topics.js | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/src/topics.js b/src/topics.js index 81839f9d68..8ba4c9c513 100644 --- a/src/topics.js +++ b/src/topics.js @@ -330,12 +330,12 @@ var async = require('async'), } Topics.getUserBookmark = function (tid, uid, callback) { - Topics.getTopicField(tid + ':bookmarks', uid, callback); - } + db.getObjectField('topic:' + tid + ':bookmarks', uid, callback); + }; Topics.setUserBookmark = function(data, callback) { - Topics.setTopicField(data.tid + ':bookmarks', data.uid, data.postIndex, callback); - } + db.setObjectField('topic:' + data.tid + ':bookmarks', data.uid, data.postIndex, callback); + }; Topics.getTopicField = function(tid, field, callback) { db.getObjectField('topic:' + tid, field, callback); From 25203ee67e0df38caceb67dbaf9a9af4a28fa846 Mon Sep 17 00:00:00 2001 From: bdharrington7 Date: Thu, 30 Jul 2015 23:13:34 -0700 Subject: [PATCH 5/6] changes bookmark storage to sortedset, gets uid from socket rather than being passed from client --- public/src/client/topic.js | 11 +++++------ src/socket.io/topics.js | 7 +++---- src/topics.js | 6 +++--- 3 files changed, 11 insertions(+), 13 deletions(-) diff --git a/public/src/client/topic.js b/public/src/client/topic.js index 858c3d7fd3..b39d8dc77d 100644 --- a/public/src/client/topic.js +++ b/public/src/client/topic.js @@ -203,12 +203,11 @@ define('forum/topic', [ if (!currentBookmark || parseInt(postIndex, 10) > parseInt(currentBookmark, 10)) { if (app.user.uid) { - var data = { - 'tid': ajaxify.data.tid, - 'uid': app.user.uid, - 'postIndex': postIndex - } - socket.emit('topics.bookmark', data, function(err) { + var payload = { + 'tid': ajaxify.data.tid, + 'index': postIndex + }; + socket.emit('topics.bookmark', payload, function(err) { if (err) { console.warn('Error saving bookmark:', err); } diff --git a/src/socket.io/topics.js b/src/socket.io/topics.js index 02e092aad8..5b4b1c140d 100644 --- a/src/socket.io/topics.js +++ b/src/socket.io/topics.js @@ -96,10 +96,9 @@ SocketTopics.postcount = function(socket, tid, callback) { topics.getTopicField(tid, 'postcount', callback); }; -SocketTopics.bookmark = function(socket, data, callback) { - // data contains tid, uid, and postIndex - topics.setUserBookmark(data, 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) { diff --git a/src/topics.js b/src/topics.js index 8ba4c9c513..9dc3b29cf2 100644 --- a/src/topics.js +++ b/src/topics.js @@ -330,11 +330,11 @@ var async = require('async'), } Topics.getUserBookmark = function (tid, uid, callback) { - db.getObjectField('topic:' + tid + ':bookmarks', uid, callback); + db.sortedSetScore('topic:' + tid + ':bookmarks', uid, callback); }; - Topics.setUserBookmark = function(data, callback) { - db.setObjectField('topic:' + data.tid + ':bookmarks', data.uid, data.postIndex, callback); + Topics.setUserBookmark = function(tid, uid, index, callback) { + db.sortedSetAdd('topic:' + tid + ':bookmarks', index, uid, callback); }; Topics.getTopicField = function(tid, field, callback) { From bd26961fa6ae2c799552074cceb709030793a4b3 Mon Sep 17 00:00:00 2001 From: bdharrington7 Date: Thu, 30 Jul 2015 23:29:14 -0700 Subject: [PATCH 6/6] Makes bookmark click scroll to last read instead of past it --- public/src/client/topic.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/public/src/client/topic.js b/public/src/client/topic.js index b39d8dc77d..50a8ebe705 100644 --- a/public/src/client/topic.js +++ b/public/src/client/topic.js @@ -129,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');