fix(llc, ui): fix removing message not removing quoted reference.

Signed-off-by: xsahil03x <[email protected]>
This commit is contained in:
Sahil Kumar
2023-05-09 17:01:02 +05:30
committed by xsahil03x
parent 822dc52417
commit 5c49def7bd
3 changed files with 90 additions and 43 deletions
@@ -746,6 +746,7 @@ class Channel {
state!.deleteMessage( state!.deleteMessage(
message.copyWith( message.copyWith(
type: 'deleted', type: 'deleted',
deletedAt: message.deletedAt ?? DateTime.now(),
status: MessageSendingStatus.sent, status: MessageSendingStatus.sent,
), ),
hardDelete: hardDelete, hardDelete: hardDelete,
@@ -1928,11 +1929,9 @@ class ChannelClientState {
void _listenMessageDeleted() { void _listenMessageDeleted() {
_subscriptions.add(_channel.on(EventType.messageDeleted).listen((event) { _subscriptions.add(_channel.on(EventType.messageDeleted).listen((event) {
final message = event.message!; final message = event.message!;
if (event.hardDelete == true) { final hardDelete = event.hardDelete ?? false;
removeMessage(message);
} else { deleteMessage(message, hardDelete: hardDelete);
updateMessage(message);
}
})); }));
} }
@@ -1957,18 +1956,35 @@ class ChannelClientState {
/// Updates the [message] in the state if it exists. Adds it otherwise. /// Updates the [message] in the state if it exists. Adds it otherwise.
void updateMessage(Message message) { void updateMessage(Message message) {
// Regular messages, which are shown in channel.
if (message.parentId == null || message.showInChannel == true) { if (message.parentId == null || message.showInChannel == true) {
final newMessages = [...messages]; var newMessages = [...messages];
final oldIndex = newMessages.indexWhere((m) => m.id == message.id); final oldIndex = newMessages.indexWhere((m) => m.id == message.id);
if (oldIndex != -1) { if (oldIndex != -1) {
Message? m; var updatedMessage = message;
// Add quoted message to the message if it is not present.
if (message.quotedMessageId != null && message.quotedMessage == null) { if (message.quotedMessageId != null && message.quotedMessage == null) {
final oldMessage = newMessages[oldIndex]; final oldMessage = newMessages[oldIndex];
m = message.copyWith( updatedMessage = updatedMessage.copyWith(
quotedMessage: oldMessage.quotedMessage, quotedMessage: oldMessage.quotedMessage,
); );
} }
newMessages[oldIndex] = m ?? message; newMessages[oldIndex] = updatedMessage;
// Update quoted message reference for every message if available.
newMessages = [...newMessages].map((it) {
// Early return if the message doesn't have a quoted message.
if (it.quotedMessageId != message.id) return it;
// Setting it to null will remove the quoted message from the message
// So, we are setting the same message but with the deleted state.
return it.copyWith(
quotedMessage: updatedMessage.copyWith(
type: 'deleted',
deletedAt: updatedMessage.deletedAt ?? DateTime.now(),
),
);
}).toList();
} else { } else {
newMessages.add(message); newMessages.add(message);
} }
@@ -1997,6 +2013,7 @@ class ChannelClientState {
); );
} }
// Thread messages, which are shown in thread page.
if (message.parentId != null) { if (message.parentId != null) {
updateThreadInfo(message.parentId!, [message]); updateThreadInfo(message.parentId!, [message]);
} }
@@ -2026,9 +2043,22 @@ class ChannelClientState {
} }
// Remove regular message, thread message shown in channel // Remove regular message, thread message shown in channel
final allMessages = [...messages]; var updatedMessages = [...messages]..removeWhere((e) => e.id == message.id);
// Remove quoted message reference from every message if available.
updatedMessages = [...updatedMessages].map((it) {
// Early return if the message doesn't have a quoted message.
if (it.quotedMessageId != message.id) return it;
// Setting it to null will remove the quoted message from the message.
return it.copyWith(
quotedMessage: null,
quotedMessageId: null,
);
}).toList();
_channelState = _channelState.copyWith( _channelState = _channelState.copyWith(
messages: allMessages..removeWhere((e) => e.id == message.id), messages: updatedMessages,
); );
} }
@@ -134,6 +134,8 @@ class _QuotedMessage extends StatelessWidget {
bool get _isGiphy => bool get _isGiphy =>
message.attachments.any((element) => element.type == 'giphy'); message.attachments.any((element) => element.type == 'giphy');
bool get _isDeleted => message.isDeleted || message.deletedAt != null;
@override @override
Widget build(BuildContext context) { Widget build(BuildContext context) {
final isOnlyEmoji = message.text!.isOnlyEmoji; final isOnlyEmoji = message.text!.isOnlyEmoji;
@@ -144,39 +146,54 @@ class _QuotedMessage extends StatelessWidget {
msg = msg.copyWith(text: '${msg.text!.substring(0, textLimit - 3)}...'); msg = msg.copyWith(text: '${msg.text!.substring(0, textLimit - 3)}...');
} }
final children = [ List<Widget> children;
if (composing) if (_isDeleted) {
PlatformWidgetBuilder( // Show deleted message text
web: (context, child) => child, children = [
desktop: (context, child) => child, Text(
child: ClearInputItemButton( context.translations.messageDeletedLabel,
onTap: onQuotedMessageClear, style: messageTheme.messageTextStyle?.copyWith(
fontStyle: FontStyle.italic,
color: messageTheme.createdAtStyle?.color,
), ),
), ),
if (_hasAttachments) ];
_ParseAttachments( } else {
message: message, // Show quoted message
messageTheme: messageTheme, children = [
attachmentThumbnailBuilders: attachmentThumbnailBuilders, if (composing)
), PlatformWidgetBuilder(
if (msg.text!.isNotEmpty && !_isGiphy) web: (context, child) => child,
Flexible( desktop: (context, child) => child,
child: StreamMessageText( child: ClearInputItemButton(
message: msg, onTap: onQuotedMessageClear,
messageTheme: isOnlyEmoji && _containsText ),
? messageTheme.copyWith(
messageTextStyle: messageTheme.messageTextStyle?.copyWith(
fontSize: 32,
),
)
: messageTheme.copyWith(
messageTextStyle: messageTheme.messageTextStyle?.copyWith(
fontSize: 12,
),
),
), ),
), if (_hasAttachments)
].insertBetween(const SizedBox(width: 8)); _ParseAttachments(
message: message,
messageTheme: messageTheme,
attachmentThumbnailBuilders: attachmentThumbnailBuilders,
),
if (msg.text!.isNotEmpty && !_isGiphy)
Flexible(
child: StreamMessageText(
message: msg,
messageTheme: isOnlyEmoji && _containsText
? messageTheme.copyWith(
messageTextStyle: messageTheme.messageTextStyle?.copyWith(
fontSize: 32,
),
)
: messageTheme.copyWith(
messageTextStyle: messageTheme.messageTextStyle?.copyWith(
fontSize: 12,
),
),
),
),
].insertBetween(const SizedBox(width: 8));
}
return Container( return Container(
decoration: BoxDecoration( decoration: BoxDecoration(
@@ -204,7 +221,7 @@ class _QuotedMessage extends StatelessWidget {
} }
Color? _getBackgroundColor(BuildContext context) { Color? _getBackgroundColor(BuildContext context) {
if (_containsLinkAttachment) { if (_containsLinkAttachment && !_isDeleted) {
return messageTheme.urlAttachmentBackgroundColor; return messageTheme.urlAttachmentBackgroundColor;
} }
return messageTheme.messageBackgroundColor; return messageTheme.messageBackgroundColor;
@@ -151,7 +151,7 @@ class BottomRow extends StatelessWidget {
context, context,
message, message,
) ?? ) ??
const Offstage(); const StreamVisibleFootnote();
} }
final children = <WidgetSpan>[]; final children = <WidgetSpan>[];