diff --git a/public/src/forum/favourites.js b/public/src/forum/favourites.js index e23572e1b2..4cce3508f9 100644 --- a/public/src/forum/favourites.js +++ b/public/src/forum/favourites.js @@ -1,9 +1,51 @@ define(['forum/accountheader'], function(header) { - var AccountHeader = {}; + var Favourites = {}, + loadingMore = false; - AccountHeader.init = function() { + Favourites.init = function() { header.init(); + + app.enableInfiniteLoading(function() { + if(!loadingMore) { + loadMore(); + } + }); }; - return AccountHeader; + function loadMore() { + loadingMore = true; + socket.emit('posts.loadMoreFavourites', { + after: $('.user-favourite-posts').attr('data-nextstart') + }, function(err, data) { + if(err) { + return app.alertError(err.message); + } + + if (data.posts && data.posts.length) { + onTopicsLoaded(data.posts); + $('.user-favourite-posts').attr('data-nextstart', data.nextStart); + } + + loadingMore = false; + }); + } + + function onTopicsLoaded(posts) { + var html = templates.prepare(templates['favourites'].blocks['posts']).parse({ + posts: posts + }); + + translator.translate(html, function(translatedHTML) { + + $('#category-no-topics').remove(); + + html = $(translatedHTML); + $('.user-favourite-posts').append(html); + $('span.timeago').timeago(); + app.createUserTooltips(); + app.makeNumbersHumanReadable(html.find('.human-readable-number')); + }); + } + + return Favourites; }); \ No newline at end of file diff --git a/public/templates/favourites.tpl b/public/templates/favourites.tpl index e5f8fe9cb7..13fc48bc27 100644 --- a/public/templates/favourites.tpl +++ b/public/templates/favourites.tpl @@ -6,12 +6,12 @@ - +
[[topic:favourites.has_no_favourites]]
- +
-
+
diff --git a/src/posts.js b/src/posts.js index 9027c0524d..1f32708c7a 100644 --- a/src/posts.js +++ b/src/posts.js @@ -232,12 +232,15 @@ var db = require('./database'), Posts.getPostSummaryByPids = function(pids, stripTags, callback) { - var posts = []; - function getPostSummary(pid, callback) { + async.waterfall([ function(next) { Posts.getPostFields(pid, ['pid', 'tid', 'content', 'uid', 'timestamp', 'deleted'], function(err, postData) { + if(err) { + return next(err); + } + if (parseInt(postData.deleted, 10) === 1) { return callback(null); } else { @@ -287,20 +290,19 @@ var db = require('./database'), next(null, postData); } } - ], function(err, postData) { - if (!err) { - posts.push(postData); - } - callback(err); - }); + ], callback); } - async.eachSeries(pids, getPostSummary, function(err) { - if (!err) { - callback(null, posts); - } else { - callback(err, null); + async.map(pids, getPostSummary, function(err, posts) { + if(err) { + return callback(err); } + + posts = posts.filter(function(p) { + return p; + }); + + callback(null, posts); }); }; @@ -458,13 +460,33 @@ var db = require('./database'), async.each(pids, reIndex, callback); } - Posts.getFavourites = function(uid, callback) { - db.getSortedSetRevRange('uid:' + uid + ':favourites', 0, -1, function(err, pids) { + Posts.getFavourites = function(uid, start, end, callback) { + + db.getSortedSetRevRange('uid:' + uid + ':favourites', start, end, function(err, pids) { if (err) { - return callback(err, null); + return callback(err); } - Posts.getPostSummaryByPids(pids, false, callback); + Posts.getPostSummaryByPids(pids, false, function(err, posts) { + if(err) { + return callback(err); + } + + if(!posts || !posts.length) { + return callback(null, { posts: [], nextStart: 0}); + } + + db.sortedSetRevRank('uid:' + uid + ':favourites', posts[posts.length - 1].pid, function(err, rank) { + if(err) { + return calllback(err); + } + var favourites = { + posts: posts, + nextStart: parseInt(rank, 10) + 1 + }; + callback(null, favourites); + }); + }); }); } diff --git a/src/routes/user.js b/src/routes/user.js index 9c014af285..ebcdd5d304 100644 --- a/src/routes/user.js +++ b/src/routes/user.js @@ -344,12 +344,14 @@ var fs = require('fs'), } if (userData) { - posts.getFavourites(uid, function (err, posts) { + posts.getFavourites(uid, 0, 9, function (err, favourites) { if (err) { return next(err); } - userData.posts = posts; - userData.show_nofavourites = posts.length === 0; + + userData.posts = favourites.posts; + userData.nextStart = favourites.nextStart; + res.json(userData); }); } else { diff --git a/src/socket.io/posts.js b/src/socket.io/posts.js index 475466f5c6..de61541d73 100644 --- a/src/socket.io/posts.js +++ b/src/socket.io/posts.js @@ -247,4 +247,15 @@ SocketPosts.flag = function(socket, pid, callback) { ], callback); } +SocketPosts.loadMoreFavourites = function(socket, data, callback) { + if(!data || !data.after) { + return callback(new Error('invalid data')); + } + + var start = parseInt(data.after, 10), + end = start + 9; + + posts.getFavourites(socket.uid, start, end, callback); +}; + module.exports = SocketPosts; \ No newline at end of file