chatMessages.js 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166
  1. /* global Raven */
  2. /* eslint-disable
  3. max-len,
  4. no-return-assign,
  5. no-unused-vars,
  6. */
  7. // TODO: This file was created by bulk-decaffeinate.
  8. // Fix any style issues and re-enable lint.
  9. /*
  10. * decaffeinate suggestions:
  11. * DS101: Remove unnecessary use of Array.from
  12. * DS102: Remove unnecessary code created because of implicit returns
  13. * DS103: Rewrite code to no longer use __guard__
  14. * DS207: Consider shorter variations of null checks
  15. * Full docs: https://github.com/decaffeinate/decaffeinate/blob/master/docs/suggestions.md
  16. */
  17. import App from '../../../base'
  18. export default App.factory('chatMessages', function($http, ide) {
  19. const MESSAGES_URL = `/project/${ide.project_id}/messages`
  20. const MESSAGE_LIMIT = 50
  21. const CONNECTED_USER_URL = `/project/${ide.project_id}/connected_users`
  22. const chat = {
  23. state: {
  24. messages: [],
  25. loading: false,
  26. atEnd: false,
  27. errored: false,
  28. nextBeforeTimestamp: null,
  29. newMessage: null
  30. }
  31. }
  32. let justSent = false
  33. ide.socket.on('new-chat-message', message => {
  34. if (
  35. __guard__(message != null ? message.user : undefined, x => x.id) ===
  36. ide.$scope.user.id &&
  37. justSent
  38. ) {
  39. // Nothing to do
  40. } else {
  41. ide.$scope.$apply(() => appendMessage(message))
  42. }
  43. return (justSent = false)
  44. })
  45. chat.sendMessage = function(message) {
  46. const body = {
  47. content: message,
  48. _csrf: window.csrfToken
  49. }
  50. justSent = true
  51. appendMessage({
  52. user: ide.$scope.user,
  53. content: message,
  54. timestamp: Date.now()
  55. })
  56. return $http.post(MESSAGES_URL, body)
  57. }
  58. chat.loadMoreMessages = function() {
  59. if (chat.state.atEnd) {
  60. return
  61. }
  62. if (chat.state.errored) {
  63. return
  64. }
  65. let url = MESSAGES_URL + `?limit=${MESSAGE_LIMIT}`
  66. if (chat.state.nextBeforeTimestamp != null) {
  67. url += `&before=${chat.state.nextBeforeTimestamp}`
  68. }
  69. chat.state.loading = true
  70. ide.$scope.$broadcast('chat:more-messages-loading', chat)
  71. return $http.get(url).then(function(response) {
  72. const messages = response.data != null ? response.data : []
  73. chat.state.loading = false
  74. if (messages.length < MESSAGE_LIMIT) {
  75. chat.state.atEnd = true
  76. }
  77. if (messages.reverse == null) {
  78. if (typeof Raven !== 'undefined' && Raven !== null) {
  79. Raven.captureException(
  80. new Error(`messages has no reverse property ${typeof messages}`)
  81. )
  82. }
  83. }
  84. if (typeof messages.reverse !== 'function') {
  85. if (typeof Raven !== 'undefined' && Raven !== null) {
  86. Raven.captureException(
  87. new Error(
  88. `messages.reverse not a function ${typeof messages.reverse} ${typeof messages}`
  89. )
  90. )
  91. }
  92. chat.state.errored = true
  93. } else {
  94. messages.reverse()
  95. prependMessages(messages)
  96. chat.state.nextBeforeTimestamp =
  97. chat.state.messages[0] != null
  98. ? chat.state.messages[0].timestamp
  99. : undefined
  100. }
  101. ide.$scope.$broadcast('chat:more-messages-loaded', chat)
  102. })
  103. }
  104. const TIMESTAMP_GROUP_SIZE = 5 * 60 * 1000 // 5 minutes
  105. const prependMessage = function(message) {
  106. const firstMessage = chat.state.messages[0]
  107. const shouldGroup =
  108. firstMessage != null &&
  109. firstMessage.user.id ===
  110. __guard__(message != null ? message.user : undefined, x => x.id) &&
  111. firstMessage.timestamp - message.timestamp < TIMESTAMP_GROUP_SIZE
  112. if (shouldGroup) {
  113. firstMessage.timestamp = message.timestamp
  114. return firstMessage.contents.unshift(message.content)
  115. } else {
  116. return chat.state.messages.unshift({
  117. user: message.user,
  118. timestamp: message.timestamp,
  119. contents: [message.content]
  120. })
  121. }
  122. }
  123. var prependMessages = messages =>
  124. Array.from(messages.slice(0).reverse()).map(message =>
  125. prependMessage(message)
  126. )
  127. var appendMessage = function(message) {
  128. chat.state.newMessage = message
  129. const lastMessage = chat.state.messages[chat.state.messages.length - 1]
  130. const shouldGroup =
  131. lastMessage != null &&
  132. lastMessage.user.id ===
  133. __guard__(message != null ? message.user : undefined, x => x.id) &&
  134. message.timestamp - lastMessage.timestamp < TIMESTAMP_GROUP_SIZE
  135. if (shouldGroup) {
  136. lastMessage.timestamp = message.timestamp
  137. lastMessage.contents.push(message.content)
  138. } else {
  139. chat.state.messages.push({
  140. user: message.user,
  141. timestamp: message.timestamp,
  142. contents: [message.content]
  143. })
  144. }
  145. ide.$scope.$broadcast('chat:more-messages-loaded', chat)
  146. }
  147. return chat
  148. })
  149. function __guard__(value, transform) {
  150. return typeof value !== 'undefined' && value !== null
  151. ? transform(value)
  152. : undefined
  153. }