Edited message diff

This commit is contained in:
2025-09-23 15:20:45 +08:00
parent 9529bbf08b
commit 84c38500d0
7 changed files with 96 additions and 14 deletions

View File

@@ -206,6 +206,18 @@ class AppDatabase extends _$AppDatabase {
createdAt: dbMessage.createdAt,
status: dbMessage.status,
nonce: dbMessage.nonce,
content: dbMessage.content,
isDeleted: dbMessage.isDeleted,
updatedAt: dbMessage.updatedAt,
deletedAt: dbMessage.deletedAt,
type: dbMessage.type,
meta: dbMessage.meta,
membersMentioned: dbMessage.membersMentioned,
editedAt: dbMessage.editedAt,
attachments: dbMessage.attachments,
reactions: dbMessage.reactions,
repliedMessageId: dbMessage.repliedMessageId,
forwardedMessageId: dbMessage.forwardedMessageId,
);
}

View File

@@ -76,8 +76,19 @@ class LocalChatMessage {
final DateTime createdAt;
MessageStatus status;
final String? nonce;
final String? content;
final bool? isDeleted;
final DateTime? updatedAt;
final DateTime? deletedAt;
final String type;
final Map<String, dynamic> meta;
final List<String> membersMentioned;
final DateTime? editedAt;
final List<Map<String, dynamic>> attachments;
final List<Map<String, dynamic>> reactions;
final String? repliedMessageId;
final String? forwardedMessageId;
List<UniversalFile>? localAttachments;
bool isRead;
LocalChatMessage({
required this.id,
@@ -87,8 +98,19 @@ class LocalChatMessage {
required this.createdAt,
required this.nonce,
required this.status,
this.content,
this.isDeleted,
this.updatedAt,
this.deletedAt,
required this.type,
required this.meta,
required this.membersMentioned,
this.editedAt,
required this.attachments,
required this.reactions,
this.repliedMessageId,
this.forwardedMessageId,
this.localAttachments,
this.isRead = false,
});
SnChatMessage toRemoteMessage() {
@@ -99,7 +121,6 @@ class LocalChatMessage {
SnChatMessage message,
MessageStatus status, {
String? nonce,
bool isRead = false,
}) {
return LocalChatMessage(
id: message.id,
@@ -109,7 +130,18 @@ class LocalChatMessage {
createdAt: message.createdAt,
status: status,
nonce: nonce ?? message.nonce,
isRead: isRead,
content: message.content,
isDeleted: false,
updatedAt: message.updatedAt,
deletedAt: null,
type: message.type,
meta: message.meta,
membersMentioned: message.membersMentioned,
editedAt: message.editedAt,
attachments: message.attachments.map((e) => e.toJson()).toList(),
reactions: message.reactions.map((e) => e.toJson()).toList(),
repliedMessageId: message.repliedMessageId,
forwardedMessageId: message.forwardedMessageId,
);
}
}

View File

@@ -904,7 +904,7 @@ class MessagesNotifier extends _$MessagesNotifier {
final remote = messageToUpdate.toRemoteMessage();
final updatedRemote = remote.copyWith(
content: 'This message was deleted',
type: 'deleted',
deletedAt: DateTime.now(),
attachments: [],
);

View File

@@ -6,7 +6,7 @@ part of 'room.dart';
// RiverpodGenerator
// **************************************************************************
String _$messagesNotifierHash() => r'ebbbc77a74b7130ca5885aaaa06478888cb50262';
String _$messagesNotifierHash() => r'196fe42438c716b2f975f5f14733974174b3dde7';
/// Copied from Dart SDK
class _SystemHash {

View File

@@ -24,6 +24,7 @@ import 'package:island/widgets/content/cloud_files.dart';
import 'package:island/widgets/content/embed/link.dart';
import 'package:island/widgets/content/markdown.dart';
import 'package:material_symbols_icons/material_symbols_icons.dart';
import 'package:pretty_diff_text/pretty_diff_text.dart';
import 'package:styled_widget/styled_widget.dart';
import 'package:super_context_menu/super_context_menu.dart';
@@ -566,18 +567,38 @@ class _MessageItemContent extends StatelessWidget {
).colorScheme.onSurfaceVariant.withOpacity(0.6),
),
const Gap(4),
Text(
item.content ?? 'Edited a message',
style: Theme.of(context).textTheme.bodySmall?.copyWith(
color: Theme.of(
if (item.meta['previous_content'] is String)
PrettyDiffText(
oldText: item.meta['previous_content'],
newText: item.content ?? 'Edited a message',
defaultTextStyle: Theme.of(
context,
).colorScheme.onSurfaceVariant.withOpacity(0.6),
fontStyle: FontStyle.italic,
).textTheme.bodySmall!.copyWith(
color: Theme.of(context).colorScheme.onSurfaceVariant,
),
addedTextStyle: TextStyle(
backgroundColor: Theme.of(
context,
).colorScheme.primaryFixedDim.withOpacity(0.4),
),
deletedTextStyle: TextStyle(
decoration: TextDecoration.lineThrough,
color: Theme.of(
context,
).colorScheme.onSurfaceVariant.withOpacity(0.7),
),
)
else
Text(
item.content ?? 'Edited a message',
style: Theme.of(context).textTheme.bodySmall?.copyWith(
color: Theme.of(
context,
).colorScheme.onSurfaceVariant.withOpacity(0.6),
),
),
),
],
);
case 'deleted': // Client side history // TODO add seprate is_deleted column to indicate it
case 'messages.delete':
return Row(
mainAxisSize: MainAxisSize.min,