message-list-appender.ts 2.4 KB

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