From d0ff5a0616b10b18e2d8db96f9a679347c405b55 Mon Sep 17 00:00:00 2001 From: Henry-Hiles Date: Wed, 14 Jan 2026 16:32:35 -0500 Subject: [PATCH] Extract join room with snackbars and fix refreshing --- .../extensions/join_room_with_snackbars.dart | 87 +++++++++++++++ lib/widgets/chat_page/sidebar.dart | 104 +----------------- 2 files changed, 93 insertions(+), 98 deletions(-) create mode 100644 lib/helpers/extensions/join_room_with_snackbars.dart diff --git a/lib/helpers/extensions/join_room_with_snackbars.dart b/lib/helpers/extensions/join_room_with_snackbars.dart new file mode 100644 index 0000000..0c7b1b3 --- /dev/null +++ b/lib/helpers/extensions/join_room_with_snackbars.dart @@ -0,0 +1,87 @@ +import "package:collection/collection.dart"; +import "package:flutter/material.dart"; +import "package:hooks_riverpod/hooks_riverpod.dart"; +import "package:matrix/matrix.dart"; +import "package:nexus/controllers/key_controller.dart"; +import "package:nexus/controllers/spaces_controller.dart"; + +extension JoinRoomWithSnackbars on Client { + Future joinRoomWithSnackBars( + BuildContext context, + String roomAlias, + WidgetRef ref, + ) async { + final parsed = roomAlias.parseIdentifierIntoParts(); + final alias = parsed?.primaryIdentifier ?? roomAlias; + + final scaffoldMessenger = ScaffoldMessenger.of(context); + + final snackbar = scaffoldMessenger.showSnackBar( + SnackBar( + content: Text("Joining room $alias."), + duration: Duration(days: 999), + ), + ); + + try { + final id = await joinRoom(alias, via: parsed?.via.toList()); + + snackbar.close(); + + scaffoldMessenger.showSnackBar( + SnackBar( + content: Text("Room $alias successfully joined."), + action: SnackBarAction( + label: "Open", + onPressed: () async { + final spaces = await ref.refresh( + SpacesController.provider.future, + ); + final space = spaces.firstWhereOrNull((space) => space.id == id); + + await ref + .watch( + KeyController.provider(KeyController.spaceKey).notifier, + ) + .set( + space?.id ?? + spaces + .firstWhere( + (space) => + space.children.firstWhereOrNull( + (child) => child.roomData.id == id, + ) != + null, + ) + .id, + ); + + if (space == null) { + await ref + .watch( + KeyController.provider(KeyController.roomKey).notifier, + ) + .set(id); + } + }, + ), + ), + ); + } catch (error) { + snackbar.close(); + if (context.mounted) { + scaffoldMessenger.showSnackBar( + SnackBar( + backgroundColor: Theme.of(context).colorScheme.errorContainer, + content: Text( + error.toString(), + style: TextStyle( + color: Theme.of(context).colorScheme.onErrorContainer, + ), + ), + ), + ); + } + } + } +} diff --git a/lib/widgets/chat_page/sidebar.dart b/lib/widgets/chat_page/sidebar.dart index c3d76b5..a5e1425 100644 --- a/lib/widgets/chat_page/sidebar.dart +++ b/lib/widgets/chat_page/sidebar.dart @@ -2,13 +2,13 @@ import "package:collection/collection.dart"; import "package:flutter/material.dart"; import "package:flutter_hooks/flutter_hooks.dart"; import "package:hooks_riverpod/hooks_riverpod.dart"; -import "package:matrix/matrix.dart"; import "package:nexus/controllers/client_controller.dart"; import "package:nexus/controllers/key_controller.dart"; import "package:nexus/controllers/selected_space_controller.dart"; import "package:nexus/controllers/spaces_controller.dart"; import "package:nexus/helpers/extensions/better_when.dart"; import "package:nexus/helpers/extensions/get_headers.dart"; +import "package:nexus/helpers/extensions/join_room_with_snackbars.dart"; import "package:nexus/pages/settings_page.dart"; import "package:nexus/widgets/avatar_or_hash.dart"; import "package:nexus/widgets/chat_page/room_menu.dart"; @@ -124,111 +124,19 @@ class Sidebar extends HookConsumerWidget { ), TextButton( onPressed: () async { - final parsed = roomAlias.text - .parseIdentifierIntoParts(); - final alias = - parsed?.primaryIdentifier ?? - roomAlias.text; - Navigator.of(alertContext).pop(); - final scaffoldMessenger = - ScaffoldMessenger.of(context); - - final snackbar = scaffoldMessenger - .showSnackBar( - SnackBar( - content: Text( - "Joining room...", - ), - duration: Duration( - days: 999, - ), - ), - ); - final client = await ref.watch( ClientController .provider .future, ); - - try { - final id = await client - .joinRoom( - alias, - via: parsed?.via.toList(), - ); - - snackbar.close(); - - scaffoldMessenger.showSnackBar( - SnackBar( - content: Text( - "Room successfully joined.", - ), - action: SnackBarAction( - label: "Open", - onPressed: () async { - final spaces = await ref - .watch( - SpacesController - .provider - .future, - ); - - final space = spaces - .firstWhereOrNull( - (space) => - space.id == - id, - ); - - await selectedSpaceNotifier.set( - space?.id ?? - spaces - .firstWhere( - (space) => - space.children.firstWhereOrNull( - ( - child, - ) => - child.roomData.id == - id, - ) != - null, - ) - .id, - ); - - if (space == null) { - await selectedRoomNotifier - .set(id); - } - }, - ), - ), + if (context.mounted) { + client.joinRoomWithSnackBars( + context, + roomAlias.text, + ref, ); - } catch (error) { - snackbar.close(); - if (context.mounted) { - scaffoldMessenger.showSnackBar( - SnackBar( - backgroundColor: - Theme.of(context) - .colorScheme - .errorContainer, - content: Text( - error.toString(), - style: TextStyle( - color: Theme.of(context) - .colorScheme - .onErrorContainer, - ), - ), - ), - ); - } } }, child: Text("Join"),