From 81851bdc421cd6ab41dbd08f1694f63a4e708c21 Mon Sep 17 00:00:00 2001 From: Henry-Hiles Date: Fri, 16 Oct 2026 17:13:25 -0400 Subject: [PATCH] fix no room selected after leave / init --- lib/controllers/room_chat.dart | 1 + lib/controllers/selected_room.dart | 31 +++++++++++++++++++++++++++++ lib/controllers/selected_space.dart | 25 +++++++++++++++++++++++ lib/controllers/unified_push.dart | 7 ++----- lib/widgets/pages/chat.dart | 6 ++---- lib/widgets/room_list.dart | 22 ++++---------------- 6 files changed, 65 insertions(+), 27 deletions(-) create mode 100644 lib/controllers/selected_room.dart create mode 100644 lib/controllers/selected_space.dart diff --git a/lib/controllers/room_chat.dart b/lib/controllers/room_chat.dart index 0d0688e..c4a8dda 100644 --- a/lib/controllers/room_chat.dart +++ b/lib/controllers/room_chat.dart @@ -25,6 +25,7 @@ class RoomChatController(final ChatParams info) @override Future build() async { final client = ref.read(ClientController.provider.notifier); + final room = ref.read( RoomsController.provider.select((rooms) => rooms[info.roomId]), ); diff --git a/lib/controllers/selected_room.dart b/lib/controllers/selected_room.dart new file mode 100644 index 0000000..f59232c --- /dev/null +++ b/lib/controllers/selected_room.dart @@ -0,0 +1,31 @@ +import "package:fast_immutable_collections/fast_immutable_collections.dart"; +import "package:flutter_riverpod/flutter_riverpod.dart"; +import "package:nexus/controllers/key.dart"; +import "package:nexus/controllers/selected_space.dart"; +import "package:nexus/helpers/extensions/get_all_child_rooms.dart"; + +class SelectedRoomController extends Notifier { + @override + String? build() { + final roomId = ref.watch( + KeyController.provider(KeyController.roomKey) + .select((async) => async.value), + ); + + final roomIds = ref.watch( + SelectedSpaceController.provider.select( + (space) => space?.allChildRooms + .map((room) => room.metadata?.id) + .nonNulls + .toIList(), + ), + ); + if (roomIds == null) return roomId; + + return roomIds.contains(roomId) ? roomId : roomIds.firstOrNull; + } + + static final provider = NotifierProvider( + SelectedRoomController.new, + ); +} diff --git a/lib/controllers/selected_space.dart b/lib/controllers/selected_space.dart new file mode 100644 index 0000000..7a54060 --- /dev/null +++ b/lib/controllers/selected_space.dart @@ -0,0 +1,25 @@ +import "package:collection/collection.dart"; +import "package:flutter_riverpod/flutter_riverpod.dart"; +import "package:nexus/controllers/key.dart"; +import "package:nexus/controllers/spaces.dart"; +import "package:nexus/models/space.dart"; + +class SelectedSpaceController extends Notifier { + @override + Space? build() { + final spaces = ref.watch(SpacesController.provider).value; + if (spaces == null) return null; + + final spaceId = ref.watch( + KeyController.provider(KeyController.spaceKey) + .select((async) => async.value), + ); + + return spaces.firstWhereOrNull((space) => space.id == spaceId) ?? + spaces.firstOrNull; + } + + static final provider = NotifierProvider( + SelectedSpaceController.new, + ); +} diff --git a/lib/controllers/unified_push.dart b/lib/controllers/unified_push.dart index 638e330..8dcb295 100644 --- a/lib/controllers/unified_push.dart +++ b/lib/controllers/unified_push.dart @@ -5,7 +5,7 @@ import "dart:io"; import "package:flutter/foundation.dart"; import "package:flutter_riverpod/flutter_riverpod.dart"; import "package:intl/intl.dart"; -import "package:nexus/controllers/key.dart"; +import "package:nexus/controllers/selected_room.dart"; import "package:nexus/controllers/notification.dart"; import "package:nexus/controllers/push_key.dart"; import "package:nexus/main.dart"; @@ -90,10 +90,7 @@ class UnifiedPushController extends AsyncNotifier { if (event.unreadType?.has(.notify) != true || (!isInBackground && await windowManager.isFocused().onError((_, _) => true) && - await ref.read( - KeyController.provider(KeyController.roomKey).future, - ) == - event.roomId)) { + ref.read(SelectedRoomController.provider) == event.roomId)) { if (isInBackground) exit(0); return; } diff --git a/lib/widgets/pages/chat.dart b/lib/widgets/pages/chat.dart index 8502d02..e60ead7 100644 --- a/lib/widgets/pages/chat.dart +++ b/lib/widgets/pages/chat.dart @@ -2,7 +2,7 @@ import "package:flutter_hooks/flutter_hooks.dart"; import "package:material_ui/material_ui.dart"; import "package:hooks_riverpod/hooks_riverpod.dart"; import "package:nexus/controllers/init_complete.dart"; -import "package:nexus/controllers/key.dart"; +import "package:nexus/controllers/selected_room.dart"; import "package:nexus/controllers/notification_request.dart"; import "package:nexus/helpers/extensions/is_desktop.dart"; import "package:nexus/widgets/appbar.dart"; @@ -37,9 +37,7 @@ class const ChatPage({super.key}) extends HookConsumerWidget { builder: (context, constraints) { final isDesktop = context.isDesktop; final showMembersByDefault = constraints.maxWidth > 1000; - final roomId = ref - .watch(KeyController.provider(KeyController.roomKey)) - .requireValue; + final roomId = ref.watch(SelectedRoomController.provider); return SafeArea( child: Scaffold( diff --git a/lib/widgets/room_list.dart b/lib/widgets/room_list.dart index 9562e0f..f8d366e 100644 --- a/lib/widgets/room_list.dart +++ b/lib/widgets/room_list.dart @@ -22,9 +22,10 @@ import "package:nexus/widgets/room_summary_sheet.dart"; import "package:nexus/widgets/room_menu_button.dart"; import "package:nexus/widgets/space_hierarchy_sheet.dart"; import "package:nexus/controllers/key.dart"; +import "package:nexus/controllers/selected_room.dart"; +import "package:nexus/controllers/selected_space.dart"; import "package:nexus/controllers/rooms.dart"; import "package:nexus/controllers/spaces.dart"; -import "package:collection/collection.dart"; // Needed for navigation_rail_m3e (#65). import "package:flutter/material.dart" as old_mat; @@ -217,23 +218,8 @@ class const SpacesRail({super.key}) extends ConsumerWidget { class const RoomsPane({super.key}) extends ConsumerWidget { @override Widget build(BuildContext context, WidgetRef ref) { - final selectedSpaceId = ref.watch( - KeyController.provider(KeyController.spaceKey) - .select((async) => async.requireValue), - ); - final selectedRoomId = ref.watch( - KeyController.provider(KeyController.roomKey) - .select((async) => async.requireValue), - ); - final selectedSpace = ref.watch( - SpacesController.provider.select((async) { - final spaces = async.requireValue; - return spaces.firstWhereOrNull( - (space) => space.id == selectedSpaceId, - ) ?? - spaces.first; - }), - ); + final selectedRoomId = ref.watch(SelectedRoomController.provider); + final selectedSpace = ref.watch(SelectedSpaceController.provider)!; final isDm = selectedSpace.id == "dms"; final spaceMetadata = selectedSpace.room?.metadata;