🐛 Bug fixes on chat

This commit is contained in:
LittleSheep 2025-05-04 14:38:20 +08:00
parent 795052a950
commit 29f965bddf
2 changed files with 27 additions and 23 deletions

View File

@ -3,7 +3,6 @@ import 'package:island/database/drift_db.dart';
import 'package:island/database/message.dart'; import 'package:island/database/message.dart';
import 'package:island/models/chat.dart'; import 'package:island/models/chat.dart';
import 'package:island/models/file.dart'; import 'package:island/models/file.dart';
import 'package:island/pods/network.dart';
import 'package:island/services/file.dart'; import 'package:island/services/file.dart';
import 'package:island/widgets/alert.dart'; import 'package:island/widgets/alert.dart';
import 'package:uuid/uuid.dart'; import 'package:uuid/uuid.dart';
@ -181,6 +180,7 @@ class MessageRepository {
SnChatMessage? replyingTo, SnChatMessage? replyingTo,
SnChatMessage? forwardingTo, SnChatMessage? forwardingTo,
SnChatMessage? editingTo, SnChatMessage? editingTo,
Function(LocalChatMessage)? onPending,
}) async { }) async {
// Generate a unique nonce for this message // Generate a unique nonce for this message
final nonce = const Uuid().v4(); final nonce = const Uuid().v4();
@ -205,6 +205,7 @@ class MessageRepository {
// Store in memory and database // Store in memory and database
pendingMessages[localMessage.id] = localMessage; pendingMessages[localMessage.id] = localMessage;
await _database.saveMessage(_database.messageToCompanion(localMessage)); await _database.saveMessage(_database.messageToCompanion(localMessage));
onPending?.call(localMessage);
try { try {
var cloudAttachments = List.empty(growable: true); var cloudAttachments = List.empty(growable: true);

View File

@ -1,5 +1,4 @@
import 'package:auto_route/auto_route.dart'; import 'package:auto_route/auto_route.dart';
import 'package:collection/collection.dart';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter_hooks/flutter_hooks.dart'; import 'package:flutter_hooks/flutter_hooks.dart';
@ -124,6 +123,7 @@ class MessagesNotifier
); );
if (atk == null) throw Exception("Unauthorized"); if (atk == null) throw Exception("Unauthorized");
LocalChatMessage? pendingMessage;
final messageTask = repository.sendMessage( final messageTask = repository.sendMessage(
atk, atk,
baseUrl, baseUrl,
@ -134,21 +134,19 @@ class MessagesNotifier
replyingTo: replyingTo, replyingTo: replyingTo,
forwardingTo: forwardingTo, forwardingTo: forwardingTo,
editingTo: editingTo, editingTo: editingTo,
onPending: (pending) {
pendingMessage = pending;
final currentMessages = state.value ?? [];
state = AsyncValue.data([pending, ...currentMessages]);
},
); );
final pendingMessage = repository.pendingMessages.values.firstWhereOrNull(
(m) => m.roomId == _roomId && m.nonce == nonce,
);
if (pendingMessage != null) {
final currentMessages = state.value ?? [];
state = AsyncValue.data([pendingMessage, ...currentMessages]);
}
final message = await messageTask; final message = await messageTask;
final updatedMessages = state.value ?? []; final updatedMessages = state.value ?? [];
if (pendingMessage != null) { if (pendingMessage != null) {
final index = updatedMessages.indexWhere( final index = updatedMessages.indexWhere(
(m) => m.id == pendingMessage.id, (m) => m.id == pendingMessage!.id,
); );
if (index >= 0) { if (index >= 0) {
final newList = [...updatedMessages]; final newList = [...updatedMessages];
@ -415,7 +413,8 @@ class ChatRoomScreen extends HookConsumerWidget {
} }
void sendMessage() { void sendMessage() {
if (messageController.text.trim().isNotEmpty) { if (messageController.text.trim().isNotEmpty ||
attachments.value.isNotEmpty) {
messagesNotifier.sendMessage( messagesNotifier.sendMessage(
messageController.text.trim(), messageController.text.trim(),
attachments.value, attachments.value,
@ -572,8 +571,8 @@ class ChatRoomScreen extends HookConsumerWidget {
messageEditingTo: messageEditingTo.value, messageEditingTo: messageEditingTo.value,
messageReplyingTo: messageReplyingTo.value, messageReplyingTo: messageReplyingTo.value,
messageForwardingTo: messageForwardingTo.value, messageForwardingTo: messageForwardingTo.value,
onPickFile: (bool isVideo) { onPickFile: (bool isPhoto) {
if (isVideo) { if (isPhoto) {
pickPhotoMedia(); pickPhotoMedia();
} else { } else {
pickVideoMedia(); pickVideoMedia();
@ -617,7 +616,7 @@ class _ChatInput extends StatelessWidget {
final SnChat chatRoom; final SnChat chatRoom;
final VoidCallback onSend; final VoidCallback onSend;
final VoidCallback onClear; final VoidCallback onClear;
final Function(bool isVideo) onPickFile; final Function(bool isPhoto) onPickFile;
final SnChatMessage? messageReplyingTo; final SnChatMessage? messageReplyingTo;
final SnChatMessage? messageForwardingTo; final SnChatMessage? messageForwardingTo;
final SnChatMessage? messageEditingTo; final SnChatMessage? messageEditingTo;
@ -730,7 +729,7 @@ class _ChatInput extends StatelessWidget {
), ),
), ),
PopupMenuItem( PopupMenuItem(
onTap: () => onPickFile(true), onTap: () => onPickFile(false),
child: Row( child: Row(
spacing: 12, spacing: 12,
children: [ children: [
@ -887,10 +886,12 @@ class _MessageBubble extends HookConsumerWidget {
textColor: textColor, textColor: textColor,
isReply: false, isReply: false,
), ),
Text( if (message.toRemoteMessage().content?.isNotEmpty ??
message.toRemoteMessage().content ?? '', false)
style: TextStyle(color: textColor), Text(
), message.toRemoteMessage().content!,
style: TextStyle(color: textColor),
),
if (message.toRemoteMessage().attachments.isNotEmpty) if (message.toRemoteMessage().attachments.isNotEmpty)
CloudFileList( CloudFileList(
files: message.toRemoteMessage().attachments, files: message.toRemoteMessage().attachments,
@ -1026,10 +1027,12 @@ class _MessageQuoteWidget extends HookConsumerWidget {
).textColor(textColor).bold(), ).textColor(textColor).bold(),
], ],
), ),
Text( if (snapshot.data!.toRemoteMessage().content?.isNotEmpty ??
snapshot.data!.toRemoteMessage().content ?? "", false)
style: TextStyle(color: textColor), Text(
), snapshot.data!.toRemoteMessage().content!,
style: TextStyle(color: textColor),
),
], ],
), ),
), ),