From 2f74c5bb9053f7dad7065d2558e7b4aea066ec43 Mon Sep 17 00:00:00 2001 From: provokateurin Date: Wed, 30 Oct 2024 11:40:55 +0100 Subject: [PATCH] refactor(talk_app): Extract message action checks Signed-off-by: provokateurin --- .../packages/talk_app/lib/src/pages/room.dart | 6 +---- .../talk_app/lib/src/utils/helpers.dart | 27 +++++++++++++++++++ .../talk_app/lib/src/widgets/message.dart | 18 +++---------- .../talk_app/lib/src/widgets/reactions.dart | 6 ++--- 4 files changed, 33 insertions(+), 24 deletions(-) diff --git a/packages/neon_framework/packages/talk_app/lib/src/pages/room.dart b/packages/neon_framework/packages/talk_app/lib/src/pages/room.dart index 7852157cbc0..09f8f7094fe 100644 --- a/packages/neon_framework/packages/talk_app/lib/src/pages/room.dart +++ b/packages/neon_framework/packages/talk_app/lib/src/pages/room.dart @@ -6,7 +6,6 @@ import 'package:intl/intl.dart'; import 'package:neon_framework/blocs.dart'; import 'package:neon_framework/utils.dart'; import 'package:neon_framework/widgets.dart'; -import 'package:nextcloud/spreed.dart' as spreed; import 'package:talk_app/src/blocs/room.dart'; import 'package:talk_app/src/theme.dart'; import 'package:talk_app/src/utils/helpers.dart'; @@ -176,10 +175,7 @@ class _TalkRoomPageState extends State { ), ); - if (room.readOnly == 0 && - spreed.ParticipantPermission.values - .byBinary(room.permissions) - .contains(spreed.ParticipantPermission.canSendMessageAndShareAndReact)) { + if (canSendMessageAndShareAndReact(room)) { body = Column( mainAxisSize: MainAxisSize.min, mainAxisAlignment: MainAxisAlignment.end, diff --git a/packages/neon_framework/packages/talk_app/lib/src/utils/helpers.dart b/packages/neon_framework/packages/talk_app/lib/src/utils/helpers.dart index d227d0416e7..aafbbfbd877 100644 --- a/packages/neon_framework/packages/talk_app/lib/src/utils/helpers.dart +++ b/packages/neon_framework/packages/talk_app/lib/src/utils/helpers.dart @@ -51,3 +51,30 @@ bool hasFeature(BuildContext context, String feature) { return capabilities.features.contains(feature); } + +/// Checks whether the user is allowed to send chat messages in a [room]. +bool canSendMessageAndShareAndReact(spreed.Room room) { + return room.readOnly == 0 && + spreed.ParticipantPermission.values + .byBinary(room.permissions) + .contains(spreed.ParticipantPermission.canSendMessageAndShareAndReact); +} + +/// Checks whether the user is allowed to reply to a [chatMessage] in a [room]. +bool canReplyToMessage(spreed.Room room, spreed.$ChatMessageInterface chatMessage) { + return canSendMessageAndShareAndReact(room) && + chatMessage.messageType != spreed.MessageType.commentDeleted && + chatMessage.isReplyable; +} + +/// Checks whether the user is allowed to edit a [chatMessage] in a [room]. +bool canEditMessage(BuildContext context, spreed.Room room, spreed.$ChatMessageInterface chatMessage) { + return chatMessage.messageType != spreed.MessageType.commentDeleted && + chatMessage.actorId == room.actorId && + hasFeature(context, 'edit-messages'); +} + +/// Checks whether the user is allowed to delete a [chatMessage] in a [room]. +bool canDeleteMessage(spreed.Room room, spreed.$ChatMessageInterface chatMessage) { + return chatMessage.messageType != spreed.MessageType.commentDeleted && chatMessage.actorId == room.actorId; +} diff --git a/packages/neon_framework/packages/talk_app/lib/src/widgets/message.dart b/packages/neon_framework/packages/talk_app/lib/src/widgets/message.dart index d99d5dc2cd9..05c1da8654b 100644 --- a/packages/neon_framework/packages/talk_app/lib/src/widgets/message.dart +++ b/packages/neon_framework/packages/talk_app/lib/src/widgets/message.dart @@ -517,15 +517,8 @@ class _TalkCommentMessageState extends State { spreed.Room room, spreed.$ChatMessageInterface chatMessage, ) { - final readOnly = room.readOnly == 1; - final permissions = spreed.ParticipantPermission.values.byBinary(room.permissions); - final hasChatPermission = permissions.contains(spreed.ParticipantPermission.canSendMessageAndShareAndReact); - return [ - if (widget.chatMessage.messageType != spreed.MessageType.commentDeleted && - chatMessage.isReplyable && - !readOnly && - hasChatPermission) + if (canReplyToMessage(room, chatMessage)) ( icon: const Icon(Icons.add_reaction_outlined), child: Text(TalkLocalizations.of(context).roomMessageReaction), @@ -546,18 +539,13 @@ class _TalkCommentMessageState extends State { NeonProvider.of(context).addReaction(chatMessage, reaction); }, ), - if (widget.chatMessage.messageType != spreed.MessageType.commentDeleted && - chatMessage.isReplyable && - !readOnly && - hasChatPermission) + if (canReplyToMessage(room, chatMessage)) ( icon: const Icon(Icons.reply), child: Text(TalkLocalizations.of(context).roomMessageReply), onPressed: () => NeonProvider.of(context).setReplyChatMessage(chatMessage), ), - if (chatMessage.messageType != spreed.MessageType.commentDeleted && - chatMessage.actorId == room.actorId && - hasFeature(context, 'edit-messages')) + if (canEditMessage(context, room, chatMessage)) ( icon: const Icon(Icons.edit), child: Text(TalkLocalizations.of(context).roomMessageEdit), diff --git a/packages/neon_framework/packages/talk_app/lib/src/widgets/reactions.dart b/packages/neon_framework/packages/talk_app/lib/src/widgets/reactions.dart index 961e22ac4de..2551d4d3f50 100644 --- a/packages/neon_framework/packages/talk_app/lib/src/widgets/reactions.dart +++ b/packages/neon_framework/packages/talk_app/lib/src/widgets/reactions.dart @@ -5,6 +5,7 @@ import 'package:neon_framework/widgets.dart'; import 'package:nextcloud/spreed.dart' as spreed; import 'package:talk_app/l10n/localizations.dart'; import 'package:talk_app/src/blocs/room.dart'; +import 'package:talk_app/src/utils/helpers.dart'; import 'package:talk_app/src/widgets/reactions_overview_dialog.dart'; /// Widget for displaying the current reactions on a chat message including the ability to add and remove reactions. @@ -26,10 +27,7 @@ class TalkReactions extends StatelessWidget { Widget build(BuildContext context) { final bloc = NeonProvider.of(context); - final canUpdateReactions = room.readOnly == 0 && - spreed.ParticipantPermission.values - .byBinary(room.permissions) - .contains(spreed.ParticipantPermission.canSendMessageAndShareAndReact); + final canUpdateReactions = canSendMessageAndShareAndReact(room); const shape = RoundedRectangleBorder( borderRadius: BorderRadius.all(Radius.circular(50)),