diff --git a/lib/database/message_repository.dart b/lib/database/message_repository.dart index b3352aa..b8296e5 100644 --- a/lib/database/message_repository.dart +++ b/lib/database/message_repository.dart @@ -3,7 +3,6 @@ import 'package:island/database/drift_db.dart'; import 'package:island/database/message.dart'; import 'package:island/models/chat.dart'; import 'package:island/models/file.dart'; -import 'package:island/pods/network.dart'; import 'package:island/services/file.dart'; import 'package:island/widgets/alert.dart'; import 'package:uuid/uuid.dart'; @@ -181,6 +180,7 @@ class MessageRepository { SnChatMessage? replyingTo, SnChatMessage? forwardingTo, SnChatMessage? editingTo, + Function(LocalChatMessage)? onPending, }) async { // Generate a unique nonce for this message final nonce = const Uuid().v4(); @@ -205,6 +205,7 @@ class MessageRepository { // Store in memory and database pendingMessages[localMessage.id] = localMessage; await _database.saveMessage(_database.messageToCompanion(localMessage)); + onPending?.call(localMessage); try { var cloudAttachments = List.empty(growable: true); diff --git a/lib/screens/chat/room.dart b/lib/screens/chat/room.dart index 6736737..2fc27b7 100644 --- a/lib/screens/chat/room.dart +++ b/lib/screens/chat/room.dart @@ -1,5 +1,4 @@ import 'package:auto_route/auto_route.dart'; -import 'package:collection/collection.dart'; import 'package:easy_localization/easy_localization.dart'; import 'package:flutter/material.dart'; import 'package:flutter_hooks/flutter_hooks.dart'; @@ -124,6 +123,7 @@ class MessagesNotifier ); if (atk == null) throw Exception("Unauthorized"); + LocalChatMessage? pendingMessage; final messageTask = repository.sendMessage( atk, baseUrl, @@ -134,21 +134,19 @@ class MessagesNotifier replyingTo: replyingTo, forwardingTo: forwardingTo, 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 updatedMessages = state.value ?? []; if (pendingMessage != null) { final index = updatedMessages.indexWhere( - (m) => m.id == pendingMessage.id, + (m) => m.id == pendingMessage!.id, ); if (index >= 0) { final newList = [...updatedMessages]; @@ -415,7 +413,8 @@ class ChatRoomScreen extends HookConsumerWidget { } void sendMessage() { - if (messageController.text.trim().isNotEmpty) { + if (messageController.text.trim().isNotEmpty || + attachments.value.isNotEmpty) { messagesNotifier.sendMessage( messageController.text.trim(), attachments.value, @@ -572,8 +571,8 @@ class ChatRoomScreen extends HookConsumerWidget { messageEditingTo: messageEditingTo.value, messageReplyingTo: messageReplyingTo.value, messageForwardingTo: messageForwardingTo.value, - onPickFile: (bool isVideo) { - if (isVideo) { + onPickFile: (bool isPhoto) { + if (isPhoto) { pickPhotoMedia(); } else { pickVideoMedia(); @@ -617,7 +616,7 @@ class _ChatInput extends StatelessWidget { final SnChat chatRoom; final VoidCallback onSend; final VoidCallback onClear; - final Function(bool isVideo) onPickFile; + final Function(bool isPhoto) onPickFile; final SnChatMessage? messageReplyingTo; final SnChatMessage? messageForwardingTo; final SnChatMessage? messageEditingTo; @@ -730,7 +729,7 @@ class _ChatInput extends StatelessWidget { ), ), PopupMenuItem( - onTap: () => onPickFile(true), + onTap: () => onPickFile(false), child: Row( spacing: 12, children: [ @@ -887,10 +886,12 @@ class _MessageBubble extends HookConsumerWidget { textColor: textColor, isReply: false, ), - Text( - message.toRemoteMessage().content ?? '', - style: TextStyle(color: textColor), - ), + if (message.toRemoteMessage().content?.isNotEmpty ?? + false) + Text( + message.toRemoteMessage().content!, + style: TextStyle(color: textColor), + ), if (message.toRemoteMessage().attachments.isNotEmpty) CloudFileList( files: message.toRemoteMessage().attachments, @@ -1026,10 +1027,12 @@ class _MessageQuoteWidget extends HookConsumerWidget { ).textColor(textColor).bold(), ], ), - Text( - snapshot.data!.toRemoteMessage().content ?? "", - style: TextStyle(color: textColor), - ), + if (snapshot.data!.toRemoteMessage().content?.isNotEmpty ?? + false) + Text( + snapshot.data!.toRemoteMessage().content!, + style: TextStyle(color: textColor), + ), ], ), ),