diff --git a/lib/controllers/settings_sections.dart b/lib/controllers/settings_sections.dart index 1ca07a8..c0bd193 100644 --- a/lib/controllers/settings_sections.dart +++ b/lib/controllers/settings_sections.dart @@ -166,6 +166,21 @@ class SettingsSectionsController : null, ), ), + .new( + title: "Hide Membership Events", + description: "Hides membership events (invites, joins, leaves, bans & knocks) from appearing in conversations.", + icon: Icons.person_off, + builder: (title, description, icon) => SwitchListTile( + title: Text(title), + subtitle: Text(description), + secondary: Icon(icon), + value: settings.hideMembershipEvents, + onChanged: (value) => ref + .read(SettingsController.provider.notifier) + .set(settings.copyWith(hideMembershipEvents: value)) + .onError(showError), + ), + ), ]), ), ]), diff --git a/lib/models/settings.dart b/lib/models/settings.dart index f9198ed..f6cc1c5 100644 --- a/lib/models/settings.dart +++ b/lib/models/settings.dart @@ -14,6 +14,7 @@ class const Settings({ final bool showAllInHome = false, final bool showMinimizeButton = false, final bool swipeToReply = false, + final bool hideMembershipEvents = false, final RoomOrder roomOrder = .unreadFirst, }) with _$Settings { Map toJson() => _$SettingsToJson(this); diff --git a/lib/widgets/renderers/event.dart b/lib/widgets/renderers/event.dart index 3ec3d4a..d70f731 100644 --- a/lib/widgets/renderers/event.dart +++ b/lib/widgets/renderers/event.dart @@ -6,6 +6,7 @@ import "package:hooks_riverpod/hooks_riverpod.dart"; import "package:nexus/controllers/event.dart"; import "package:nexus/controllers/room_chat.dart"; import "package:nexus/controllers/rooms.dart"; +import "package:nexus/controllers/settings.dart"; import "package:nexus/helpers/extensions/show_adaptive_menu.dart"; import "package:nexus/helpers/hooks/chat_scroll.dart"; import "package:nexus/models/content/avatar.dart"; @@ -78,6 +79,17 @@ class const EventRenderer( if (event == null) return SizedBox.shrink(); + final hideMembershipEvents = (ref + .watch(SettingsController.provider) + .maybeWhen( + orElse: () => false, + data: (settings) => settings.hideMembershipEvents, + )); + + if (event.content is MembershipContent && hideMembershipEvents) { + return SizedBox.shrink(); + } + final isGrouped = previousEvent?.content is MessageContent && previousEvent?.redactedBy == null &&