🐛 Bug fixes on chat
This commit is contained in:
parent
795052a950
commit
29f965bddf
@ -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);
|
||||||
|
@ -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) {
|
||||||
final pendingMessage = repository.pendingMessages.values.firstWhereOrNull(
|
pendingMessage = pending;
|
||||||
(m) => m.roomId == _roomId && m.nonce == nonce,
|
|
||||||
);
|
|
||||||
if (pendingMessage != null) {
|
|
||||||
final currentMessages = state.value ?? [];
|
final currentMessages = state.value ?? [];
|
||||||
state = AsyncValue.data([pendingMessage, ...currentMessages]);
|
state = AsyncValue.data([pending, ...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,8 +886,10 @@ class _MessageBubble extends HookConsumerWidget {
|
|||||||
textColor: textColor,
|
textColor: textColor,
|
||||||
isReply: false,
|
isReply: false,
|
||||||
),
|
),
|
||||||
|
if (message.toRemoteMessage().content?.isNotEmpty ??
|
||||||
|
false)
|
||||||
Text(
|
Text(
|
||||||
message.toRemoteMessage().content ?? '',
|
message.toRemoteMessage().content!,
|
||||||
style: TextStyle(color: textColor),
|
style: TextStyle(color: textColor),
|
||||||
),
|
),
|
||||||
if (message.toRemoteMessage().attachments.isNotEmpty)
|
if (message.toRemoteMessage().attachments.isNotEmpty)
|
||||||
@ -1026,8 +1027,10 @@ class _MessageQuoteWidget extends HookConsumerWidget {
|
|||||||
).textColor(textColor).bold(),
|
).textColor(textColor).bold(),
|
||||||
],
|
],
|
||||||
),
|
),
|
||||||
|
if (snapshot.data!.toRemoteMessage().content?.isNotEmpty ??
|
||||||
|
false)
|
||||||
Text(
|
Text(
|
||||||
snapshot.data!.toRemoteMessage().content ?? "",
|
snapshot.data!.toRemoteMessage().content!,
|
||||||
style: TextStyle(color: textColor),
|
style: TextStyle(color: textColor),
|
||||||
),
|
),
|
||||||
],
|
],
|
||||||
|
Loading…
x
Reference in New Issue
Block a user