mutations.js 1.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960
  1. import Vue from 'vue'
  2. export default {
  3. receiveAll (state, messages) {
  4. let latestMessage
  5. messages.forEach(message => {
  6. // create new thread if the thread doesn't exist
  7. if (!state.threads[message.threadID]) {
  8. createThread(state, message.threadID, message.threadName)
  9. }
  10. // mark the latest message
  11. if (!latestMessage || message.timestamp > latestMessage.timestamp) {
  12. latestMessage = message
  13. }
  14. // add message
  15. addMessage(state, message)
  16. })
  17. // set initial thread to the one with the latest message
  18. setCurrentThread(state, latestMessage.threadID)
  19. },
  20. receiveMessage (state, message) {
  21. addMessage(state, message)
  22. },
  23. switchThread (state, id) {
  24. setCurrentThread(state, id)
  25. }
  26. }
  27. function createThread (state, id, name) {
  28. Vue.set(state.threads, id, {
  29. id,
  30. name,
  31. messages: [],
  32. lastMessage: null
  33. })
  34. }
  35. function addMessage (state, message) {
  36. // add a `isRead` field before adding the message
  37. message.isRead = message.threadID === state.currentThreadID
  38. // add it to the thread it belongs to
  39. const thread = state.threads[message.threadID]
  40. if (!thread.messages.some(id => id === message.id)) {
  41. thread.messages.push(message.id)
  42. thread.lastMessage = message
  43. }
  44. // add it to the messages map
  45. Vue.set(state.messages, message.id, message)
  46. }
  47. function setCurrentThread (state, id) {
  48. state.currentThreadID = id
  49. if (!state.threads[id]) {
  50. debugger
  51. }
  52. // mark thread as read
  53. state.threads[id].lastMessage.isRead = true
  54. }