From 0ee2e992882ee13c1205df1117c524cf87ba1074 Mon Sep 17 00:00:00 2001 From: seres Date: Tue, 20 Oct 2026 23:18:31 +0200 Subject: [PATCH 1/2] add a global toggle to hide membership events --- lib/controllers/settings_sections.dart | 15 +++++++++++++++ lib/models/settings.dart | 1 + lib/widgets/renderers/event.dart | 12 ++++++++++++ 3 files changed, 28 insertions(+) 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..f34448f 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 ? true : false, + )); + + if (event.type == "m.room.member" && hideMembershipEvents) { + return SizedBox.shrink(); + } + final isGrouped = previousEvent?.content is MessageContent && previousEvent?.redactedBy == null && -- 2.56.0 From 7e85c1078bf0fc02901c8545caaa97917b2c75fd Mon Sep 17 00:00:00 2001 From: seres Date: Tue, 20 Oct 2026 23:44:02 +0200 Subject: [PATCH 2/2] use typed check instead of comparing a string for event type --- lib/widgets/renderers/event.dart | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/lib/widgets/renderers/event.dart b/lib/widgets/renderers/event.dart index f34448f..d70f731 100644 --- a/lib/widgets/renderers/event.dart +++ b/lib/widgets/renderers/event.dart @@ -83,10 +83,10 @@ class const EventRenderer( .watch(SettingsController.provider) .maybeWhen( orElse: () => false, - data: (settings) => settings.hideMembershipEvents ? true : false, + data: (settings) => settings.hideMembershipEvents, )); - if (event.type == "m.room.member" && hideMembershipEvents) { + if (event.content is MembershipContent && hideMembershipEvents) { return SizedBox.shrink(); } -- 2.56.0