Chat, chat local db, chat messaging retriving (no sync yet)

This commit is contained in:
2025-05-03 14:19:46 +08:00
parent b2c31bcf13
commit e2e6de965b
30 changed files with 258 additions and 206 deletions

View File

@ -75,7 +75,7 @@ class AppDatabase extends _$AppDatabase {
LazyDatabase _openConnection() {
return LazyDatabase(() async {
final dbFolder = await getApplicationDocumentsDirectory();
final file = File(p.join(dbFolder.path, 'island_chat.sqlite'));
final file = File(p.join(dbFolder.path, 'solar_network_data.sqlite'));
return NativeDatabase(file);
});
}

View File

@ -12,7 +12,7 @@ class MessageRepository {
SnChatMember? _identity;
final Map<String, LocalChatMessage> _pendingMessages = {};
final Map<String, LocalChatMessage> pendingMessages = {};
MessageRepository(this.room, this._apiClient, this._database) {
initialize();
@ -84,7 +84,7 @@ class MessageRepository {
// Combine with pending messages
final pendingForRoom =
_pendingMessages.values.where((msg) => msg.roomId == roomId).toList();
pendingMessages.values.where((msg) => msg.roomId == roomId).toList();
// Sort by timestamp descending (newest first)
final allMessages = [...pendingForRoom, ...dbLocalMessages];
@ -127,7 +127,7 @@ class MessageRepository {
for (final message in messages) {
await _database.saveMessage(_database.messageToCompanion(message));
if (message.nonce != null) {
_pendingMessages.removeWhere(
pendingMessages.removeWhere(
(_, pendingMsg) => pendingMsg.nonce == message.nonce,
);
}
@ -138,11 +138,12 @@ class MessageRepository {
Future<LocalChatMessage> sendMessage(
int roomId,
String content, {
String content,
String nonce, {
List<SnCloudFile>? attachments,
Map<String, dynamic>? meta,
}) async {
if (!initialized) {
if (!initialized || _identity == null) {
throw UnsupportedError(
"The message repository is not ready for send message.",
);
@ -169,7 +170,7 @@ class MessageRepository {
);
// Store in memory and database
_pendingMessages[localMessage.id] = localMessage;
pendingMessages[localMessage.id] = localMessage;
await _database.saveMessage(_database.messageToCompanion(localMessage));
try {
@ -192,7 +193,7 @@ class MessageRepository {
);
// Remove from pending and update in database
_pendingMessages.remove(localMessage.id);
pendingMessages.remove(localMessage.id);
await _database.deleteMessage(localMessage.id);
await _database.saveMessage(_database.messageToCompanion(updatedMessage));
@ -200,7 +201,7 @@ class MessageRepository {
} catch (e) {
// Update status to failed
localMessage.status = MessageStatus.failed;
_pendingMessages[localMessage.id] = localMessage;
pendingMessages[localMessage.id] = localMessage;
await _database.updateMessageStatus(
localMessage.id,
MessageStatus.failed,
@ -210,14 +211,14 @@ class MessageRepository {
}
Future<LocalChatMessage> retryMessage(String pendingMessageId) async {
final message = _pendingMessages[pendingMessageId];
final message = pendingMessages[pendingMessageId];
if (message == null) {
throw Exception('Message not found');
}
// Update status back to pending
message.status = MessageStatus.pending;
_pendingMessages[pendingMessageId] = message;
pendingMessages[pendingMessageId] = message;
await _database.updateMessageStatus(
pendingMessageId,
MessageStatus.pending,
@ -244,7 +245,7 @@ class MessageRepository {
);
// Remove from pending and update in database
_pendingMessages.remove(pendingMessageId);
pendingMessages.remove(pendingMessageId);
await _database.deleteMessage(pendingMessageId);
await _database.saveMessage(_database.messageToCompanion(updatedMessage));
@ -252,7 +253,7 @@ class MessageRepository {
} catch (e) {
// Update status to failed
message.status = MessageStatus.failed;
_pendingMessages[pendingMessageId] = message;
pendingMessages[pendingMessageId] = message;
await _database.updateMessageStatus(
pendingMessageId,
MessageStatus.failed,