make members controller an asyncnotifier

makes loading smoother and more responsive
This commit is contained in:
Henry Hiles 2026-03-22 16:46:48 -04:00
commit 237886971c
No known key found for this signature in database
4 changed files with 92 additions and 81 deletions

View file

@ -1,6 +1,7 @@
import "package:flutter/material.dart";
import "package:hooks_riverpod/hooks_riverpod.dart";
import "package:nexus/controllers/members_controller.dart";
import "package:nexus/helpers/extensions/better_when.dart";
import "package:nexus/models/room.dart";
import "package:nexus/widgets/avatar_or_hash.dart";
@ -10,15 +11,17 @@ class MemberList extends ConsumerWidget {
@override
Widget build(BuildContext context, WidgetRef ref) {
final members = ref.watch(MembersController.provider(room));
final membersProvider = ref.watch(MembersController.provider(room));
return Drawer(
shape: Border(),
child: ListView(
child: Column(
children: [
AppBar(
scrolledUnderElevation: 0,
leading: Icon(Icons.people),
title: Text("Members (${members.length})"),
title: Text(
"Members ${membersProvider.when(data: (members) => "${members.length}", error: (_, _) => "", loading: () => "")}",
),
actionsPadding: EdgeInsets.only(right: 4),
actions: [
if (Scaffold.of(context).hasEndDrawer)
@ -29,16 +32,33 @@ class MemberList extends ConsumerWidget {
),
],
),
...members.map(
(member) => ListTile(
onTap: () => showDialog(
context: context,
builder: (context) =>
Dialog(child: Text("TODO: Open member popover")),
membersProvider.betterWhen(
data: (members) => Expanded(
child: ListView(
children: members
.map(
(member) => ListTile(
onTap: () => showDialog(
context: context,
builder: (context) =>
Dialog(child: Text("TODO: Open member popover")),
),
leading: AvatarOrHash(
member.avatarUrl,
member.displayName,
),
title: Text(
member.displayName,
overflow: TextOverflow.ellipsis,
),
subtitle: Text(
member.userId,
overflow: TextOverflow.ellipsis,
),
),
)
.toList(),
),
leading: AvatarOrHash(member.avatarUrl, member.displayName),
title: Text(member.displayName, overflow: TextOverflow.ellipsis),
subtitle: Text(member.userId, overflow: TextOverflow.ellipsis),
),
),
],