💄 Optimize message styling
This commit is contained in:
@@ -453,14 +453,23 @@ class MessagesNotifier extends _$MessagesNotifier {
|
|||||||
await _database.deleteMessage(localMessage.id);
|
await _database.deleteMessage(localMessage.id);
|
||||||
await _database.saveMessage(_database.messageToCompanion(updatedMessage));
|
await _database.saveMessage(_database.messageToCompanion(updatedMessage));
|
||||||
|
|
||||||
|
final currentMessages = state.value ?? [];
|
||||||
|
if (editingTo != null) {
|
||||||
|
final newMessages = currentMessages
|
||||||
|
.where((m) => m.id != localMessage.id) // remove pending message
|
||||||
|
.map((m) => m.id == editingTo.id ? updatedMessage : m) // update original message
|
||||||
|
.toList();
|
||||||
|
state = AsyncValue.data(newMessages);
|
||||||
|
} else {
|
||||||
final newMessages =
|
final newMessages =
|
||||||
(state.value ?? []).map((m) {
|
currentMessages.map((m) {
|
||||||
if (m.id == localMessage.id) {
|
if (m.id == localMessage.id) {
|
||||||
return updatedMessage;
|
return updatedMessage;
|
||||||
}
|
}
|
||||||
return m;
|
return m;
|
||||||
}).toList();
|
}).toList();
|
||||||
state = AsyncValue.data(newMessages);
|
state = AsyncValue.data(newMessages);
|
||||||
|
}
|
||||||
developer.log(
|
developer.log(
|
||||||
'Message with nonce $nonce sent successfully',
|
'Message with nonce $nonce sent successfully',
|
||||||
name: 'MessagesNotifier',
|
name: 'MessagesNotifier',
|
||||||
@@ -627,14 +636,37 @@ class MessagesNotifier extends _$MessagesNotifier {
|
|||||||
name: 'MessagesNotifier',
|
name: 'MessagesNotifier',
|
||||||
);
|
);
|
||||||
_pendingMessages.remove(messageId);
|
_pendingMessages.remove(messageId);
|
||||||
await _database.deleteMessage(messageId);
|
|
||||||
|
|
||||||
final currentMessages = state.value ?? [];
|
final currentMessages = state.value ?? [];
|
||||||
final filteredMessages =
|
final messageIndex = currentMessages.indexWhere((m) => m.id == messageId);
|
||||||
currentMessages.where((m) => m.id != messageId).toList();
|
|
||||||
|
|
||||||
if (filteredMessages.length != currentMessages.length) {
|
LocalChatMessage? messageToUpdate;
|
||||||
state = AsyncValue.data(filteredMessages);
|
if (messageIndex != -1) {
|
||||||
|
messageToUpdate = currentMessages[messageIndex];
|
||||||
|
} else {
|
||||||
|
messageToUpdate = await fetchMessageById(messageId);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (messageToUpdate == null) return;
|
||||||
|
|
||||||
|
final remote = messageToUpdate.toRemoteMessage();
|
||||||
|
final updatedRemote = remote.copyWith(
|
||||||
|
content: 'This message was deleted',
|
||||||
|
type: 'deleted',
|
||||||
|
attachments: [],
|
||||||
|
);
|
||||||
|
|
||||||
|
final deletedMessage = LocalChatMessage.fromRemoteMessage(
|
||||||
|
updatedRemote,
|
||||||
|
messageToUpdate.status,
|
||||||
|
);
|
||||||
|
|
||||||
|
await _database.saveMessage(_database.messageToCompanion(deletedMessage));
|
||||||
|
|
||||||
|
if (messageIndex != -1) {
|
||||||
|
final newList = [...currentMessages];
|
||||||
|
newList[messageIndex] = deletedMessage;
|
||||||
|
state = AsyncValue.data(newList);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1087,7 +1119,6 @@ class ChatRoomScreen extends HookConsumerWidget {
|
|||||||
skipError: true,
|
skipError: true,
|
||||||
data:
|
data:
|
||||||
(identity) => MessageItem(
|
(identity) => MessageItem(
|
||||||
key: ValueKey(message.id),
|
|
||||||
message: message,
|
message: message,
|
||||||
isCurrentUser: identity?.id == message.senderId,
|
isCurrentUser: identity?.id == message.senderId,
|
||||||
onAction: (action) {
|
onAction: (action) {
|
||||||
|
@@ -546,6 +546,26 @@ class _MessageItemContent extends StatelessWidget {
|
|||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
switch (item.type) {
|
switch (item.type) {
|
||||||
|
case 'deleted':
|
||||||
|
return Row(
|
||||||
|
mainAxisSize: MainAxisSize.min,
|
||||||
|
crossAxisAlignment: CrossAxisAlignment.center,
|
||||||
|
children: [
|
||||||
|
Icon(
|
||||||
|
Symbols.delete,
|
||||||
|
size: 14,
|
||||||
|
color: Theme.of(context).colorScheme.onSurfaceVariant.withOpacity(0.6),
|
||||||
|
),
|
||||||
|
const Gap(4),
|
||||||
|
Text(
|
||||||
|
item.content!,
|
||||||
|
style: Theme.of(context).textTheme.bodySmall?.copyWith(
|
||||||
|
color: Theme.of(context).colorScheme.onSurfaceVariant.withOpacity(0.6),
|
||||||
|
fontStyle: FontStyle.italic,
|
||||||
|
),
|
||||||
|
),
|
||||||
|
],
|
||||||
|
);
|
||||||
case 'call.start':
|
case 'call.start':
|
||||||
case 'call.ended':
|
case 'call.ended':
|
||||||
return _MessageContentCall(
|
return _MessageContentCall(
|
||||||
|
Reference in New Issue
Block a user