Skip to content
Snippets Groups Projects
Commit 98eb53e6 authored by Marcelo Schmidt's avatar Marcelo Schmidt
Browse files

LoadSurroundingMessages

parent 8c960413
No related branches found
No related tags found
No related merge requests found
......@@ -6,72 +6,7 @@ Meteor.startup ->
action: (event, instance) ->
message = @_arguments[1]
$('.message-dropdown:visible').hide()
if ChatMessage.findOne message._id
wrapper = $('.messages-box .wrapper')
msgElement = $("##{message._id}", wrapper)
pos = wrapper.scrollTop() + msgElement.offset().top - wrapper.height()/2
wrapper.animate({
scrollTop: pos
}, 500)
else
instance.atBottom = false
RoomHistoryManager.isLoading(message.rid, true)
ChatMessage.remove {}
ChatMessage.upsert { _id: message._id }, message
RoomHistoryManager.hasMoreNext(message.rid, true)
RoomHistoryManager.getMore(message.rid, 25, false)
RoomHistoryManager.getMoreNext(message.rid, 25, false)
typeName = undefined
subscription = ChatSubscription.findOne rid: message.rid
if subscription?
typeName = subscription.t + subscription.name
else
curRoomDoc = ChatRoom.findOne(_id: message.rid)
typeName = curRoomDoc?.t + curRoomDoc?.name
RoomManager.updateMentionsMarksOfRoom typeName
Tracker.afterFlush ->
wrapper = $('.messages-box .wrapper')
msgElement = $("##{message._id}", wrapper)
pos = wrapper.scrollTop() + msgElement.offset().top - wrapper.height()/2
wrapper.animate({
scrollTop: pos
}, 500)
RoomHistoryManager.isLoading(message.rid, false)
# Meteor.call 'loadHistory', message.rid, message.ts, 25, (err, result) ->
# throw err if err
# ChatMessage.upsert {_id: item._id}, item for item in result?.messages or [] when item.t isnt 'command'
# Meteor.call 'loadNextMessages', message.rid, message.ts, 25, (err, result) ->
# throw err if err
# ChatMessage.upsert {_id: item._id}, item for item in result?.messages or [] when item.t isnt 'command'
# typeName = undefined
# subscription = ChatSubscription.findOne rid: message.rid
# if subscription?
# typeName = subscription.t + subscription.name
# else
# curRoomDoc = ChatRoom.findOne(_id: message.rid)
# typeName = curRoomDoc?.t + curRoomDoc?.name
# RoomManager.updateMentionsMarksOfRoom typeName
#
# Tracker.afterFlush ->
# wrapper = $('.messages-box .wrapper')
# msgElement = $("##{message._id}", wrapper)
# pos = wrapper.scrollTop() + msgElement.offset().top - wrapper.height()/2
# wrapper.animate({
# scrollTop: pos
# }, 500)
# instance.showJumpToRecent?.set true
# RoomHistoryManager.isLoading(message.rid, false)
RoomHistoryManager.getSurroundingMessages(message, 50)
validation: (message) ->
return message.mentionedList is true
......
......@@ -68,10 +68,23 @@
if room.hasMoreNext.curValue isnt true
return
instance = Blaze.getView($('.messages-box .wrapper')[0]).templateInstance()
instance.atBottom = false
room.isLoading.set true if setLoading
lastMessage = ChatMessage.findOne({rid: rid}, {sort: {ts: -1}})
typeName = undefined
subscription = ChatSubscription.findOne rid: rid
if subscription?
ls = subscription.ls
typeName = subscription.t + subscription.name
else
curRoomDoc = ChatRoom.findOne(_id: rid)
typeName = curRoomDoc?.t + curRoomDoc?.name
ts = lastMessage.ts
if ts
......@@ -79,11 +92,64 @@
for item in result?.messages or []
if item.t isnt 'command'
ChatMessage.upsert {_id: item._id}, item
Meteor.defer ->
RoomManager.updateMentionsMarksOfRoom typeName
room.isLoading.set false if setLoading
room.loaded += result.messages.length
if result.messages.length < limit
room.hasMoreNext.set false
getSurroundingMessages = (message, limit=defaultLimit) ->
unless message?.rid
return
if ChatMessage.findOne message._id
wrapper = $('.messages-box .wrapper')
msgElement = $("##{message._id}", wrapper)
pos = wrapper.scrollTop() + msgElement.offset().top - wrapper.height()/2
wrapper.animate({
scrollTop: pos
}, 500)
else
room = getRoom message.rid
room.isLoading.set true
ChatMessage.remove { rid: message.rid }
typeName = undefined
subscription = ChatSubscription.findOne rid: message.rid
if subscription?
ls = subscription.ls
typeName = subscription.t + subscription.name
else
curRoomDoc = ChatRoom.findOne(_id: message.rid)
typeName = curRoomDoc?.t + curRoomDoc?.name
Meteor.call 'loadSurroundingMessages', message, limit, (err, result) ->
for item in result?.messages or []
if item.t isnt 'command'
ChatMessage.upsert {_id: item._id}, item
instance = Blaze.getView($('.messages-box .wrapper')[0]).templateInstance()
Meteor.defer ->
RoomManager.updateMentionsMarksOfRoom typeName
wrapper = $('.messages-box .wrapper')
msgElement = $("##{message._id}", wrapper)
pos = wrapper.scrollTop() + msgElement.offset().top - wrapper.height()/2
wrapper.animate({
scrollTop: pos
}, 500)
setTimeout ->
room.isLoading.set false
instance.atBottom = !result.moreAfter
, 500
room.loaded += result.messages.length
room.hasMore.set result.moreBefore
room.hasMoreNext.set result.moreAfter
hasMore = (rid) ->
room = getRoom rid
......@@ -124,3 +190,4 @@
hasMoreNext: hasMoreNext
isLoading: isLoading
clear: clear
getSurroundingMessages: getSurroundingMessages
......@@ -109,13 +109,17 @@ RocketChat.Notifications.onUser 'message', (msg) ->
Dep.changed()
msgStream.on openedRooms[typeName].rid, (msg) ->
if msg.t isnt 'command'
ChatMessage.upsert { _id: msg._id }, msg
# Should not send message to room if room has not loaded all the current messages
if RoomHistoryManager.hasMoreNext(openedRooms[typeName].rid) is false
Meteor.defer ->
RoomManager.updateMentionsMarksOfRoom typeName
# Do not load command messages into channel
if msg.t isnt 'command'
ChatMessage.upsert { _id: msg._id }, msg
RocketChat.callbacks.run 'streamMessage', msg
Meteor.defer ->
RoomManager.updateMentionsMarksOfRoom typeName
RocketChat.callbacks.run 'streamMessage', msg
RocketChat.Notifications.onRoom openedRooms[typeName].rid, 'deleteMessage', onDeleteMessageStream
......
......@@ -317,9 +317,9 @@ Template.room.events
'scroll .wrapper': _.throttle (e, instance) ->
if RoomHistoryManager.isLoading(@_id) is false and (RoomHistoryManager.hasMore(@_id) is true or RoomHistoryManager.hasMoreNext(@_id) is true)
if e.target.scrollTop is 0
if RoomHistoryManager.hasMore(@_id) is true and e.target.scrollTop is 0
RoomHistoryManager.getMore(@_id)
else if e.target.scrollTop >= e.target.scrollHeight - e.target.clientHeight
else if RoomHistoryManager.hasMoreNext(@_id) is true and e.target.scrollTop >= e.target.scrollHeight - e.target.clientHeight
RoomHistoryManager.getMoreNext(@_id)
, 200
......@@ -435,6 +435,7 @@ Template.room.events
'click .jump-recent .jump-link': (e, template) ->
e.preventDefault()
template.atBottom = true
RoomHistoryManager.clear(template?.data?._id)
Template.room.onCreated ->
......
Meteor.methods
loadHistory: (rid, end, limit=20, ls) ->
fromId = Meteor.userId()
# console.log '[methods] loadHistory -> '.green, 'fromId:', fromId, 'rid:', rid, 'end:', end, 'limit:', limit, 'skip:', skip
console.log '[methods] loadHistory -> '.green, 'fromId:', fromId, 'rid:', rid, 'end:', end, 'limit:', limit, 'ls:', ls
unless Meteor.call 'canAccessRoom', rid, fromId
return false
......
Meteor.methods
loadNextMessages: (rid, end, limit=20) ->
fromId = Meteor.userId()
# console.log '[methods] loadHistory -> '.green, 'fromId:', fromId, 'rid:', rid, 'end:', end, 'limit:', limit, 'skip:', skip
console.log '[methods] loadNextMessages -> '.green, 'fromId:', fromId, 'rid:', rid, 'end:', end, 'limit:', limit
unless Meteor.call 'canAccessRoom', rid, fromId
return false
......
Meteor.methods
loadSurroundingMessages: (message, limit=50) ->
fromId = Meteor.userId()
console.log '[methods] loadSurroundingMessages -> '.green, 'fromId:', fromId, 'message:', message, 'limit:', limit
unless message?.rid
return false
unless Meteor.call 'canAccessRoom', message.rid, fromId
return false
if not RocketChat.settings.get 'Message_ShowEditedStatus'
options.fields = { 'editedAt': 0 }
limit = limit - 1
options =
sort:
ts: -1
limit: Math.ceil(limit/2)
records = RocketChat.models.Messages.findVisibleByRoomIdBeforeTimestamp(message.rid, message.ts, options).fetch()
messages = _.map records, (message) ->
message.starred = _.findWhere message.starred, { _id: fromId }
return message
moreBefore = messages.length is options.limit
messages.push message
options =
sort:
ts: 1
limit: Math.floor(limit/2)
records = RocketChat.models.Messages.findVisibleByRoomIdAfterTimestamp(message.rid, message.ts, options).fetch()
afterMessages = _.map records, (message) ->
message.starred = _.findWhere message.starred, { _id: fromId }
return message
moreAfter = afterMessages.length is options.limit
messages = messages.concat afterMessages
return {
messages: messages
moreBefore: moreBefore
moreAfter: moreAfter
}
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment