From 2520bda5a71520d45c33c607d6ef3e04a4e4321d Mon Sep 17 00:00:00 2001 From: Henry-Hiles Date: Wed, 11 Nov 2026 14:48:48 -0500 Subject: [PATCH] add dialog when first seeing banned user list Fixes #113 --- lib/controllers/banned_warning_dismissed.dart | 20 ++++++++++++++++ .../room_chat/banned_warning_dialog.dart | 21 ++++++++++++++++ lib/widgets/room_chat/member_list.dart | 24 +++++++++++++++++-- 3 files changed, 63 insertions(+), 2 deletions(-) create mode 100644 lib/controllers/banned_warning_dismissed.dart create mode 100644 lib/widgets/room_chat/banned_warning_dialog.dart diff --git a/lib/controllers/banned_warning_dismissed.dart b/lib/controllers/banned_warning_dismissed.dart new file mode 100644 index 0000000..b080d38 --- /dev/null +++ b/lib/controllers/banned_warning_dismissed.dart @@ -0,0 +1,20 @@ +import "package:flutter_riverpod/flutter_riverpod.dart"; +import "package:nexus/controllers/shared_prefs.dart"; + +class BannedWarningDismissedController extends AsyncNotifier { + static const String key = "bannedWarningDismissed"; + + @override + Future build() async => + await ref.watch(SharedPrefsController.provider).getBool(key) ?? false; + + Future set(bool value) async { + state = .data(value); + await ref.read(SharedPrefsController.provider).setBool(key, value); + } + + static final provider = + AsyncNotifierProvider( + BannedWarningDismissedController.new, + ); +} diff --git a/lib/widgets/room_chat/banned_warning_dialog.dart b/lib/widgets/room_chat/banned_warning_dialog.dart new file mode 100644 index 0000000..5beeaae --- /dev/null +++ b/lib/widgets/room_chat/banned_warning_dialog.dart @@ -0,0 +1,21 @@ +import "package:material_ui/material_ui.dart"; + +class const BannedWarningDialog({super.key}) extends StatelessWidget { + @override + Widget build(BuildContext context) => AlertDialog( + title: Text("View Banned Members?"), + content: Text( + "Banned members may have offensive or abusive display names and avatars.", + ), + actions: [ + TextButton( + onPressed: () => Navigator.of(context).pop(false), + child: Text("Cancel"), + ), + TextButton( + onPressed: () => Navigator.of(context).pop(true), + child: Text("Continue and don't show again"), + ), + ], + ); +} diff --git a/lib/widgets/room_chat/member_list.dart b/lib/widgets/room_chat/member_list.dart index bf86b9c..a967075 100644 --- a/lib/widgets/room_chat/member_list.dart +++ b/lib/widgets/room_chat/member_list.dart @@ -4,6 +4,7 @@ import "package:flutter_hooks/flutter_hooks.dart"; import "package:hooks_riverpod/hooks_riverpod.dart"; import "package:m3e_buttons/m3e_buttons.dart"; import "package:m3e_card_list/m3e_card_list.dart"; +import "package:nexus/controllers/banned_warning_dismissed.dart"; import "package:nexus/controllers/members_by_status.dart"; import "package:nexus/controllers/members_grouped.dart"; import "package:nexus/helpers/extensions/get_localpart.dart"; @@ -13,6 +14,7 @@ import "package:nexus/models/content/membership.dart"; import "package:nexus/models/membership_status.dart"; import "package:nexus/widgets/avatars/avatar_or_hash.dart"; import "package:nexus/widgets/common/divider_text.dart"; +import "package:nexus/widgets/room_chat/banned_warning_dialog.dart"; import "package:nexus/widgets/common/error_dialog.dart"; import "package:nexus/widgets/common/loading.dart"; @@ -40,8 +42,26 @@ class const MemberList(final String roomId, {super.key}) padding: .all(8), child: M3EToggleButtonGroup( selectedIndex: statusIndex.value, - onSelectedIndexChanged: (index) => - statusIndex.value = index ?? statusIndex.value, + onSelectedIndexChanged: (index) async { + if (index == null) return; + if (options.values.toIList()[index] == .ban && + !await ref.read( + BannedWarningDismissedController.provider.future, + )) { + if (!context.mounted) return; + final confirmed = await showDialog( + context: context, + builder: (_) => BannedWarningDialog(), + ); + if (confirmed != true) return; + await ref + .read( + BannedWarningDismissedController.provider.notifier, + ) + .set(true); + } + statusIndex.value = index; + }, actions: options .mapTo( (name, value) => M3EToggleButtonGroupAction(