add a global toggle to hide membership events (#142)

fixes #141

Co-authored-by: seres <seres@seres.eu.org>
Reviewed-on: #142
This commit is contained in:
seres 2026-10-20 18:15:01 -04:00 • committed by Henry Hiles
commit 800fb5566d
3 changed files with 28 additions and 0 deletions

View file

@ -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),
),
),
]),
),
]),

View file

@ -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<String, Object?> toJson() => _$SettingsToJson(this);

View file

@ -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 &&