Line data Source code
1 : 2 : import 'dart:collection'; 3 : 4 : import 'package:chatwoot_client_sdk/data/local/entity/chatwoot_message.dart'; 5 : import 'package:hive_flutter/hive_flutter.dart'; 6 : 7 : 8 : abstract class ChatwootMessagesDao{ 9 : Future<void> saveMessage(ChatwootMessage message); 10 : Future<void> saveAllMessages(List<ChatwootMessage> messages); 11 : ChatwootMessage? getMessage(int messageId); 12 : List<ChatwootMessage> getMessages(); 13 : Future<void> clear(); 14 : Future<void> deleteMessage(int messageId); 15 : Future<void> onDispose(); 16 : 17 : Future<void> clearAll(); 18 : } 19 : 20 : //Only used when persistence is enabled 21 19 : enum ChatwootMessagesBoxNames{ 22 : MESSAGES, MESSAGES_TO_CLIENT_INSTANCE_KEY 23 : } 24 : class PersistedChatwootMessagesDao extends ChatwootMessagesDao{ 25 : // box containing all persisted messages 26 : final Box<ChatwootMessage> _box; 27 : 28 : final String _clientInstanceKey; 29 : 30 : //box with many to one relation 31 : final Box<String> _messageIdToClientInstanceKeyBox; 32 : 33 2 : PersistedChatwootMessagesDao( 34 : this._box, 35 : this._messageIdToClientInstanceKeyBox, 36 : this._clientInstanceKey 37 : ); 38 : 39 : @override 40 1 : Future<void> clear() async{ 41 : 42 : //filter current client instance message ids 43 1 : Iterable clientMessageIds = _messageIdToClientInstanceKeyBox 44 1 : .keys 45 6 : .where((key) => _messageIdToClientInstanceKeyBox.get(key) == _clientInstanceKey); 46 : 47 3 : await _box.deleteAll(clientMessageIds); 48 : } 49 : 50 : @override 51 1 : Future<void> saveMessage(ChatwootMessage message) async{ 52 4 : await _box.put(message.id, message); 53 5 : await _messageIdToClientInstanceKeyBox.put(message.id, _clientInstanceKey); 54 1 : print("saved"); 55 : } 56 : 57 : @override 58 1 : Future<void> saveAllMessages(List<ChatwootMessage> messages) async{ 59 1 : for(ChatwootMessage message in messages) 60 3 : await saveMessage(message); 61 : } 62 : 63 1 : @override 64 : List<ChatwootMessage> getMessages(){ 65 1 : final messageClientInstancekey = _clientInstanceKey; 66 : 67 : //filter current client instance message ids 68 1 : Set<int> clientMessageIds = _messageIdToClientInstanceKeyBox 69 1 : .keys 70 2 : .map((e) => e as int) 71 5 : .where((key) => _messageIdToClientInstanceKeyBox.get(key) == messageClientInstancekey) 72 1 : .toSet(); 73 : 74 : //retrieve messages with ids 75 1 : List<ChatwootMessage> sortedMessages = _box 76 1 : .values 77 4 : .where((message) => clientMessageIds.contains(message.id)) 78 1 : .toList(growable: false); 79 : 80 : //sort message using creation dates 81 1 : sortedMessages.sort((a,b){ 82 0 : return a.createdAt.compareTo(b.createdAt); 83 : }); 84 : 85 : return sortedMessages; 86 : } 87 : 88 : @override 89 1 : Future<void> onDispose() async{ 90 3 : await _box.close(); 91 : } 92 : 93 : @override 94 1 : Future<void> deleteMessage(int messageId) async{ 95 3 : await _box.delete(messageId); 96 3 : await _messageIdToClientInstanceKeyBox.delete(messageId); 97 : } 98 : 99 1 : @override 100 : ChatwootMessage? getMessage(int messageId) { 101 2 : return _box.get(messageId,defaultValue: null); 102 : } 103 : 104 : @override 105 1 : Future<void> clearAll() async{ 106 3 : await _box.clear(); 107 3 : await _box.clear(); 108 : } 109 : 110 3 : static Future<void> openDB() async{ 111 12 : await Hive.openBox<ChatwootMessage>(ChatwootMessagesBoxNames.MESSAGES.toString()); 112 8 : await Hive.openBox<String>(ChatwootMessagesBoxNames.MESSAGES_TO_CLIENT_INSTANCE_KEY.toString()); 113 : } 114 : 115 : } 116 : 117 : class NonPersistedChatwootMessagesDao extends ChatwootMessagesDao{ 118 : HashMap<int, ChatwootMessage> _messages = new HashMap(); 119 : 120 : @override 121 1 : Future<void> clear() async{ 122 2 : _messages.clear(); 123 : } 124 : 125 : @override 126 1 : Future<void> deleteMessage(int messageId) async{ 127 2 : _messages.remove(messageId); 128 : } 129 : 130 1 : @override 131 : ChatwootMessage? getMessage(int messageId) { 132 2 : return _messages[messageId]; 133 : } 134 : 135 1 : @override 136 : List<ChatwootMessage> getMessages() { 137 3 : List<ChatwootMessage> sortedMessages = _messages.values.toList(growable: false); 138 1 : sortedMessages.sort((a,b){ 139 0 : return a.createdAt.compareTo(b.createdAt); 140 : }); 141 : return sortedMessages; 142 : } 143 : 144 : @override 145 1 : Future<void> onDispose() async{ 146 2 : _messages.clear(); 147 : } 148 : 149 : @override 150 1 : Future<void> saveAllMessages(List<ChatwootMessage> messages) async{ 151 2 : messages.forEach((element) async{ 152 2 : await saveMessage(element); 153 : }); 154 : } 155 : 156 : @override 157 1 : Future<void> saveMessage(ChatwootMessage message) async{ 158 4 : _messages.update(message.id, (value) => message, ifAbsent: ()=>message); 159 : } 160 : 161 : @override 162 1 : Future<void> clearAll() async{ 163 2 : _messages.clear(); 164 : } 165 : 166 : }