From 07a032bbf09d812637b50e967a6ecbda3f95fa75 Mon Sep 17 00:00:00 2001 From: Henry-Hiles Date: Tue, 11 Nov 2025 21:15:30 -0500 Subject: [PATCH] room switching working --- lib/controllers/current_room_controller.dart | 5 +++- lib/main.dart | 2 +- lib/widgets/{avatar.dart => room_avatar.dart} | 4 ++-- lib/widgets/room_chat.dart | 15 +++++++++++- lib/widgets/sidebar.dart | 23 ++++++++++++------- 5 files changed, 36 insertions(+), 13 deletions(-) rename lib/widgets/{avatar.dart => room_avatar.dart} (82%) diff --git a/lib/controllers/current_room_controller.dart b/lib/controllers/current_room_controller.dart index cb5656d..5b00257 100644 --- a/lib/controllers/current_room_controller.dart +++ b/lib/controllers/current_room_controller.dart @@ -9,7 +9,10 @@ class CurrentRoomController extends AsyncNotifier { SpacesController.provider.future, ))[0].children[0].roomData.fullRoom; - void set(FullRoom room) => state = AsyncValue.data(room); + Future set(FullRoom room) async { + await future; + state = AsyncValue.data(room); + } static final provider = AsyncNotifierProvider( diff --git a/lib/main.dart b/lib/main.dart index bbc3ba7..d4b777b 100644 --- a/lib/main.dart +++ b/lib/main.dart @@ -8,7 +8,7 @@ import "package:dynamic_system_colors/dynamic_system_colors.dart"; import "package:window_size/window_size.dart"; void main() async { - ScaledWidgetsFlutterBinding.ensureInitialized(scaleFactor: (_) => 1.4); + ScaledWidgetsFlutterBinding.ensureInitialized(scaleFactor: (_) => 1.3); await windowManager.ensureInitialized(); await windowManager.waitUntilReadyToShow( diff --git a/lib/widgets/avatar.dart b/lib/widgets/room_avatar.dart similarity index 82% rename from lib/widgets/avatar.dart rename to lib/widgets/room_avatar.dart index 2d2bf1b..a146be3 100644 --- a/lib/widgets/avatar.dart +++ b/lib/widgets/room_avatar.dart @@ -1,11 +1,11 @@ import "package:color_hash/color_hash.dart"; import "package:flutter/widgets.dart"; -class Avatar extends StatelessWidget { +class RoomAvatar extends StatelessWidget { final Widget? avatar; final String title; final Widget? fallback; - const Avatar(this.avatar, this.title, {this.fallback, super.key}); + const RoomAvatar(this.avatar, this.title, {this.fallback, super.key}); @override Widget build(BuildContext context) => ClipRRect( diff --git a/lib/widgets/room_chat.dart b/lib/widgets/room_chat.dart index 786f8d0..7bf23e2 100644 --- a/lib/widgets/room_chat.dart +++ b/lib/widgets/room_chat.dart @@ -14,6 +14,7 @@ import "package:nexus/controllers/current_room_controller.dart"; import "package:nexus/controllers/room_chat_controller.dart"; import "package:nexus/helpers/extension_helper.dart"; import "package:nexus/helpers/launch_helper.dart"; +import "package:nexus/widgets/room_avatar.dart"; class RoomChat extends HookConsumerWidget { final bool isDesktop; @@ -39,7 +40,19 @@ class RoomChat extends HookConsumerWidget { ? null : DrawerButton(onPressed: Scaffold.of(context).openDrawer), actionsPadding: EdgeInsets.symmetric(horizontal: 8), - title: Text(room.title), + title: Row( + children: [ + RoomAvatar( + room.avatar, + room.title, + fallback: Icon(Icons.numbers), + ), + SizedBox(width: 12), + Expanded( + child: Text(room.title, overflow: TextOverflow.ellipsis), + ), + ], + ), actions: [ if (!(Platform.isAndroid || Platform.isIOS)) IconButton( diff --git a/lib/widgets/sidebar.dart b/lib/widgets/sidebar.dart index ee68344..e69e173 100644 --- a/lib/widgets/sidebar.dart +++ b/lib/widgets/sidebar.dart @@ -4,7 +4,7 @@ import "package:hooks_riverpod/hooks_riverpod.dart"; import "package:nexus/controllers/current_room_controller.dart"; import "package:nexus/controllers/spaces_controller.dart"; import "package:nexus/helpers/extension_helper.dart"; -import "package:nexus/widgets/avatar.dart"; +import "package:nexus/widgets/room_avatar.dart"; class Sidebar extends HookConsumerWidget { const Sidebar({super.key}); @@ -13,6 +13,7 @@ class Sidebar extends HookConsumerWidget { Widget build(BuildContext context, WidgetRef ref) { final selectedSpace = useState(0); final selectedRoom = useState(0); + return Drawer( shape: Border(), child: Row( @@ -27,11 +28,17 @@ class Sidebar extends HookConsumerWidget { }, data: (spaces) => NavigationRail( scrollable: true, - onDestinationSelected: (value) => selectedSpace.value = value, + onDestinationSelected: (value) { + selectedSpace.value = value; + selectedRoom.value = 0; + ref + .watch(CurrentRoomController.provider.notifier) + .set(spaces[selectedSpace.value].children[0]); + }, destinations: spaces .map( (space) => NavigationRailDestination( - icon: Avatar(space.avatar, space.title), + icon: RoomAvatar(space.avatar, space.title), label: Text(space.title), padding: EdgeInsets.only(top: 4), ), @@ -51,7 +58,7 @@ class Sidebar extends HookConsumerWidget { appBar: AppBar( title: Row( children: [ - Avatar(space.avatar, space.title), + RoomAvatar(space.avatar, space.title), SizedBox(width: 12), Expanded( child: Text( @@ -67,10 +74,13 @@ class Sidebar extends HookConsumerWidget { scrollable: true, backgroundColor: Colors.transparent, extended: true, + selectedIndex: space.children.isEmpty + ? null + : selectedRoom.value, destinations: space.children .map( (room) => NavigationRailDestination( - icon: Avatar( + icon: RoomAvatar( room.avatar, room.title, fallback: selectedSpace.value == 1 @@ -87,9 +97,6 @@ class Sidebar extends HookConsumerWidget { .watch(CurrentRoomController.provider.notifier) .set(space.children[value]); }, - selectedIndex: space.children.isEmpty - ? null - : selectedRoom.value, ), ); },