don't pass room around, use many watches

This commit is contained in:
Henry Hiles 2026-03-29 14:14:11 -04:00
commit 60be7aaf72
Signed by: Henry-Hiles
SSH key fingerprint: SHA256:VKQUdS31Q90KvX7EkKMHMBpUspcmItAh86a+v7PGiIs
15 changed files with 207 additions and 231 deletions

View file

@ -1,18 +1,17 @@
import "package:fast_immutable_collections/fast_immutable_collections.dart";
import "package:flutter/material.dart";
import "package:nexus/models/room.dart";
import "package:hooks_riverpod/hooks_riverpod.dart";
import "package:nexus/controllers/selected_room_controller.dart";
import "package:nexus/widgets/appbar.dart";
import "package:nexus/widgets/avatar_or_hash.dart";
import "package:nexus/widgets/chat_page/expandable_image.dart";
import "package:nexus/widgets/chat_page/room_menu.dart";
class RoomAppbar extends StatelessWidget implements PreferredSizeWidget {
class RoomAppbar extends ConsumerWidget implements PreferredSizeWidget {
final bool isDesktop;
final Room room;
final void Function(BuildContext context) onOpenMemberList;
final void Function(BuildContext context) onOpenDrawer;
const RoomAppbar(
this.room, {
const RoomAppbar({
required this.isDesktop,
required this.onOpenMemberList,
required this.onOpenDrawer,
@ -23,50 +22,53 @@ class RoomAppbar extends StatelessWidget implements PreferredSizeWidget {
Size get preferredSize => AppBar().preferredSize;
@override
Widget build(BuildContext context) => Appbar(
leading: isDesktop
? ExpandableImage(
room.metadata?.avatar?.toString(),
child: AvatarOrHash(
room.metadata?.avatar,
room.metadata?.name ?? "Unnamed Rooms",
height: 24,
fallback: Icon(Icons.numbers),
),
)
: DrawerButton(onPressed: () => onOpenDrawer(context)),
scrolledUnderElevation: 0,
title: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
room.metadata?.name ?? "Unnamed Room",
overflow: TextOverflow.ellipsis,
maxLines: 1,
),
if (room.metadata?.topic?.isNotEmpty == true)
Widget build(BuildContext context, WidgetRef ref) {
final room = ref.watch(SelectedRoomController.provider)!;
return Appbar(
leading: isDesktop
? ExpandableImage(
room.metadata?.avatar?.toString(),
child: AvatarOrHash(
room.metadata?.avatar,
room.metadata?.name ?? "Unnamed Rooms",
height: 24,
fallback: Icon(Icons.numbers),
),
)
: DrawerButton(onPressed: () => onOpenDrawer(context)),
scrolledUnderElevation: 0,
title: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
room.metadata!.topic!,
maxLines: 1,
room.metadata?.name ?? "Unnamed Room",
overflow: TextOverflow.ellipsis,
style: Theme.of(context).textTheme.labelMedium?.copyWith(
color: Theme.of(context).colorScheme.onSurfaceVariant,
),
maxLines: 1,
),
],
),
actions: [
IconButton(
onPressed: null,
icon: Icon(Icons.push_pin),
tooltip: "Open pinned messages",
if (room.metadata?.topic?.isNotEmpty == true)
Text(
room.metadata!.topic!,
maxLines: 1,
overflow: TextOverflow.ellipsis,
style: Theme.of(context).textTheme.labelMedium?.copyWith(
color: Theme.of(context).colorScheme.onSurfaceVariant,
),
),
],
),
IconButton(
onPressed: () => onOpenMemberList(context),
tooltip: "Open member list",
icon: Icon(Icons.people),
),
RoomMenu(room),
].toIList(),
);
actions: [
IconButton(
onPressed: null,
icon: Icon(Icons.push_pin),
tooltip: "Open pinned messages",
),
IconButton(
onPressed: () => onOpenMemberList(context),
tooltip: "Open member list",
icon: Icon(Icons.people),
),
RoomMenu(room),
].toIList(),
);
}
}