Skip to content

Commit

Permalink
Merge pull request #311 from RocketChat/messages-stream
Browse files Browse the repository at this point in the history
Messages stream. Flow Router implementation. Render off-screen of rooms.
  • Loading branch information
engelgabriel committed Jul 16, 2015
2 parents 033bbb9 + 08b3b6a commit 659cc66
Show file tree
Hide file tree
Showing 28 changed files with 534 additions and 403 deletions.
5 changes: 3 additions & 2 deletions .meteor/packages
Original file line number Diff line number Diff line change
Expand Up @@ -19,7 +19,6 @@ service-configuration

chrismbeckett:toastr
francocatena:status
iron:router
jparker:gravatar
kevohagan:sweetalert
konecty:autolinker
Expand Down Expand Up @@ -58,4 +57,6 @@ tmeasday:errors
todda00:friendly-slugs
underscorestring:underscore.string
yasaricli:slugify
meteorhacks:kadira
meteorhacks:kadira
meteorhacks:flow-router
meteorhacks:flow-layout
11 changes: 3 additions & 8 deletions .meteor/versions
7 changes: 7 additions & 0 deletions client/lib/RoomHistoryManager.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,12 @@

return room.hasMore.get()

getMoreIfIsEmpty = (rid) ->
room = getRoom rid

if room.loaded is 0
getMore rid

isLoading = (rid) ->
room = getRoom rid

Expand All @@ -54,6 +60,7 @@
histories[rid].loaded = 0

getMore: getMore
getMoreIfIsEmpty: getMoreIfIsEmpty
hasMore: hasMore
isLoading: isLoading
clear: clear
41 changes: 38 additions & 3 deletions client/lib/RoomManager.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -2,6 +2,7 @@
defaultTime = 600000 # 10 minutes
openedRooms = {}
subscription = null
msgStream = new Meteor.Stream 'messages'

Dep = new Tracker.Dependency

Expand All @@ -15,20 +16,24 @@
for sub in openedRooms[rid].sub
sub.stop()

msgStream.removeListener rid

openedRooms[rid].ready = false
openedRooms[rid].active = false
delete openedRooms[rid].timeout
delete openedRooms[rid].dom

ChatMessageHistory.remove rid: rid

computation = Tracker.autorun ->
for rid, record of openedRooms when record.active is true
record.sub = [
Meteor.subscribe 'room', rid
Meteor.subscribe 'messages', rid
# Meteor.subscribe 'messages', rid
]

record.ready = record.sub[0].ready() and record.sub[1].ready()
record.ready = record.sub[0].ready()
# record.ready = record.sub[0].ready() and record.sub[1].ready()

Dep.changed()

Expand All @@ -49,11 +54,21 @@
active: false
ready: false

setRoomExpireExcept rid

if subscription.ready()
# if ChatSubscription.findOne { rid: rid }, { reactive: false }
if openedRooms[rid].active isnt true
openedRooms[rid].active = true
setRoomExpireExcept rid

msgStream.on rid, (msg) ->
if msg._deleted?
return ChatMessageHistory.remove _id: msg._id

return if msg.u?._id is Meteor.userId()

ChatMessageHistory.upsert { _id: msg._id }, msg

computation.invalidate()

return {
Expand All @@ -62,6 +77,26 @@
return openedRooms[rid].ready
}

getDomOfRoom = (rid) ->
room = openedRooms[rid]
if not room?
return

if not room.dom?
room.dom = document.createElement 'div'
room.dom.classList.add 'room-container'
Blaze.renderWithData Template.room, { _id: rid }, room.dom

return room.dom

existsDomOfRoom = (rid) ->
room = openedRooms[rid]
return room?.dom?

open: open
close: close
init: init
getDomOfRoom: getDomOfRoom
existsDomOfRoom: existsDomOfRoom
msgStream: msgStream
openedRooms: openedRooms
8 changes: 4 additions & 4 deletions client/lib/chatMessages.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@
wrapper = {}
input = {}
editing = {}

init = ->
wrapper = $(".messages-container").find(".wrapper")
input = $(".input-message").get(0)
Expand Down Expand Up @@ -45,7 +45,7 @@
return if element.classList.contains("system")
clearEditing()
id = element.getAttribute("id")
message = ChatMessage.findOne { _id: id, 'u._id': Meteor.userId() }
message = ChatMessageHistory.findOne { _id: id, 'u._id': Meteor.userId() }
input.value = message.msg
editing.element = element
editing.index = index or getEditingIndex(element)
Expand Down Expand Up @@ -73,7 +73,7 @@
msg = input.value
input.value = ''
stopTyping(rid)
Meteor.call 'sendMessage', { rid: rid, msg: msg, day: window.day }
Meteor.call 'sendMessage', { _id: Random.id(), rid: rid, msg: msg, day: window.day }

deleteMsg = (element) ->
id = element.getAttribute("id")
Expand Down Expand Up @@ -169,4 +169,4 @@
send: send
init: init
edit: edit
)()
)()
32 changes: 16 additions & 16 deletions client/lib/collections.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -3,27 +3,27 @@

@ChatRoom = new Meteor.Collection 'data.ChatRoom'
@ChatSubscription = new Meteor.Collection 'data.ChatSubscription'
@ChatMessage = new Meteor.Collection 'data.ChatMessage'
# @ChatMessage = new Meteor.Collection 'data.ChatMessage'

Meteor.startup ->
ChatMessage.find().observe
added: (record) ->
if record._deleted is true
ChatMessageHistory.remove {_id: record._id}
return
# Meteor.startup ->
# ChatMessage.find().observe
# added: (record) ->
# if record._deleted is true
# ChatMessageHistory.remove {_id: record._id}
# return

if ChatRoom._collection._docs._map[record.rid]? and not ChatMessageHistory._collection._docs._map[record._id]?
ChatMessageHistory.insert record
# if ChatRoom._collection._docs._map[record.rid]? and not ChatMessageHistory._collection._docs._map[record._id]?
# ChatMessageHistory.insert record

changed: (record) ->
if record._deleted is true
ChatMessageHistory.remove {_id: record._id}
return
# changed: (record) ->
# if record._deleted is true
# ChatMessageHistory.remove {_id: record._id}
# return

_id = record._id
delete record._id
# _id = record._id
# delete record._id

ChatMessageHistory.update { _id: _id }, { $set: record }
# ChatMessageHistory.update { _id: _id }, { $set: record }

# removed: (record) ->
# ChatMessageHistory.remove {_id: record._id}
6 changes: 4 additions & 2 deletions client/lib/msgTyping.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -51,8 +51,10 @@
stream.emit 'typing', { room: room, username: Meteor.user().username, stop: true }

get = (room) ->
users = usersTyping[room].users.get()
return _.keys(users) or []
if usersTyping[room]?
users = usersTyping[room].users.get()
return _.keys(users) or []
return []

return {
start: start
Expand Down
2 changes: 1 addition & 1 deletion client/methods/sendMessage.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,4 @@ Meteor.methods

message = RocketChat.callbacks.run 'beforeSaveMessage', message

ChatMessage.insert message
ChatMessageHistory.insert message
8 changes: 4 additions & 4 deletions client/methods/updateMessage.coffee
Original file line number Diff line number Diff line change
Expand Up @@ -8,20 +8,20 @@ Meteor.methods
message.ets = new Date(Date.now() + TimeSync.serverOffset())
message = RocketChat.callbacks.run 'beforeSaveMessage', message

ChatMessage.update
ChatMessageHistory.update
_id: message.id
'u._id': Meteor.userId()
,
$set:
ets: message.ets
message: message.msg
msg: message.msg

deleteMessage: (message) ->
if not Meteor.userId()
throw new Meteor.Error 203, t('general.User_logged_out')

Tracker.nonreactive ->
ChatMessage.remove

ChatMessageHistory.remove
_id: message.id
'u._id': Meteor.userId()
46 changes: 46 additions & 0 deletions client/routes/roomRoute.coffee
Original file line number Diff line number Diff line change
@@ -0,0 +1,46 @@
FlowRouter.route '/room/:_id',
name: 'room'

action: (params, queryParams) ->
Session.set 'openedRoom', null

FlowLayout.render 'main', {center: 'loading'}

Meteor.defer ->
track = Tracker.autorun ->
if RoomManager.open(params._id).ready() isnt true
return

track?.stop()

if not ChatRoom.find(params._id).count()
FlowRouter.go 'home'

mainNode = document.querySelector('.main-content')
if mainNode?
child?.remove() for child in mainNode.children
room = RoomManager.getDomOfRoom(params._id)
mainNode.appendChild room
if room.classList.contains('room-container')
room.querySelector('.messages-box > .wrapper').scrollTop = room.oldScrollTop

Session.set 'openedRoom', params._id

Session.set 'editRoomTitle', false
# Meteor.call 'readMessages', params._id
# KonchatNotification.removeRoomNotification(params._id)

setTimeout ->
$('.message-form .input-message').focus()
, 100

triggersExit: [
->
mainNode = document.querySelector('.main-content')
if mainNode?
for child in mainNode.children
if child?
if child.classList.contains('room-container')
child.oldScrollTop = child.querySelector('.messages-box > .wrapper').scrollTop
child.remove()
]
Loading

0 comments on commit 659cc66

Please sign in to comment.