diff --git a/lib/src/message_actions_modal.dart b/lib/src/message_actions_modal.dart index 0aa53824..9896edc4 100644 --- a/lib/src/message_actions_modal.dart +++ b/lib/src/message_actions_modal.dart @@ -24,8 +24,8 @@ class MessageActionsModal extends StatelessWidget { final bool showCopyMessage; final bool showEditMessage; final bool showResendMessage; - final bool showReply; - final bool showThreadReply; + final bool showReplyMessage; + final bool showThreadReplyMessage; final bool reverse; final ShapeBorder messageShape; final DisplayWidget showUserAvatar; @@ -40,9 +40,9 @@ class MessageActionsModal extends StatelessWidget { this.onReplyTap, this.onThreadReplyTap, this.showCopyMessage = true, - this.showReply = true, + this.showReplyMessage = true, this.showResendMessage = true, - this.showThreadReply = true, + this.showThreadReplyMessage = true, this.showUserAvatar = DisplayWidget.show, this.editMessageInputBuilder, this.messageShape, @@ -129,7 +129,7 @@ class MessageActionsModal extends StatelessWidget { showReactions: false, showUsername: false, showThreadReplyIndicator: false, - showReplyIndicator: false, + showReplyMessage: false, showUserAvatar: showUserAvatar, showTimestamp: false, translateUserAvatar: false, @@ -180,13 +180,13 @@ class MessageActionsModal extends StatelessWidget { .greyWhisper, context: context, tiles: [ - if (showReply && + if (showReplyMessage && (message.status == MessageSendingStatus.SENT || message.status == null) && message.parentId == null) _buildReplyButton(context), - if (showThreadReply && + if (showThreadReplyMessage && (message.status == MessageSendingStatus.SENT || message.status == null) && diff --git a/lib/src/message_list_view.dart b/lib/src/message_list_view.dart index 41792390..bea2ad0b 100644 --- a/lib/src/message_list_view.dart +++ b/lib/src/message_list_view.dart @@ -369,7 +369,11 @@ class _MessageListViewState extends State { final isNextUserSame = message.user.id == nextMessage.user?.id; final isThread = message.replyCount > 0; - if (timeDiff >= 1 || !isNextUserSame || isThread) { + final isDeleted = message.isDeleted; + if (timeDiff >= 1 || + !isNextUserSame || + isThread || + isDeleted) { return SizedBox(height: 8); } return SizedBox(height: 2); @@ -713,7 +717,12 @@ class _MessageListViewState extends State { return MessageWidget( showThreadReplyIndicator: false, showInChannelIndicator: false, - showReplyIndicator: false, + showReplyMessage: false, + showResendMessage: false, + showThreadReplyMessage: false, + showCopyMessage: false, + showDeleteMessage: false, + showEditMessage: false, message: message, reverse: isMyMessage, showUsername: !isMyMessage, @@ -725,8 +734,6 @@ class _MessageListViewState extends State { ), showSendingIndicator: false, onThreadTap: _onThreadTap, - showEditMessage: false, - showDeleteMessage: false, borderRadiusGeometry: BorderRadius.only( topLeft: Radius.circular(16), bottomLeft: Radius.circular(2), @@ -845,6 +852,7 @@ class _MessageListViewState extends State { }, showEditMessage: isMyMessage, showDeleteMessage: isMyMessage, + showThreadReplyMessage: !isThreadMessage, borderSide: isMyMessage ? BorderSide.none : null, onThreadTap: _onThreadTap, onReplyTap: widget.onReplyTap, @@ -870,7 +878,7 @@ class _MessageListViewState extends State { onShowMessage: widget.onShowMessage, ); - if (!isThreadMessage) { + if (!message.isDeleted && !message.isSystem && !message.isEphemeral) { child = Swipeable( onSwipeEnd: () => widget.onMessageSwiped(message), backgroundIcon: StreamSvgIcon.reply( diff --git a/lib/src/message_widget.dart b/lib/src/message_widget.dart index 5180a329..f990288a 100644 --- a/lib/src/message_widget.dart +++ b/lib/src/message_widget.dart @@ -106,9 +106,6 @@ class MessageWidget extends StatefulWidget { /// If true the widget will show the thread reply indicator final bool showThreadReplyIndicator; - /// If true the widget will show the reply indicator - final bool showReplyIndicator; - /// If true the widget will show the show in channel indicator final bool showInChannelIndicator; @@ -121,9 +118,6 @@ class MessageWidget extends StatefulWidget { /// Used in [MessageReactionsModal] and [MessageActionsModal] final bool showReactionPickerIndicator; - /// If true the widget will show the resendMessage indicator - final bool showResendMessage; - final List readList; final ShowMessageCallback onShowMessage; @@ -131,8 +125,14 @@ class MessageWidget extends StatefulWidget { /// If true show the users username next to the timestamp of the message final bool showUsername; final bool showTimestamp; - final bool showDeleteMessage; + + final bool showReplyMessage; + final bool showThreadReplyMessage; final bool showEditMessage; + final bool showCopyMessage; + final bool showDeleteMessage; + final bool showResendMessage; + final Map attachmentBuilders; /// Center user avatar with bottom of the message @@ -160,7 +160,6 @@ class MessageWidget extends StatefulWidget { this.showSendingIndicator = true, this.showThreadReplyIndicator = true, this.showInChannelIndicator = true, - this.showReplyIndicator = true, this.onReplyTap, this.onThreadTap, this.showUsername = true, @@ -168,6 +167,10 @@ class MessageWidget extends StatefulWidget { this.showReactions = true, this.showDeleteMessage = true, this.showEditMessage = true, + this.showReplyMessage = true, + this.showThreadReplyMessage = true, + this.showResendMessage = true, + this.showCopyMessage = true, this.onUserAvatarTap, this.onLinkTap, this.onMessageActions, @@ -175,7 +178,6 @@ class MessageWidget extends StatefulWidget { this.editMessageInputBuilder, this.textBuilder, Map customAttachmentBuilders, - this.showResendMessage = true, this.readList, this.padding, this.textPadding = const EdgeInsets.symmetric( @@ -243,6 +245,8 @@ class _MessageWidgetState extends State { bool get showSendingIndicator => widget.showSendingIndicator; + bool get isDeleted => widget.message.isDeleted; + bool get showUsername => widget.showUsername; bool get showTimeStamp => widget.showTimestamp; @@ -271,7 +275,9 @@ class _MessageWidgetState extends State { showThreadReplyIndicator || showUsername || showTimeStamp || - showInChannel; + showInChannel || + showSendingIndicator || + isDeleted; @override Widget build(BuildContext context) { @@ -482,12 +488,12 @@ class _MessageWidgetState extends State { Widget _buildQuotedMessage() { final isMyMessage = widget.message.user.id == StreamChat.of(context).user.id; + final onTap = widget.message?.quotedMessage?.isDeleted != true && + widget.onQuotedMessageTap != null + ? () => widget.onQuotedMessageTap(widget.message.quotedMessageId) + : null; return QuotedMessageWidget( - onTap: () { - if (widget.onQuotedMessageTap != null) { - widget.onQuotedMessageTap(widget.message.quotedMessageId); - } - }, + onTap: onTap, message: widget.message.quotedMessage, messageTheme: isMyMessage ? StreamChatTheme.of(context).otherMessageTheme @@ -497,7 +503,7 @@ class _MessageWidgetState extends State { } Widget get _bottomRow { - if (widget.message.isDeleted) { + if (isDeleted) { return Transform( transform: Matrix4.rotationY(widget.reverse ? pi : 0), alignment: Alignment.center, @@ -701,14 +707,15 @@ class _MessageWidgetState extends State { messageTheme: widget.messageTheme, messageShape: widget.shape ?? _getDefaultShape(context), reverse: widget.reverse, - showDeleteMessage: widget.showDeleteMessage, + showDeleteMessage: widget.showDeleteMessage || isDeleteFailed, message: widget.message, editMessageInputBuilder: widget.editMessageInputBuilder, onReplyTap: widget.onReplyTap, onThreadReplyTap: widget.onThreadTap, showResendMessage: widget.showResendMessage && (isSendFailed || isUpdateFailed), - showCopyMessage: !isFailedState && + showCopyMessage: widget.showCopyMessage && + !isFailedState && widget.message.text?.trim()?.isNotEmpty == true, showEditMessage: widget.showEditMessage && !isDeleteFailed && @@ -716,11 +723,12 @@ class _MessageWidgetState extends State { ?.any((element) => element.type == 'giphy') != true, showReactions: widget.showReactions, - showReply: widget.showReplyIndicator && + showReplyMessage: widget.showReplyMessage && !isFailedState && widget.onReplyTap != null, - showThreadReply: - widget.showThreadReplyIndicator && widget.onThreadTap != null, + showThreadReplyMessage: widget.showThreadReplyMessage && + !isFailedState && + widget.onThreadTap != null, ), ); }); diff --git a/test/src/message_action_modal_test.dart b/test/src/message_action_modal_test.dart index 7da2095d..3cb916d1 100644 --- a/test/src/message_action_modal_test.dart +++ b/test/src/message_action_modal_test.dart @@ -70,8 +70,8 @@ void main() { showEditMessage: false, showCopyMessage: false, showDeleteMessage: false, - showReply: false, - showThreadReply: false, + showReplyMessage: false, + showThreadReplyMessage: false, message: Message( text: 'test', user: User(