mirror of
https://github.com/overleaf/overleaf.git
synced 2024-12-26 05:41:43 +00:00
f9871103bf
Reenable eslint `prefer-const` rule GitOrigin-RevId: 4f3825be8b8dff381095209085a36eaab76260d5
178 lines
5.9 KiB
JavaScript
178 lines
5.9 KiB
JavaScript
/* eslint-disable
|
|
camelcase,
|
|
node/handle-callback-err,
|
|
max-len,
|
|
no-return-assign,
|
|
*/
|
|
// TODO: This file was created by bulk-decaffeinate.
|
|
// Fix any style issues and re-enable lint.
|
|
/*
|
|
* decaffeinate suggestions:
|
|
* DS101: Remove unnecessary use of Array.from
|
|
* DS102: Remove unnecessary code created because of implicit returns
|
|
* DS206: Consider reworking classes to avoid initClass
|
|
* DS207: Consider shorter variations of null checks
|
|
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
|
|
*/
|
|
import ColorManager from '../colors/ColorManager'
|
|
import 'crypto-js/md5'
|
|
import './controllers/OnlineUsersController'
|
|
|
|
let OnlineUsersManager
|
|
|
|
export default OnlineUsersManager = (function () {
|
|
OnlineUsersManager = class OnlineUsersManager {
|
|
static initClass() {
|
|
this.prototype.cursorUpdateInterval = 500
|
|
}
|
|
|
|
constructor(ide, $scope) {
|
|
this.ide = ide
|
|
this.$scope = $scope
|
|
this.$scope.onlineUsers = {}
|
|
this.$scope.onlineUserCursorHighlights = {}
|
|
this.$scope.onlineUsersArray = []
|
|
this.$scope.onlineUsersCount = 0
|
|
|
|
this.$scope.$on('cursor:editor:update', (event, position) => {
|
|
return this.sendCursorPositionUpdate(position)
|
|
})
|
|
|
|
this.$scope.$on('project:joined', () => {
|
|
return this.ide.socket.emit(
|
|
'clientTracking.getConnectedUsers',
|
|
(error, connectedUsers) => {
|
|
this.$scope.onlineUsers = {}
|
|
for (const user of Array.from(connectedUsers || [])) {
|
|
if (user.client_id === this.ide.socket.publicId) {
|
|
// Don't store myself
|
|
continue
|
|
}
|
|
// Store data in the same format returned by clientTracking.clientUpdated
|
|
|
|
this.$scope.onlineUsers[user.client_id] = {
|
|
id: user.client_id,
|
|
user_id: user.user_id,
|
|
email: user.email,
|
|
name: `${user.first_name} ${user.last_name}`,
|
|
doc_id:
|
|
user.cursorData != null ? user.cursorData.doc_id : undefined,
|
|
row: user.cursorData != null ? user.cursorData.row : undefined,
|
|
column:
|
|
user.cursorData != null ? user.cursorData.column : undefined,
|
|
}
|
|
}
|
|
return this.refreshOnlineUsers()
|
|
}
|
|
)
|
|
})
|
|
|
|
this.ide.socket.on('clientTracking.clientUpdated', client => {
|
|
if (client.id !== this.ide.socket.publicId) {
|
|
// Check it's not me!
|
|
return this.$scope.$apply(() => {
|
|
this.$scope.onlineUsers[client.id] = client
|
|
return this.refreshOnlineUsers()
|
|
})
|
|
}
|
|
})
|
|
|
|
this.ide.socket.on('clientTracking.clientDisconnected', client_id => {
|
|
return this.$scope.$apply(() => {
|
|
delete this.$scope.onlineUsers[client_id]
|
|
return this.refreshOnlineUsers()
|
|
})
|
|
})
|
|
|
|
this.$scope.getHueForUserId = user_id => {
|
|
return ColorManager.getHueForUserId(user_id)
|
|
}
|
|
}
|
|
|
|
refreshOnlineUsers() {
|
|
this.$scope.onlineUsersArray = []
|
|
|
|
for (var client_id in this.$scope.onlineUsers) {
|
|
const user = this.$scope.onlineUsers[client_id]
|
|
if (user.doc_id != null) {
|
|
user.doc = this.ide.fileTreeManager.findEntityById(user.doc_id)
|
|
}
|
|
|
|
// If the user's name is empty use their email as display name
|
|
// Otherwise they're probably an anonymous user
|
|
if (user.name === null || user.name.trim().length === 0) {
|
|
if (user.email) {
|
|
user.name = user.email.trim()
|
|
} else if (user.user_id === 'anonymous-user') {
|
|
user.name = 'Anonymous'
|
|
}
|
|
}
|
|
|
|
user.initial = user.name != null ? user.name[0] : undefined
|
|
if (!user.initial || user.initial === ' ') {
|
|
user.initial = '?'
|
|
}
|
|
|
|
this.$scope.onlineUsersArray.push(user)
|
|
}
|
|
|
|
// keep a count of the other online users
|
|
this.$scope.onlineUsersCount = this.$scope.onlineUsersArray.length
|
|
|
|
this.$scope.onlineUserCursorHighlights = {}
|
|
for (client_id in this.$scope.onlineUsers) {
|
|
const client = this.$scope.onlineUsers[client_id]
|
|
const { doc_id } = client
|
|
if (doc_id == null || client.row == null || client.column == null) {
|
|
continue
|
|
}
|
|
if (!this.$scope.onlineUserCursorHighlights[doc_id]) {
|
|
this.$scope.onlineUserCursorHighlights[doc_id] = []
|
|
}
|
|
this.$scope.onlineUserCursorHighlights[doc_id].push({
|
|
label: client.name,
|
|
cursor: {
|
|
row: client.row,
|
|
column: client.column,
|
|
},
|
|
hue: ColorManager.getHueForUserId(client.user_id),
|
|
})
|
|
}
|
|
|
|
if (this.$scope.onlineUsersArray.length > 0) {
|
|
delete this.cursorUpdateTimeout
|
|
return (this.cursorUpdateInterval = 500)
|
|
} else {
|
|
delete this.cursorUpdateTimeout
|
|
return (this.cursorUpdateInterval = 60 * 1000 * 5)
|
|
}
|
|
}
|
|
|
|
sendCursorPositionUpdate(position) {
|
|
if (position != null) {
|
|
this.$scope.currentPosition = position // keep track of the latest position
|
|
}
|
|
if (this.cursorUpdateTimeout == null) {
|
|
return (this.cursorUpdateTimeout = setTimeout(() => {
|
|
const doc_id = this.$scope.editor.open_doc_id
|
|
// always send the latest position to other clients
|
|
this.ide.socket.emit('clientTracking.updatePosition', {
|
|
row:
|
|
this.$scope.currentPosition != null
|
|
? this.$scope.currentPosition.row
|
|
: undefined,
|
|
column:
|
|
this.$scope.currentPosition != null
|
|
? this.$scope.currentPosition.column
|
|
: undefined,
|
|
doc_id,
|
|
})
|
|
|
|
return delete this.cursorUpdateTimeout
|
|
}, this.cursorUpdateInterval))
|
|
}
|
|
}
|
|
}
|
|
OnlineUsersManager.initClass()
|
|
return OnlineUsersManager
|
|
})()
|