Removed Angular chat (#3553)

GitOrigin-RevId: dd9f6b3adff13d28ef251f61c7a2b54fff2d9ae7
This commit is contained in:
Miguel Serrano 2021-01-21 10:48:12 +01:00 committed by Copybot
parent 7e7beffa59
commit 846510b2e6
9 changed files with 4 additions and 378 deletions

View file

@ -774,9 +774,6 @@ const ProjectController = {
})
}
const wantsOldChatUI =
req.query && req.query.new_chat_ui === 'false'
const wantsOldLogsUI =
req.query && req.query.new_logs_ui === 'false'
@ -836,7 +833,6 @@ const ProjectController = {
wsUrl,
showSupport: Features.hasFeature('support'),
showNewLogsUI: user.alphaProgram && !wantsOldLogsUI,
showNewChatUI: user.betaProgram && !wantsOldChatUI,
showReactFileTree: user.betaProgram && !wantsOldFileTreeUI
})
timer.done()

View file

@ -107,10 +107,10 @@ block content
if !isRestrictedTokenMember
.ui-layout-east
if showNewChatUI
include ./editor/chat-react
else
include ./editor/chat
aside.chat(
ng-controller="ReactChatController"
)
chat(reset-unread-messages="resetUnreadMessages" chat-is-open="chatIsOpen")
script(type="text/ng-template", id="genericMessageModalTemplate")
.modal-header

View file

@ -1,4 +0,0 @@
aside.chat(
ng-controller="ReactChatController"
)
chat(reset-unread-messages="resetUnreadMessages" chat-is-open="chatIsOpen")

View file

@ -1,53 +0,0 @@
aside.chat(
ng-controller="ChatController",
ng-if="!anonymous"
)
.messages(
infinite-scroll="loadMoreMessages()"
infinite-scroll-disabled="chat.loading || chat.atEnd || chat.errored"
infinite-scroll-initialize="ui.chatOpen"
infinite-scroll-upwards="true"
update-scroll-bottom-on="updateScrollPosition"
)
.infinite-scroll-inner
.loading(ng-show="chat.loading")
i.fa.fa-fw.fa-spin.fa-refresh
|   #{translate("loading")}…
.no-messages.text-center.small(ng-show='!chat.loading && chat.messages.length == 0')
| #{translate("no_messages")}
.first-message.text-center(ng-show='!chat.loading && chat.messages.length == 0')
| #{translate("send_first_message")}
br
i.fa.fa-arrow-down
ul.list-unstyled(
ng-click="resetUnreadMessages()"
)
li.message(
ng-repeat="message in chat.messages"
ng-controller="ChatMessageController"
ng-class="{'self': message.user.id == user.id }"
)
div.date(ng-if="$index == 0 || (message.timestamp - chat.messages[$index - 1].timestamp) > 5 * 60 * 1000") {{ message.timestamp | formatDate:'h:mm a' }} {{ message.timestamp | relativeDate }}
div.message-wrapper
.name(ng-if="message.user.id != user.id")
span(ng-if="message.user.first_name") {{ message.user.first_name }}
span(ng-if="!message.user.first_name") {{ message.user.email }}
.message(
ng-style="getMessageStyle(message.user);"
)
.arrow(ng-if="message.user.id != user.id" ng-style="getArrowStyle(message.user)")
.message-content
p(
mathjax,
mathjax-allow-html="true",
ng-repeat="content in message.contents track by $index"
)
span(ng-bind-html="content | linky:'_blank':{rel: 'noreferrer noopener'}")
.new-message
textarea(
placeholder=translate('your_message')+"…",
on-enter="sendMessage()",
ng-model="newMessageContent",
ng-click="resetUnreadMessages()"
)

View file

@ -1,37 +0,0 @@
/* eslint-disable
max-len,
no-return-assign,
no-unused-vars,
no-useless-escape,
*/
// 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
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
*/
import App from '../base'
const DEF_MIN_LENGTH = 20
const _decodeHTMLEntities = str =>
str.replace(/&#(\d+);/g, (match, dec) => String.fromCharCode(dec))
const _getWrappedWordsString = function(baseStr, wrapperElName, minLength) {
let outputStr
minLength = minLength || DEF_MIN_LENGTH
const words = baseStr.split(' ')
const wordsWrapped = Array.from(words).map(word =>
_decodeHTMLEntities(word).length >= minLength
? `<${wrapperElName} class=\"break-word\">${word}</${wrapperElName}>`
: word
)
return (outputStr = wordsWrapped.join(' '))
}
export default App.filter('wrapLongWords', () => (input, minLength) =>
_getWrappedWordsString(input, 'span', minLength)
)

View file

@ -1,52 +0,0 @@
/* eslint-disable
max-len,
no-return-assign,
*/
// TODO: This file was created by bulk-decaffeinate.
// Fix any style issues and re-enable lint.
/*
* decaffeinate suggestions:
* DS102: Remove unnecessary code created because of implicit returns
* DS207: Consider shorter variations of null checks
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
*/
import App from '../../../base'
import '../services/chatMessages'
export default App.controller('ChatController', function(
$scope,
chatMessages,
ide,
$location
) {
$scope.chat = chatMessages.state
$scope.$watch(
'chat.messages',
function(messages) {
if (messages != null) {
return $scope.$emit('updateScrollPosition')
}
},
true
) // Deep watch
$scope.$on('layout:chat:resize', () => $scope.$emit('updateScrollPosition'))
$scope.$watch('chat.newMessage', function(message) {
if (message != null) {
return ide.$scope.$broadcast('chat:newMessage', message)
}
})
$scope.resetUnreadMessages = () =>
ide.$scope.$broadcast('chat:resetUnreadMessages')
$scope.sendMessage = function() {
const message = $scope.newMessageContent
$scope.newMessageContent = ''
return chatMessages.sendMessage(message)
}
return ($scope.loadMoreMessages = () => chatMessages.loadMoreMessages())
})

View file

@ -1,58 +0,0 @@
/* eslint-disable
max-len,
no-return-assign,
*/
// TODO: This file was created by bulk-decaffeinate.
// Fix any style issues and re-enable lint.
/*
* decaffeinate suggestions:
* DS102: Remove unnecessary code created because of implicit returns
* DS207: Consider shorter variations of null checks
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
*/
import App from '../../../base'
import ColorManager from '../../colors/ColorManager'
export default App.controller('ChatMessageController', function($scope, ide) {
const hslColorConfigs = {
borderSaturation:
(window.uiConfig != null
? window.uiConfig.chatMessageBorderSaturation
: undefined) || '70%',
borderLightness:
(window.uiConfig != null
? window.uiConfig.chatMessageBorderLightness
: undefined) || '70%',
bgSaturation:
(window.uiConfig != null
? window.uiConfig.chatMessageBgSaturation
: undefined) || '60%',
bgLightness:
(window.uiConfig != null
? window.uiConfig.chatMessageBgLightness
: undefined) || '97%'
}
const hue = function(user) {
if (user == null) {
return 0
} else {
return ColorManager.getHueForUserId(user.id)
}
}
$scope.getMessageStyle = user => ({
'border-color': `hsl(${hue(user)}, ${hslColorConfigs.borderSaturation}, ${
hslColorConfigs.borderLightness
})`,
'background-color': `hsl(${hue(user)}, ${hslColorConfigs.bgSaturation}, ${
hslColorConfigs.bgLightness
})`
})
return ($scope.getArrowStyle = user => ({
'border-color': `hsl(${hue(user)}, ${hslColorConfigs.borderSaturation}, ${
hslColorConfigs.borderLightness
})`
}))
})

View file

@ -1,6 +1,2 @@
import './controllers/ChatButtonController'
import './controllers/ChatController'
import './controllers/ChatMessageController'
import '../../directives/mathjax'
import '../../filters/wrapLongWords'
import '../../features/chat/controllers/chat-controller'

View file

@ -1,162 +0,0 @@
/* eslint-disable
max-len,
no-return-assign,
no-unused-vars,
*/
// 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
* DS103: Rewrite code to no longer use __guard__
* DS207: Consider shorter variations of null checks
* Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
*/
import App from '../../../base'
import { captureException } from '../../../infrastructure/error-reporter'
export default App.factory('chatMessages', function($http, ide) {
const MESSAGES_URL = `/project/${ide.project_id}/messages`
const MESSAGE_LIMIT = 50
const CONNECTED_USER_URL = `/project/${ide.project_id}/connected_users`
const chat = {
state: {
messages: [],
loading: false,
atEnd: false,
errored: false,
nextBeforeTimestamp: null,
newMessage: null
}
}
let justSent = false
ide.socket.on('new-chat-message', message => {
if (
__guard__(message != null ? message.user : undefined, x => x.id) ===
ide.$scope.user.id &&
justSent
) {
// Nothing to do
} else {
ide.$scope.$apply(() => appendMessage(message))
}
return (justSent = false)
})
chat.sendMessage = function(message) {
const body = {
content: message,
_csrf: window.csrfToken
}
justSent = true
appendMessage({
user: ide.$scope.user,
content: message,
timestamp: Date.now()
})
return $http.post(MESSAGES_URL, body)
}
chat.loadMoreMessages = function() {
if (chat.state.atEnd) {
return
}
if (chat.state.errored) {
return
}
let url = MESSAGES_URL + `?limit=${MESSAGE_LIMIT}`
if (chat.state.nextBeforeTimestamp != null) {
url += `&before=${chat.state.nextBeforeTimestamp}`
}
chat.state.loading = true
ide.$scope.$broadcast('chat:more-messages-loading', chat)
return $http.get(url).then(function(response) {
const messages = response.data != null ? response.data : []
chat.state.loading = false
if (messages.length < MESSAGE_LIMIT) {
chat.state.atEnd = true
}
if (messages.reverse == null) {
captureException(
new Error(`messages has no reverse property ${typeof messages}`)
)
}
if (typeof messages.reverse !== 'function') {
captureException(
new Error(
`messages.reverse not a function ${typeof messages.reverse} ${typeof messages}`
)
)
chat.state.errored = true
} else {
messages.reverse()
prependMessages(messages)
chat.state.nextBeforeTimestamp =
chat.state.messages[0] != null
? chat.state.messages[0].timestamp
: undefined
}
ide.$scope.$broadcast('chat:more-messages-loaded', chat)
})
}
const TIMESTAMP_GROUP_SIZE = 5 * 60 * 1000 // 5 minutes
const prependMessage = function(message) {
const firstMessage = chat.state.messages[0]
const shouldGroup =
firstMessage != null &&
firstMessage.user.id ===
__guard__(message != null ? message.user : undefined, x => x.id) &&
firstMessage.timestamp - message.timestamp < TIMESTAMP_GROUP_SIZE
if (shouldGroup) {
firstMessage.timestamp = message.timestamp
return firstMessage.contents.unshift(message.content)
} else {
return chat.state.messages.unshift({
user: message.user,
timestamp: message.timestamp,
contents: [message.content]
})
}
}
var prependMessages = messages =>
Array.from(messages.slice(0).reverse()).map(message =>
prependMessage(message)
)
var appendMessage = function(message) {
chat.state.newMessage = message
const lastMessage = chat.state.messages[chat.state.messages.length - 1]
const shouldGroup =
lastMessage != null &&
lastMessage.user.id ===
__guard__(message != null ? message.user : undefined, x => x.id) &&
message.timestamp - lastMessage.timestamp < TIMESTAMP_GROUP_SIZE
if (shouldGroup) {
lastMessage.timestamp = message.timestamp
lastMessage.contents.push(message.content)
} else {
chat.state.messages.push({
user: message.user,
timestamp: message.timestamp,
contents: [message.content]
})
}
ide.$scope.$broadcast('chat:more-messages-loaded', chat)
}
return chat
})
function __guard__(value, transform) {
return typeof value !== 'undefined' && value !== null
? transform(value)
: undefined
}