mirror of
https://github.com/overleaf/overleaf.git
synced 2024-12-30 22:42:14 +00:00
109 lines
3 KiB
CoffeeScript
109 lines
3 KiB
CoffeeScript
define [
|
|
"utils/staticLoader"
|
|
"libs/underscore"
|
|
"libs/backbone"
|
|
"libs/jquery.storage"
|
|
"models/room"
|
|
"models/user"
|
|
"views/chatWindowView"
|
|
|
|
], (staticLoader, _, Backbone, jqueryStorage, Room, User, ChatWindowView) ->
|
|
|
|
staticLoader.appendAssets()
|
|
_.templateSettings = escape : /\{\{(.+?)\}\}/g
|
|
|
|
class GlobalNotificationManager
|
|
constructor: (@chat) ->
|
|
@focussed = true
|
|
$(window).on "focus", () =>
|
|
@clearNewMessageNotification()
|
|
@focussed = true
|
|
$(window).on "blur", () => @focussed = false
|
|
|
|
@chat.on "joinedRoom", (room) =>
|
|
notifyIfAppropriate = (message) =>
|
|
if message.get("user") != @chat.user and !message.get("preloaded")
|
|
@notifyAboutNewMessage()
|
|
|
|
room.get("messages").on "add", notifyIfAppropriate
|
|
room.on "disconnect", () ->
|
|
room.get("messages").off "add", notifyIfAppropriate
|
|
|
|
notifyAboutNewMessage: () ->
|
|
if !@focussed and !@newMessageNotificationTimeout?
|
|
@originalTitle ||= window.document.title
|
|
do changeTitle = () =>
|
|
if window.document.title == @originalTitle
|
|
window.document.title = "New Message"
|
|
else
|
|
window.document.title = @originalTitle
|
|
@newMessageNotificationTimeout = setTimeout changeTitle, 800
|
|
|
|
clearNewMessageNotification: () ->
|
|
clearTimeout @newMessageNotificationTimeout
|
|
delete @newMessageNotificationTimeout
|
|
if @originalTitle?
|
|
window.document.title = @originalTitle
|
|
|
|
class Chat
|
|
constructor: (options) ->
|
|
_.extend(@, Backbone.Events)
|
|
window.chat = @
|
|
@rooms = {}
|
|
project_id = window.location.pathname.split( '/' )[2]
|
|
@socket = socket = io.connect options.url, {
|
|
resource: "chat/socket.io",
|
|
"force new connection": true
|
|
query:"project_id=#{project_id}"
|
|
}
|
|
|
|
@socket.on "connect", () =>
|
|
@connected = true
|
|
@getAuthToken (error, auth_token) =>
|
|
return @handleError(error) if error?
|
|
@socket.emit "auth", {auth_token: auth_token}, (error, user_info) =>
|
|
return @handleError(error) if error?
|
|
@user = User.findOrCreate(user_info)
|
|
@joinProjectRoom(options.room.project_id)
|
|
@trigger "authed"
|
|
|
|
@socket.on "disconnect", () =>
|
|
@connected = false
|
|
@trigger "disconnected"
|
|
|
|
@socket.on "messageReceived", (data) =>
|
|
@getRoom(data.message.room.id)?.onMessageReceived(data)
|
|
|
|
@socket.on "userJoined", (data) =>
|
|
@getRoom(data.room.id).addConnectedUser(data.user)
|
|
|
|
@socket.on "userLeft", (data) =>
|
|
@getRoom(data.room.id)?.removeConnectedUser(data.user)
|
|
|
|
@globalNotificationManager = new GlobalNotificationManager(@)
|
|
|
|
getRoom: (room_id) ->
|
|
@rooms[room_id]
|
|
|
|
joinProjectRoom: (project_id) ->
|
|
if !@room?
|
|
@room = new Room(
|
|
project_id: project_id
|
|
chat: @
|
|
)
|
|
@window = new ChatWindowView({
|
|
room: @room
|
|
chat: @
|
|
})
|
|
@room.on "joined", => @trigger("joinedRoom", @room)
|
|
|
|
getAuthToken: (callback = (error, auth_token) ->) ->
|
|
$.ajax "/user/auth_token", {
|
|
success: (data, status, xhr) ->
|
|
callback null, data
|
|
error: (xhr, status, error) ->
|
|
callback error
|
|
}
|
|
|
|
handleError: (error) ->
|
|
console.error error
|