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