From d792e9fc86897a5cd018c7a0c44faa2902205304 Mon Sep 17 00:00:00 2001 From: ggurdin <46800240+ggurdin@users.noreply.github.com> Date: Fri, 9 May 2025 12:10:24 -0400 Subject: [PATCH] chore: set active space via route instead of stream (#2744) --- lib/config/routes.dart | 45 ++++++++++++-- lib/pages/chat/chat.dart | 19 +++--- lib/pages/chat_list/chat_list.dart | 60 +++++++++---------- lib/pages/new_group/new_group.dart | 3 +- .../pages/pangea_chat_details.dart | 3 +- .../spaces/controllers/space_controller.dart | 17 ++---- lib/pangea/spaces/utils/join_with_alias.dart | 10 ++-- lib/pangea/spaces/utils/join_with_link.dart | 16 ++--- .../adaptive_dialogs/public_room_dialog.dart | 20 ++++++- 9 files changed, 114 insertions(+), 79 deletions(-) diff --git a/lib/config/routes.dart b/lib/config/routes.dart index eb50ed534..7363cce27 100644 --- a/lib/config/routes.dart +++ b/lib/config/routes.dart @@ -38,6 +38,7 @@ import 'package:fluffychat/pangea/learning_settings/pages/settings_learning.dart import 'package:fluffychat/pangea/login/pages/login_or_signup_view.dart'; import 'package:fluffychat/pangea/login/pages/signup.dart'; import 'package:fluffychat/pangea/login/pages/user_settings.dart'; +import 'package:fluffychat/pangea/spaces/constants/space_constants.dart'; import 'package:fluffychat/pangea/spaces/utils/join_with_alias.dart'; import 'package:fluffychat/pangea/spaces/utils/join_with_link.dart'; import 'package:fluffychat/pangea/subscription/pages/settings_subscription.dart'; @@ -145,17 +146,23 @@ abstract class AppRoutes { pageBuilder: (context, state) => defaultPageBuilder( context, state, - const JoinClassWithLink(), + JoinClassWithLink( + classCode: state.uri.queryParameters[SpaceConstants.classCode], + ), ), ), GoRoute( path: '/join_with_alias', pageBuilder: (context, state) => Matrix.of(context).client.isLogged() - ? chatListShellRouteBuilder(context, state, const JoinWithAlias()) + ? chatListShellRouteBuilder( + context, + state, + JoinWithAlias(alias: state.uri.queryParameters['alias']), + ) : defaultPageBuilder( context, state, - const JoinWithAlias(), + JoinWithAlias(alias: state.uri.queryParameters['alias']), ), ), GoRoute( @@ -206,6 +213,10 @@ abstract class AppRoutes { ? TwoColumnLayout( mainView: ChatList( activeChat: state.pathParameters['roomid'], + // #Pangea + activeSpaceId: state.uri.queryParameters['spaceId'], + activeFilter: state.uri.queryParameters['filter'], + // Pangea# displayNavigationRail: state.path?.startsWith('/rooms/settings') != true, ), @@ -224,7 +235,25 @@ abstract class AppRoutes { routes: [ GoRoute( path: '/rooms', - redirect: loggedOutRedirect, + // #Pangea + // redirect: loggedOutRedirect, + redirect: (context, state) async { + final resp = await loggedOutRedirect(context, state); + final spaceId = state.uri.queryParameters['spaceId']; + + if (resp != null || + !state.uri.queryParameters.containsKey('spaceId') || + spaceId == 'clear' || + !FluffyThemes.isColumnMode(context) || + (state.fullPath?.contains('details') ?? true)) { + return resp; + } + + return !FluffyThemes.isColumnMode(context) + ? resp + : '/rooms/$spaceId/details?spaceId=${spaceId ?? 'clear'}'; + }, + // Pangea# pageBuilder: (context, state) => defaultPageBuilder( context, state, @@ -235,6 +264,10 @@ abstract class AppRoutes { // Pangea# : ChatList( activeChat: state.pathParameters['roomid'], + // #Pangea + activeSpaceId: state.uri.queryParameters['spaceId'], + activeFilter: state.uri.queryParameters['filter'], + // Pangea# ), ), routes: [ @@ -727,6 +760,10 @@ abstract class AppRoutes { ? TwoColumnLayout( mainView: ChatList( activeChat: state.pathParameters['roomid'], + // #Pangea + activeSpaceId: state.uri.queryParameters['spaceId'], + activeFilter: state.uri.queryParameters['filter'], + // Pangea# displayNavigationRail: state.path?.startsWith('/rooms/settings') != true, ), diff --git a/lib/pages/chat/chat.dart b/lib/pages/chat/chat.dart index c6583f006..b11855593 100644 --- a/lib/pages/chat/chat.dart +++ b/lib/pages/chat/chat.dart @@ -358,14 +358,6 @@ class ChatController extends State WidgetsBinding.instance.addObserver(this); // #Pangea if (!mounted) return; - if (room.isSpace) { - ErrorHandler.logError( - e: "Space chat opened", - s: StackTrace.current, - data: {"roomId": roomId}, - ); - context.go("/rooms"); - } Future.delayed(const Duration(seconds: 1), () async { if (!mounted) return; debugPrint( @@ -548,7 +540,8 @@ class ChatController extends State var prevNumEvents = timeline!.events.length; await requestHistory(); var numRequests = 0; - while (timeline!.events.length > prevNumEvents && + while (timeline != null && + timeline!.events.length > prevNumEvents && visibleEvents.length < 10 && numRequests <= 5) { prevNumEvents = timeline!.events.length; @@ -694,6 +687,14 @@ class ChatController extends State super.didChangeDependencies(); _router = GoRouter.of(context); _router.routeInformationProvider.addListener(_onRouteChanged); + if (room.isSpace && _router.state.path == ":roomid") { + ErrorHandler.logError( + e: "Space chat opened", + s: StackTrace.current, + data: {"roomId": roomId}, + ); + context.go("/rooms"); + } } void _onRouteChanged() { diff --git a/lib/pages/chat_list/chat_list.dart b/lib/pages/chat_list/chat_list.dart index d0db19cca..bbd599f46 100644 --- a/lib/pages/chat_list/chat_list.dart +++ b/lib/pages/chat_list/chat_list.dart @@ -80,11 +80,19 @@ extension LocalizedActiveFilter on ActiveFilter { class ChatList extends StatefulWidget { static BuildContext? contextForVoip; final String? activeChat; + // #Pangea + final String? activeSpaceId; + final String? activeFilter; + // Pangea# final bool displayNavigationRail; const ChatList({ super.key, required this.activeChat, + // #Pangea + this.activeSpaceId, + this.activeFilter, + // Pangea# this.displayNavigationRail = false, }); @@ -149,16 +157,9 @@ class ChatListController extends State future: () async { if (acceptInvite == OkCancelResult.ok) { await room.join(); - if (room.isSpace) { - setActiveSpace(room.id); - context.go( - FluffyThemes.isColumnMode(context) - ? "/rooms/${room.id}/details" - : "/rooms", - ); - return; - } - context.go("/rooms/${room.id}"); + context.go( + room.isSpace ? "/rooms?spaceId=${room.id}" : "/rooms/${room.id}", + ); return; } await room.leave(); @@ -472,7 +473,6 @@ class ChatListController extends State } //#Pangea - StreamSubscription? classStream; StreamSubscription? _invitedSpaceSubscription; StreamSubscription? _subscriptionStatusStream; StreamSubscription? _spaceChildSubscription; @@ -507,20 +507,6 @@ class ChatListController extends State _checkTorBrowser(); //#Pangea - classStream = MatrixState.pangeaController.classController.stateStream - .listen((event) { - if (!mounted || event is! Map) return; - if (event.containsKey("activeSpaceId")) { - final setSpaceID = event["activeSpaceId"]; - setSpaceID != null ? setActiveSpace(setSpaceID) : clearActiveSpace(); - if (setSpaceID != null) { - context.push("/rooms/$setSpaceID/details"); - } - } else if (event.containsKey("activeFilter")) { - setActiveFilter(event["activeFilter"]); - } - }); - _invitedSpaceSubscription = MatrixState .pangeaController.matrixState.client.onSync.stream .where((event) => event.rooms?.invite != null) @@ -635,6 +621,15 @@ class ChatListController extends State ); } }); + + _activeSpaceId = + widget.activeSpaceId == 'clear' ? null : widget.activeSpaceId; + + if (widget.activeFilter == 'groups') { + activeFilter = AppConfig.separateChatTypes + ? ActiveFilter.groups + : ActiveFilter.allChats; + } // Pangea# super.initState(); @@ -644,15 +639,21 @@ class ChatListController extends State @override void didUpdateWidget(ChatList oldWidget) { super.didUpdateWidget(oldWidget); - WidgetsBinding.instance.addPostFrameCallback((_) { - final params = GoRouterState.of(context).uri.queryParameters; - if (!params.containsKey("filter") || params['filter'] != 'groups') return; + if (widget.activeFilter != oldWidget.activeFilter && + widget.activeFilter == 'groups') { setActiveFilter( AppConfig.separateChatTypes ? ActiveFilter.groups : ActiveFilter.allChats, ); - }); + } + + if (widget.activeSpaceId != oldWidget.activeSpaceId && + widget.activeSpaceId != null) { + widget.activeSpaceId == 'clear' + ? clearActiveSpace() + : setActiveSpace(widget.activeSpaceId!); + } } // Pangea# @@ -662,7 +663,6 @@ class ChatListController extends State _intentFileStreamSubscription?.cancel(); _intentUriStreamSubscription?.cancel(); //#Pangea - classStream?.cancel(); _invitedSpaceSubscription?.cancel(); _subscriptionStatusStream?.cancel(); _spaceChildSubscription?.cancel(); diff --git a/lib/pages/new_group/new_group.dart b/lib/pages/new_group/new_group.dart index f959cc3ce..b2df139b0 100644 --- a/lib/pages/new_group/new_group.dart +++ b/lib/pages/new_group/new_group.dart @@ -240,8 +240,7 @@ class NewGroupController extends State { // if a timeout happened, don't redirect to the space if (error != null) return; - MatrixState.pangeaController.classController - .setActiveSpaceIdInChatListController(spaceId); + context.go("/rooms?spaceId=$spaceId"); // Pangea# context.pop(spaceId); } diff --git a/lib/pangea/chat_settings/pages/pangea_chat_details.dart b/lib/pangea/chat_settings/pages/pangea_chat_details.dart index b982a5fac..380975be1 100644 --- a/lib/pangea/chat_settings/pages/pangea_chat_details.dart +++ b/lib/pangea/chat_settings/pages/pangea_chat_details.dart @@ -430,8 +430,7 @@ class PangeaChatDetailsView extends StatelessWidget { room.isSpace ? room.leaveSpace : room.leave, ); if (!resp.isError) { - MatrixState.pangeaController.classController - .setActiveSpaceIdInChatListController(null); + context.go("/rooms?spaceId=clear"); } }, ), diff --git a/lib/pangea/spaces/controllers/space_controller.dart b/lib/pangea/spaces/controllers/space_controller.dart index e1ac7bf76..a38a73011 100644 --- a/lib/pangea/spaces/controllers/space_controller.dart +++ b/lib/pangea/spaces/controllers/space_controller.dart @@ -12,7 +12,6 @@ import 'package:get_storage/get_storage.dart'; import 'package:go_router/go_router.dart'; import 'package:matrix/matrix.dart'; -import 'package:fluffychat/pages/chat_list/chat_list.dart'; import 'package:fluffychat/pangea/common/constants/local.key.dart'; import 'package:fluffychat/pangea/common/controllers/pangea_controller.dart'; import 'package:fluffychat/pangea/common/utils/error_handler.dart'; @@ -34,14 +33,6 @@ class ClassController extends BaseController { _pangeaController = pangeaController; } - void setActiveFilterInChatListController(ActiveFilter filter) { - setState({"activeFilter": filter}); - } - - void setActiveSpaceIdInChatListController(String? classId) { - setState({"activeSpaceId": classId}); - } - Future joinCachedSpaceCode(BuildContext context) async { final String? classCode = linkBox.read( PLocalKey.cachedClassCodeToJoin, @@ -83,7 +74,7 @@ class ClassController extends BaseController { Room? room = client.getRoomByAlias(alias) ?? client.getRoomById(alias); if (room != null) { room.isSpace - ? setActiveSpaceIdInChatListController(room.id) + ? context.go("/rooms?spaceId=${room.id}") : context.go("/rooms/${room.id}"); return; } @@ -100,7 +91,7 @@ class ClassController extends BaseController { } room.isSpace - ? setActiveSpaceIdInChatListController(room.id) + ? context.go("/rooms?spaceId=${room.id}") : context.go("/rooms/${room.id}"); } @@ -141,7 +132,7 @@ class ClassController extends BaseController { ); if (alreadyJoined.isNotEmpty || inFoundClass) { - setActiveSpaceIdInChatListController(alreadyJoined.first); + context.go("/rooms?spaceId=${alreadyJoined.first}"); return null; } @@ -201,7 +192,7 @@ class ClassController extends BaseController { await room.requestParticipants(); } - setActiveSpaceIdInChatListController(spaceID.result!); + context.go("/rooms?spaceId=${room.id}"); return spaceID; } catch (e, s) { ErrorHandler.logError( diff --git a/lib/pangea/spaces/utils/join_with_alias.dart b/lib/pangea/spaces/utils/join_with_alias.dart index 86b491d3d..b458d2e6f 100644 --- a/lib/pangea/spaces/utils/join_with_alias.dart +++ b/lib/pangea/spaces/utils/join_with_alias.dart @@ -7,7 +7,8 @@ import 'package:fluffychat/widgets/layouts/empty_page.dart'; import 'package:fluffychat/widgets/matrix.dart'; class JoinWithAlias extends StatefulWidget { - const JoinWithAlias({super.key}); + final String? alias; + const JoinWithAlias({super.key, this.alias}); @override State createState() => _JoinWithAliasState(); @@ -26,16 +27,13 @@ class _JoinWithAliasState extends State { } Future _joinRoom() async { - final String? alias = - GoRouterState.of(context).uri.queryParameters['alias']; - - if (alias == null || alias.isEmpty) { + if (widget.alias == null || widget.alias!.isEmpty) { context.go("/rooms"); return; } await MatrixState.pangeaController.classController.joinCachedRoomAlias( - alias, + widget.alias!, context, ); } diff --git a/lib/pangea/spaces/utils/join_with_link.dart b/lib/pangea/spaces/utils/join_with_link.dart index cfeab97df..c4eac340a 100644 --- a/lib/pangea/spaces/utils/join_with_link.dart +++ b/lib/pangea/spaces/utils/join_with_link.dart @@ -4,14 +4,13 @@ import 'package:go_router/go_router.dart'; import 'package:sentry_flutter/sentry_flutter.dart'; import 'package:fluffychat/pangea/common/constants/local.key.dart'; -import 'package:fluffychat/pangea/common/controllers/pangea_controller.dart'; -import 'package:fluffychat/pangea/spaces/constants/space_constants.dart'; import 'package:fluffychat/widgets/matrix.dart'; //if on home with classcode in url and not logged in, then save it soemhow and after llogin, join class automatically //if on home with classcode in url and logged in, then join class automatically class JoinClassWithLink extends StatefulWidget { - const JoinClassWithLink({super.key}); + final String? classCode; + const JoinClassWithLink({super.key, this.classCode}); @override State createState() => _JoinClassWithLinkState(); @@ -19,19 +18,12 @@ class JoinClassWithLink extends StatefulWidget { //PTODO - show class info in field so they know they're joining the right class class _JoinClassWithLinkState extends State { - String? classCode; - final PangeaController pangeaController = MatrixState.pangeaController; - @override void initState() { super.initState(); Future.delayed(Duration.zero, () async { - classCode = GoRouterState.of(context) - .uri - .queryParameters[SpaceConstants.classCode]; - - if (classCode == null) { + if (widget.classCode == null) { Sentry.addBreadcrumb( Breadcrumb( message: @@ -42,7 +34,7 @@ class _JoinClassWithLinkState extends State { } await MatrixState.pangeaController.classController.linkBox.write( PLocalKey.cachedClassCodeToJoin, - classCode, + widget.classCode, ); context.go("/home"); }); diff --git a/lib/widgets/adaptive_dialogs/public_room_dialog.dart b/lib/widgets/adaptive_dialogs/public_room_dialog.dart index 9632cfbf4..64c382644 100644 --- a/lib/widgets/adaptive_dialogs/public_room_dialog.dart +++ b/lib/widgets/adaptive_dialogs/public_room_dialog.dart @@ -26,7 +26,6 @@ class PublicRoomDialog extends StatefulWidget { final List? via; const PublicRoomDialog({super.key, this.roomAlias, this.chunk, this.via}); - // #Pangea @override State createState() => PublicRoomDialogState(); @@ -39,6 +38,20 @@ class PublicRoomDialogState extends State { final TextEditingController _codeController = TextEditingController(); + @override + void didChangeDependencies() { + super.didChangeDependencies(); + if (chunk != null) { + final room = MatrixState.pangeaController.matrixState.client + .getRoomById(chunk!.roomId); + + if (room != null && room.membership == Membership.join) { + context.go("/rooms?spaceId=${room.id}"); + Navigator.of(context).maybePop(); + } + } + } + @override void dispose() { _codeController.dispose(); @@ -95,6 +108,11 @@ class PublicRoomDialogState extends State { !client.getRoomById(result.result!)!.isSpace) { context.go('/rooms/$roomId'); } + // #Pangea + else { + context.go('/rooms?spaceId=$roomId'); + } + // Pangea# return; }