diff --git a/public/src/forum/category.js b/public/src/forum/category.js index 4d88d475e6..5720988f74 100644 --- a/public/src/forum/category.js +++ b/public/src/forum/category.js @@ -116,8 +116,8 @@ }, function(data) { if(data.topics.length) { onTopicsLoaded(data.topics); - loadingMoreTopics = false; } + loadingMoreTopics = false; }); } diff --git a/public/src/forum/recent.js b/public/src/forum/recent.js index 6b0ca925c7..816f914aaa 100644 --- a/public/src/forum/recent.js +++ b/public/src/forum/recent.js @@ -1,4 +1,6 @@ (function() { + var loadingMoreTopics = false; + app.enter_room('recent_posts'); ajaxify.register_events([ @@ -58,7 +60,37 @@ app.alertError('There was an error marking topics read!'); } }); + }); + + function onTopicsLoaded(topics) { + + var html = templates.prepare(templates['recent'].blocks['topics']).parse({ topics: topics }), + container = $('#topics-container'); + + $('#category-no-topics').remove(); + + container.append(html); + } + function loadMoreTopics() { + loadingMoreTopics = true; + socket.emit('api:topics.loadMoreRecentTopics', {after:$('#topics-container').children().length}, function(data) { + if(data.topics && data.topics.length) { + onTopicsLoaded(data.topics); + console.log(data.topics); + } + loadingMoreTopics = false; + }); + } + + $(window).off('scroll').on('scroll', function() { + var windowHeight = document.body.offsetHeight - $(window).height(), + half = windowHeight / 2; + + if (document.body.scrollTop > half && !loadingMoreTopics) { + loadMoreTopics(); + } }); + })(); \ No newline at end of file diff --git a/src/routes/api.js b/src/routes/api.js index 91db56782c..a47a7a35ca 100644 --- a/src/routes/api.js +++ b/src/routes/api.js @@ -108,7 +108,7 @@ var user = require('./../user.js'), app.get('/api/recent', function(req, res) { var uid = (req.user) ? req.user.uid : 0; - topics.getLatestTopics(uid, 0, 9, function(data) { + topics.getLatestTopics(uid, 0, 19, function(data) { res.json(data); }); }); diff --git a/src/topics.js b/src/topics.js index 1ff2ad8d6d..3d3ba5bf86 100644 --- a/src/topics.js +++ b/src/topics.js @@ -97,8 +97,10 @@ marked.setOptions({ Topics.getLatestTopics = function(current_user, start, end, callback) { var timestamp = Date.now(); + + var args = [ 'topics:recent', '+inf', timestamp - 86400000, 'WITHSCORES', 'LIMIT', start, end - start + 1]; - RDB.zrevrangebyscore([ 'topics:recent', '+inf', timestamp - 86400000], function(err, tids) { + RDB.zrevrangebyscore(args, function(err, tids) { var latestTopics = { 'category_name' : 'Recent', diff --git a/src/websockets.js b/src/websockets.js index 9cd45459eb..f7dc80c28b 100644 --- a/src/websockets.js +++ b/src/websockets.js @@ -570,6 +570,15 @@ var SocketIO = require('socket.io').listen(global.server, { log:false }), }); }); + socket.on('api:topics.loadMoreRecentTopics', function(data, callback) { + var start = data.after, + end = start + 9; + + topics.getLatestTopics(uid, start, end, function(latestTopics) { + callback(latestTopics); + }); + }); + socket.on('api:admin.topics.getMore', function(data) { topics.getAllTopics(data.limit, data.after, function(topics) { socket.emit('api:admin.topics.getMore', JSON.stringify(topics));