message-list-appender.js 2.2 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879
  1. const TIMESTAMP_GROUP_SIZE = 5 * 60 * 1000 // 5 minutes
  2. export function appendMessage(messageList, message, uniqueMessageIds) {
  3. if (uniqueMessageIds.includes(message.id)) {
  4. return { messages: messageList, uniqueMessageIds }
  5. }
  6. uniqueMessageIds = uniqueMessageIds.slice(0)
  7. uniqueMessageIds.push(message.id)
  8. const lastMessage = messageList[messageList.length - 1]
  9. const shouldGroup =
  10. lastMessage &&
  11. message &&
  12. message.user &&
  13. message.user.id &&
  14. message.user.id === lastMessage.user.id &&
  15. message.timestamp - lastMessage.timestamp < TIMESTAMP_GROUP_SIZE
  16. if (shouldGroup) {
  17. messageList = messageList.slice(0, messageList.length - 1).concat({
  18. ...lastMessage,
  19. // the `id` is updated to the latest received content when a new
  20. // message is appended or prepended
  21. id: message.id,
  22. timestamp: message.timestamp,
  23. contents: lastMessage.contents.concat(message.content),
  24. })
  25. } else {
  26. messageList = messageList.slice(0).concat({
  27. id: message.id,
  28. user: message.user,
  29. timestamp: message.timestamp,
  30. contents: [message.content],
  31. })
  32. }
  33. return { messages: messageList, uniqueMessageIds }
  34. }
  35. export function prependMessages(messageList, messages, uniqueMessageIds) {
  36. const listCopy = messageList.slice(0)
  37. uniqueMessageIds = uniqueMessageIds.slice(0)
  38. messages
  39. .slice(0)
  40. .reverse()
  41. .forEach(message => {
  42. if (uniqueMessageIds.includes(message.id)) {
  43. return
  44. }
  45. uniqueMessageIds.push(message.id)
  46. const firstMessage = listCopy[0]
  47. const shouldGroup =
  48. firstMessage &&
  49. message &&
  50. message.user &&
  51. message.user.id === firstMessage.user.id &&
  52. firstMessage.timestamp - message.timestamp < TIMESTAMP_GROUP_SIZE
  53. if (shouldGroup) {
  54. firstMessage.id = message.id
  55. firstMessage.timestamp = message.timestamp
  56. firstMessage.contents = [message.content].concat(firstMessage.contents)
  57. } else {
  58. listCopy.unshift({
  59. id: message.id,
  60. user: message.user,
  61. timestamp: message.timestamp,
  62. contents: [message.content],
  63. })
  64. }
  65. })
  66. return { messages: listCopy, uniqueMessageIds }
  67. }