diff --git a/lib/view/pages/talk/chat_view.dart b/lib/view/pages/talk/chat_view.dart index ccf3a07..ff92ecc 100644 --- a/lib/view/pages/talk/chat_view.dart +++ b/lib/view/pages/talk/chat_view.dart @@ -178,6 +178,7 @@ class _ChatViewState extends State { if (element.systemMessage.contains('reaction')) continue; if (element.systemMessage.contains('poll_voted')) continue; + if (element.systemMessage.contains('message_deleted')) continue; final commonRead = int.parse( response.headers?['x-chat-last-common-read'] ?? '0', ); @@ -209,7 +210,10 @@ class _ChatViewState extends State { context: context, isSender: element.actorId == widget.selfId && - element.messageType == GetRoomResponseObjectMessageType.comment, + (element.messageType == + GetRoomResponseObjectMessageType.comment || + element.messageType == + GetRoomResponseObjectMessageType.deletedComment), bubbleData: element, chatData: widget.room, refetch: ({bool renew = false}) => _refresh(), diff --git a/lib/view/pages/talk/data/chat_search_controller.dart b/lib/view/pages/talk/data/chat_search_controller.dart index 7d9e54b..6b9c891 100644 --- a/lib/view/pages/talk/data/chat_search_controller.dart +++ b/lib/view/pages/talk/data/chat_search_controller.dart @@ -21,6 +21,7 @@ class ChatSearchController { for (final element in response.sortByTimestamp()) { if (element.systemMessage.contains('reaction')) continue; if (element.systemMessage.contains('poll_voted')) continue; + if (element.systemMessage.contains('message_deleted')) continue; final haystackText = RichObjectStringProcessor.parseToString( element.message, diff --git a/lib/view/pages/talk/widgets/chat_bubble.dart b/lib/view/pages/talk/widgets/chat_bubble.dart index a100a20..fc184a2 100644 --- a/lib/view/pages/talk/widgets/chat_bubble.dart +++ b/lib/view/pages/talk/widgets/chat_bubble.dart @@ -148,11 +148,33 @@ class _ChatBubbleState extends State ).asDialog(context); } + bool get _rendersAsCommentBubble => + widget.bubbleData.messageType == + GetRoomResponseObjectMessageType.comment || + widget.bubbleData.messageType == + GetRoomResponseObjectMessageType.deletedComment; + + TextStyle? _messageTextStyle(BuildContext context) { + final theme = Theme.of(context); + switch (widget.bubbleData.messageType) { + case GetRoomResponseObjectMessageType.system: + return theme.textTheme.bodySmall; + case GetRoomResponseObjectMessageType.deletedComment: + return theme.textTheme.bodyMedium?.copyWith( + color: theme.hintColor, + fontStyle: FontStyle.italic, + ); + case GetRoomResponseObjectMessageType.comment: + case GetRoomResponseObjectMessageType.voiceMessage: + case GetRoomResponseObjectMessageType.command: + return null; + } + } + BubbleStyle _getStyle() { final styles = ChatBubbleStyles(context); final BubbleStyle base; - if (widget.bubbleData.messageType != - GetRoomResponseObjectMessageType.comment) { + if (!_rendersAsCommentBubble) { base = styles.getSystemStyle(); } else { base = widget.isSender @@ -210,14 +232,11 @@ class _ChatBubbleState extends State originalData: widget.bubbleData.messageParameters, ); final showActorDisplayName = - widget.bubbleData.messageType == - GetRoomResponseObjectMessageType.comment && + _rendersAsCommentBubble && widget.chatData.type != GetRoomResponseObjectConversationType.oneToOne; final showBubbleTime = widget.bubbleData.messageType != - GetRoomResponseObjectMessageType.system && - widget.bubbleData.messageType != - GetRoomResponseObjectMessageType.deletedComment; + GetRoomResponseObjectMessageType.system; final parent = widget.bubbleData.parent; final actorBaseStyle = TextStyle( @@ -294,11 +313,7 @@ class _ChatBubbleState extends State timeText: timeText, messageWidget: message.getWidget( highlightQuery: widget.highlightQuery, - style: - widget.bubbleData.messageType == - GetRoomResponseObjectMessageType.system - ? Theme.of(context).textTheme.bodySmall - : null, + style: _messageTextStyle(context), ), parent: parent, bubbleData: widget.bubbleData, diff --git a/test/view/talk/chat_search_controller_test.dart b/test/view/talk/chat_search_controller_test.dart index 47dd0a7..6d9fa37 100644 --- a/test/view/talk/chat_search_controller_test.dart +++ b/test/view/talk/chat_search_controller_test.dart @@ -105,28 +105,38 @@ void main() { ); }); - test('reaction and poll_voted system messages are filtered out', () { - final response = _response([ - _msg( - id: 1, - timestamp: 100, - message: 'Treffer', - systemMessage: 'reaction', - type: GetRoomResponseObjectMessageType.system, - ), - _msg( - id: 2, - timestamp: 200, - message: 'Treffer', - systemMessage: 'poll_voted', - type: GetRoomResponseObjectMessageType.system, - ), - _msg(id: 3, timestamp: 300, message: 'Treffer'), - ]); - final matches = ChatSearchController.findMatches(response, 'Treffer'); - expect(matches.length, 1); - expect(matches.first.messageId, 3); - }); + test( + 'reaction, poll_voted and message_deleted system messages are filtered out', + () { + final response = _response([ + _msg( + id: 1, + timestamp: 100, + message: 'Treffer', + systemMessage: 'reaction', + type: GetRoomResponseObjectMessageType.system, + ), + _msg( + id: 2, + timestamp: 200, + message: 'Treffer', + systemMessage: 'poll_voted', + type: GetRoomResponseObjectMessageType.system, + ), + _msg( + id: 4, + timestamp: 250, + message: 'Treffer', + systemMessage: 'message_deleted', + type: GetRoomResponseObjectMessageType.system, + ), + _msg(id: 3, timestamp: 300, message: 'Treffer'), + ]); + final matches = ChatSearchController.findMatches(response, 'Treffer'); + expect(matches.length, 1); + expect(matches.first.messageId, 3); + }, + ); test('rich object parameters are searchable (e.g. file names)', () { final response = _response([