mutations.js 1.6 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061
  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. const threadID = message.threadID
  9. let thread = state.threads[threadID]
  10. if (!thread) {
  11. thread = createThread(state, threadID, message.threadName)
  12. }
  13. // mark the latest message
  14. if (!latestMessage || message.timestamp > latestMessage.timestamp) {
  15. latestMessage = message
  16. }
  17. // add message
  18. addMessage(state, message)
  19. })
  20. // set initial thread to the one with the latest message
  21. setCurrentThread(state, latestMessage.threadID)
  22. },
  23. [types.RECEIVE_MESSAGE] (state, message) {
  24. addMessage(state, message)
  25. },
  26. [types.SWITCH_THREAD] (state, id) {
  27. setCurrentThread(state, id)
  28. }
  29. }
  30. function createThread (state, id, name) {
  31. const thread = {
  32. id,
  33. name,
  34. messages: {},
  35. lastMessage: null
  36. }
  37. set(state.threads, id, thread)
  38. return thread
  39. }
  40. function addMessage (state, message) {
  41. // add a `isRead` field before adding the message
  42. message.isRead = message.threadID === state.currentThreadID
  43. const thread = state.threads[message.threadID]
  44. set(thread.messages, message.id, message)
  45. thread.lastMessage = message
  46. }
  47. function setCurrentThread (state, id) {
  48. state.currentThreadID = id
  49. // mark thread messages as read
  50. const thread = state.threads[id]
  51. Object.keys(thread.messages).forEach(mid => {
  52. thread.messages[mid].isRead = true
  53. })
  54. }