The communications platform that puts data protection first.
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
Rocket.Chat/client/lib/msgTyping.coffee

70 lines
1.7 KiB

11 years ago
@MsgTyping = do ->
stream = new Meteor.Stream 'typing'
timeout = 15000
timeouts = {}
renew = true
renewTimeout = 10000
selfTyping = new ReactiveVar false
usersTyping = {}
11 years ago
dep = new Tracker.Dependency
11 years ago
addStream = (room) ->
11 years ago
if _.isEmpty usersTyping[room]?.users
usersTyping[room] = { users: {} }
11 years ago
stream.on room, (typing) ->
unless typing?.username is Meteor.user()?.username
11 years ago
if typing.start
11 years ago
users = usersTyping[room].users
11 years ago
users[typing.username] = Meteor.setTimeout ->
delete users[typing.username]
11 years ago
usersTyping[room].users = users
dep.changed()
11 years ago
, timeout
11 years ago
usersTyping[room].users = users
dep.changed()
11 years ago
else if typing.stop
11 years ago
users = usersTyping[room].users
11 years ago
delete users[typing.username]
11 years ago
usersTyping[room].users = users
dep.changed()
11 years ago
Tracker.autorun ->
11 years ago
if Session.get 'openedRoom'
addStream Session.get 'openedRoom'
11 years ago
start = (room) ->
return unless renew
setTimeout ->
renew = true
, renewTimeout
renew = false
selfTyping.set true
stream.emit 'typing', { room: room, username: Meteor.user()?.username, start: true }
11 years ago
clearTimeout timeouts[room]
timeouts[room] = Meteor.setTimeout ->
stop(room)
, timeout
stop = (room) ->
renew = true
selfTyping.set false
if timeouts?[room]?
clearTimeout(timeouts[room])
timeouts[room] = null
stream.emit 'typing', { room: room, username: Meteor.user()?.username, stop: true }
11 years ago
get = (room) ->
11 years ago
dep.depend()
unless usersTyping[room]
usersTyping[room] = { users: {} }
users = usersTyping[room].users
return _.keys(users) or []
11 years ago
return {
start: start
stop: stop
get: get
selfTyping: selfTyping
}