message-list-appender.js 1.7 KB

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