Add filtering by ban type to member list

This commit is contained in:
Henry Hiles 2026-04-04 13:33:24 -04:00
commit 20f0ce9fa5
Signed by: Henry-Hiles
SSH key fingerprint: SHA256:VKQUdS31Q90KvX7EkKMHMBpUspcmItAh86a+v7PGiIs
3 changed files with 46 additions and 11 deletions

View file

@ -12,10 +12,6 @@ extension SchemeToTheme on ColorScheme {
backgroundColor: WidgetStatePropertyAll(primaryContainer),
),
),
chipTheme: ChipThemeData(
labelStyle: TextStyle(color: onPrimary),
color: WidgetStatePropertyAll(primary),
),
textTheme: ThemeData(
fontFamilyFallback: ["sans", "emoji"],
brightness: brightness,

View file

@ -1,4 +1,5 @@
import "package:flutter/material.dart";
import "package:flutter_hooks/flutter_hooks.dart";
import "package:hooks_riverpod/hooks_riverpod.dart";
import "package:nexus/controllers/members_by_type_controller.dart";
import "package:nexus/helpers/extensions/better_when.dart";
@ -6,24 +7,25 @@ import "package:nexus/helpers/extensions/show_user_popover.dart";
import "package:nexus/models/membership_status.dart";
import "package:nexus/widgets/avatar_or_hash.dart";
class MemberList extends ConsumerWidget {
class MemberList extends HookConsumerWidget {
const MemberList({super.key});
@override
Widget build(BuildContext context, WidgetRef ref) {
final status = useState(MembershipStatus.join);
final membersProvider = ref.watch(
MembersByTypeController.provider(MembershipStatus.join),
MembersByTypeController.provider(status.value),
);
return Drawer(
shape: Border(),
child: Column(
spacing: 8,
children: [
AppBar(
scrolledUnderElevation: 0,
leading: Icon(Icons.people),
title: Text(
"Members ${membersProvider.when(data: (members) => "${members.length}", error: (_, _) => "", loading: () => "")}",
),
title: Text("Members"),
actionsPadding: EdgeInsets.only(right: 4),
actions: [
if (Scaffold.of(context).hasEndDrawer)
@ -34,6 +36,27 @@ class MemberList extends ConsumerWidget {
),
],
),
Row(
mainAxisAlignment: MainAxisAlignment.center,
spacing: 8,
children: [
FilterChip(
label: Text("Joined"),
onSelected: (value) => status.value = MembershipStatus.join,
selected: status.value == MembershipStatus.join,
),
FilterChip(
label: Text("Invited"),
onSelected: (value) => status.value = MembershipStatus.invite,
selected: status.value == MembershipStatus.invite,
),
FilterChip(
label: Text("Banned"),
onSelected: (value) => status.value = MembershipStatus.ban,
selected: status.value == MembershipStatus.ban,
),
],
),
membersProvider.betterWhen(
data: (members) => Expanded(
child: ListView(

View file

@ -116,9 +116,25 @@ class UserPopover extends ConsumerWidget {
for (final pronoun in profile.pronouns.where(
(pronoun) => pronoun.language == "en",
))
Chip(label: Text(pronoun.summary)),
Chip(
label: Text(pronoun.summary),
labelStyle: TextStyle(
color: theme.colorScheme.onPrimary,
),
color: WidgetStatePropertyAll(
theme.colorScheme.primary,
),
),
if (profile.timezone != null)
Chip(label: Text(profile.timezone!)),
Chip(
label: Text(profile.timezone!),
labelStyle: TextStyle(
color: theme.colorScheme.onPrimary,
),
color: WidgetStatePropertyAll(
theme.colorScheme.primary,
),
),
],
),
),