mutations.js 1.5 KB

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