MessageCache.qml (2030B)
1 import QtQuick 2 3 // Singleton-like persistent message cache 4 QtObject { 5 id: root 6 7 // Map of chatId -> array of messages 8 property var messagesByChat: ({}) 9 10 // Get messages for a specific chat 11 function getMessages(chatId) { 12 if (!messagesByChat) { 13 messagesByChat = {} 14 } 15 if (!messagesByChat[chatId]) { 16 messagesByChat[chatId] = [] 17 } 18 return messagesByChat[chatId] 19 } 20 21 // Add a message to a specific chat 22 function addMessage(chatId, messageData) { 23 if (!messagesByChat[chatId]) { 24 messagesByChat[chatId] = [] 25 } 26 27 // Check for duplicates 28 var messages = messagesByChat[chatId] 29 for (var i = 0; i < messages.length; i++) { 30 if (messages[i].id === messageData.id) { 31 return false 32 } 33 } 34 35 messages.push(messageData) 36 messagesByChat[chatId] = messages 37 return true 38 } 39 40 // Set all messages for a chat (from fetch) 41 function setMessages(chatId, messagesArray) { 42 messagesByChat[chatId] = messagesArray.slice() // Create a copy 43 } 44 45 // Prepend older messages (for pagination) 46 function prependMessages(chatId, messagesArray) { 47 if (!messagesByChat[chatId]) { 48 messagesByChat[chatId] = [] 49 } 50 messagesByChat[chatId] = messagesArray.concat(messagesByChat[chatId]) 51 } 52 53 // Clear messages for a chat 54 function clearMessages(chatId) { 55 messagesByChat[chatId] = [] 56 } 57 58 // Listen for SSE messages 59 Connections { 60 target: NetworkManager 61 function onMessageReceived(messageData) { 62 var chatId = messageData.chat_id 63 if (chatId === undefined || chatId < 0) { 64 return 65 } 66 67 root.addMessage(chatId, messageData) 68 root.messageAdded(chatId, messageData) 69 } 70 } 71 72 // Signal when a message is added (so views can refresh) 73 signal messageAdded(int chatId, var messageData) 74 }