diff --git a/db/models/message.js b/db/models/message.js index 58e8450..b9056fc 100644 --- a/db/models/message.js +++ b/db/models/message.js @@ -28,8 +28,17 @@ messageSchema.methods.toJson = () => { }; messageSchema.statics.list = (options, callback) => { - return this.find({deleted: false}) - .sort({createdAt: -1}) + let query = this.find({deleted: false}) + + if (options.before) { + query.where({ + createdAt: { + $lt: new Date(options.before) + } + }); + } + + return query.sort({createdAt: -1}) .limit(30) .exec((error, messages) => { if (error) return callback(error); diff --git a/lib/chat/controller.js b/lib/chat/controller.js index 13aad2f..53aa457 100644 --- a/lib/chat/controller.js +++ b/lib/chat/controller.js @@ -25,9 +25,7 @@ module.exports = namespace => { }; var refreshMessages = socket => { - Message.list({ - deleted: false - }, (error, messages) => { + Message.list({}, (error, messages) => { if (error) { winston.error("Unable to retrieve messages. Error:", error); return; @@ -41,6 +39,20 @@ module.exports = namespace => { }); }; + var retrievePreviousMessages = (options, socket) => { + Message.list({ + before: options.before + }, (error, messages) => { + if (error) { + winston.error("Unable to retrieve messages. Error:", error); + return; + } + socket.emit("message:append", { + messages: messages + }); + }); + } + namespace.on('connection', socket => { socket.on('message:new', data => { @@ -56,7 +68,7 @@ module.exports = namespace => { return; } winston.info("New Message", JSON.stringify(newMessage)); - broadcastUpdate(newMessage) + broadcastUpdate(newMessage); }); }); @@ -74,7 +86,10 @@ module.exports = namespace => { }); }); - socket.on('message:refresh', () => { + socket.on('message:refresh', data => { + if (data && data.before) { + return retrievePreviousMessages(data, socket); + } refreshMessages(socket); }); }); diff --git a/lib/react/message.jsx b/lib/react/message.jsx index 9899cb6..3b0e0d9 100644 --- a/lib/react/message.jsx +++ b/lib/react/message.jsx @@ -12,13 +12,20 @@ var Chatroom = React.createClass({ socket.on("message:append", data => { let history = self.props.history; - history.push(data); + let historicalUpdate = !!data.messages; + if (historicalUpdate) { + history = history.concat(data.messages); + } else { + history.push(data); + } self.setProps({ history: history.sort((a, b) => { return new Date(a.createdAt) - new Date(b.createdAt); }) }); - self.scrollToBottom(); + if (!historicalUpdate) { + self.scrollToBottom(); + } }); // Message History Retrieved @@ -39,8 +46,10 @@ var Chatroom = React.createClass({ }, loadMoreMessages() { + var earliestMessage = this.props.history[0]; + if (earliestMessage === undefined) return; socket.emit("message:refresh", { - // before: + before: earliestMessage.createdAt }); }, @@ -66,6 +75,7 @@ var Chatroom = React.createClass({