export default { receiveAll (state, messages) { let latestMessage messages.forEach(message => { // create new thread if the thread doesn't exist if (!state.threads[message.threadID]) { createThread(state, message.threadID, message.threadName) } // mark the latest message if (!latestMessage || message.timestamp > latestMessage.timestamp) { latestMessage = message } // add message addMessage(state, message) }) // set initial thread to the one with the latest message setCurrentThread(state, latestMessage.threadID) }, receiveMessage (state, message) { addMessage(state, message) }, switchThread (state, id) { setCurrentThread(state, id) } } function createThread (state, id, name) { state.threads = { ...state.threads, [id]: { id, name, messages: [], lastMessage: null } } } function addMessage (state, message) { // add a `isRead` field before adding the message message.isRead = message.threadID === state.currentThreadID // add it to the thread it belongs to const thread = state.threads[message.threadID] if (!thread.messages.some(id => id === message.id)) { thread.messages.push(message.id) thread.lastMessage = message } // add it to the messages map state.messages = { ...state.messages, [message.id]: message } } function setCurrentThread (state, id) { state.currentThreadID = id if (!state.threads[id]) { debugger } // mark thread as read state.threads[id].lastMessage.isRead = true }