message-list-appender.js 2.2 KB

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