diff --git a/lib/pages/chat/chat.dart b/lib/pages/chat/chat.dart index 85d5fd23e..38dc0583e 100644 --- a/lib/pages/chat/chat.dart +++ b/lib/pages/chat/chat.dart @@ -130,7 +130,7 @@ class ChatPage extends StatelessWidget { s: StackTrace.current, data: {"roomId": roomId}, ); - NavigationUtil.goToSpaceRoute('/rooms', context); + NavigationUtil.goToSpaceRoute(null, [], context); } if (room == null || room.membership == Membership.leave) { @@ -290,7 +290,7 @@ class ChatController extends State if (success.error != null) return; // #Pangea // context.go('/rooms'); - NavigationUtil.goToSpaceRoute('/rooms', context); + NavigationUtil.goToSpaceRoute(null, [], context); // Pangea# } @@ -812,7 +812,7 @@ class ChatController extends State s: StackTrace.current, data: {"roomId": roomId}, ); - NavigationUtil.goToSpaceRoute('/rooms', context); + NavigationUtil.goToSpaceRoute(null, [], context); } } @@ -2390,7 +2390,7 @@ class ChatController extends State ); } - NavigationUtil.goToSpaceRoute('/rooms', context); + NavigationUtil.goToSpaceRoute(null, [], context); } Future requestRegeneration(String eventId) async { diff --git a/lib/pages/chat/chat_app_bar_title.dart b/lib/pages/chat/chat_app_bar_title.dart index 616a8ebfa..714f7ac00 100644 --- a/lib/pages/chat/chat_app_bar_title.dart +++ b/lib/pages/chat/chat_app_bar_title.dart @@ -40,7 +40,8 @@ class ChatAppBarTitle extends StatelessWidget { // #Pangea // : context.go('/rooms/${room.id}/details'), : NavigationUtil.goToSpaceRoute( - '/rooms/${room.id}/details', + room.id, + ['details'], context, ), // Pangea# diff --git a/lib/pages/chat/chat_view.dart b/lib/pages/chat/chat_view.dart index b685ae2f2..1d83d673d 100644 --- a/lib/pages/chat/chat_view.dart +++ b/lib/pages/chat/chat_view.dart @@ -161,7 +161,8 @@ class ChatView extends StatelessWidget { tooltip: L10n.of(context).search, onPressed: () { NavigationUtil.goToSpaceRoute( - '/rooms/${controller.room.id}/search', + controller.room.id, + ['search'], context, ); }, @@ -172,12 +173,14 @@ class ChatView extends StatelessWidget { onPressed: () { if (GoRouterState.of(context).uri.path.endsWith('/details')) { NavigationUtil.goToSpaceRoute( - '/rooms/${controller.room.id}', + controller.room.id, + [], context, ); } else { NavigationUtil.goToSpaceRoute( - '/rooms/${controller.room.id}/details', + controller.room.id, + ['details'], context, ); } diff --git a/lib/pages/chat_details/chat_details.dart b/lib/pages/chat_details/chat_details.dart index 51ab8369b..b1cac71cf 100644 --- a/lib/pages/chat_details/chat_details.dart +++ b/lib/pages/chat_details/chat_details.dart @@ -360,7 +360,7 @@ class ChatDetailsController extends State ); if (resp.isError || resp.result == null || !mounted) return; - NavigationUtil.goToSpaceRoute('/rooms/${resp.result}/invite', context); + NavigationUtil.goToSpaceRoute(resp.result, ['invite'], context); } Future _loadCourseInfo() async { diff --git a/lib/pages/chat_list/chat_list.dart b/lib/pages/chat_list/chat_list.dart index 39d123b72..2231372ca 100644 --- a/lib/pages/chat_list/chat_list.dart +++ b/lib/pages/chat_list/chat_list.dart @@ -43,6 +43,7 @@ import '../../widgets/matrix.dart'; import 'package:fluffychat/utils/tor_stub.dart' if (dart.library.html) 'package:tor_detector_web/tor_detector_web.dart'; + enum PopupMenuAction { settings, invite, @@ -213,14 +214,7 @@ class ChatListController extends State return; case InviteAction.block: final userId = inviteEvent?.senderId; - // #Pangea - // context.go('/rooms/settings/security/ignorelist', extra: userId); - NavigationUtil.goToSpaceRoute( - '/rooms/settings/security/ignorelist', - context, - extra: userId, - ); - // Pangea# + context.go('/rooms/settings/security/ignorelist', extra: userId); return; } if (!mounted) return; @@ -249,13 +243,7 @@ class ChatListController extends State } if (room.membership == Membership.leave) { - // #Pangea - // context.go('/rooms/archive/${room.id}'); - NavigationUtil.goToSpaceRoute( - '/rooms/archive/${room.id}', - context, - ); - // Pangea# + context.go('/rooms/archive/${room.id}'); return; } @@ -266,10 +254,7 @@ class ChatListController extends State // #Pangea // context.go('/rooms/${room.id}'); - NavigationUtil.goToSpaceRoute( - '/rooms/${room.id}', - context, - ); + NavigationUtil.goToSpaceRoute(room.id, [], context); // Pangea# } @@ -667,10 +652,7 @@ class ChatListController extends State future: () async { await room.leave(); if (GoRouterState.of(context).uri.toString().contains(roomID)) { - NavigationUtil.goToSpaceRoute( - "/rooms", - context, - ); + NavigationUtil.goToSpaceRoute(null, [], context); } throw L10n.of(context).roomFull; }, diff --git a/lib/pages/chat_search/chat_search_message_tab.dart b/lib/pages/chat_search/chat_search_message_tab.dart index 313e277b7..5896b5943 100644 --- a/lib/pages/chat_search/chat_search_message_tab.dart +++ b/lib/pages/chat_search/chat_search_message_tab.dart @@ -208,8 +208,10 @@ class _MessageSearchResultListTile extends StatelessWidget { // )}', // ), onPressed: () => NavigationUtil.goToSpaceRoute( - '/rooms/${room.id}?event=${event.eventId}', + room.id, + [], context, + queryParams: {'event': event.eventId}, ), // Pangea# ), diff --git a/lib/pangea/activity_sessions/activity_session_chat/activity_session_popup_menu.dart b/lib/pangea/activity_sessions/activity_session_chat/activity_session_popup_menu.dart index fe91b0870..b28b6813a 100644 --- a/lib/pangea/activity_sessions/activity_session_chat/activity_session_popup_menu.dart +++ b/lib/pangea/activity_sessions/activity_session_chat/activity_session_popup_menu.dart @@ -32,7 +32,8 @@ class ActivitySessionPopupMenuState extends State break; case ActivityPopupMenuActions.invite: NavigationUtil.goToSpaceRoute( - '/rooms/${widget.room.id}/invite', + widget.room.id, + ['invite'], context, ); break; diff --git a/lib/pangea/activity_sessions/activity_session_start/activity_session_start_page.dart b/lib/pangea/activity_sessions/activity_session_start/activity_session_start_page.dart index b72a25396..95a3366e2 100644 --- a/lib/pangea/activity_sessions/activity_session_start/activity_session_start_page.dart +++ b/lib/pangea/activity_sessions/activity_session_start/activity_session_start_page.dart @@ -379,7 +379,8 @@ class ActivitySessionStartController extends State } NavigationUtil.goToSpaceRoute( - "/rooms/${widget.roomId}", + widget.roomId, + [], context, ); } @@ -409,7 +410,8 @@ class ActivitySessionStartController extends State if (!resp.isError) { NavigationUtil.goToSpaceRoute( - "/rooms/${resp.result}", + resp.result, + [], context, ); } @@ -456,7 +458,7 @@ class ActivitySessionStartController extends State Future joinActivityByRoomId(String roomId) async { final room = Matrix.of(context).client.getRoomById(roomId); if (room != null && room.membership == Membership.join) { - NavigationUtil.goToSpaceRoute("/rooms/$roomId", context); + NavigationUtil.goToSpaceRoute(roomId, [], context); return; } @@ -480,7 +482,7 @@ class ActivitySessionStartController extends State ); if (!resp.isError) { - NavigationUtil.goToSpaceRoute("/rooms/$roomId", context); + NavigationUtil.goToSpaceRoute(roomId, [], context); } } diff --git a/lib/pangea/activity_sessions/activity_session_start/activity_sessions_start_view.dart b/lib/pangea/activity_sessions/activity_session_start/activity_sessions_start_view.dart index a7d4b47ce..788a94f21 100644 --- a/lib/pangea/activity_sessions/activity_session_start/activity_sessions_start_view.dart +++ b/lib/pangea/activity_sessions/activity_session_start/activity_sessions_start_view.dart @@ -275,7 +275,8 @@ class ActivitySessionStartView extends StatelessWidget { style: buttonStyle, onPressed: () { NavigationUtil.goToSpaceRoute( - "/rooms/${controller.activityRoom!.id}/invite", + controller.activityRoom!.id, + ['invite'], context, ); }, @@ -398,7 +399,8 @@ class _ActivityStartButtons extends StatelessWidget { style: buttonStyle, onPressed: () { NavigationUtil.goToSpaceRoute( - "/rooms/$joinedActivityRoom", + joinedActivityRoom, + [], context, ); }, @@ -435,7 +437,8 @@ class _ActivityStartButtons extends StatelessWidget { if (!resp.isError) { NavigationUtil.goToSpaceRoute( - "/rooms/${resp.result}", + resp.result, + [], context, ); } diff --git a/lib/pangea/chat_list/widgets/public_room_bottom_sheet.dart b/lib/pangea/chat_list/widgets/public_room_bottom_sheet.dart index d4ad2a003..65d8587a8 100644 --- a/lib/pangea/chat_list/widgets/public_room_bottom_sheet.dart +++ b/lib/pangea/chat_list/widgets/public_room_bottom_sheet.dart @@ -98,7 +98,8 @@ class PublicRoomBottomSheetState extends State { void _goToRoom(String roomID) { if (chunk?.roomType != 'm.space' && !client.getRoomById(roomID)!.isSpace) { NavigationUtil.goToSpaceRoute( - "/rooms/$roomID", + roomID, + [], context, ); } else { diff --git a/lib/pangea/chat_settings/pages/chat_details_button_row.dart b/lib/pangea/chat_settings/pages/chat_details_button_row.dart index be7ad2bc1..731032817 100644 --- a/lib/pangea/chat_settings/pages/chat_details_button_row.dart +++ b/lib/pangea/chat_settings/pages/chat_details_button_row.dart @@ -72,7 +72,8 @@ class ChatDetailsButtonRowState extends State { icon: const Icon(Icons.edit_attributes_outlined, size: 30.0), onPressed: () { NavigationUtil.goToSpaceRoute( - '/rooms/${room.id}/details/permissions', + room.id, + ['details', 'permissions'], context, ); }, @@ -108,8 +109,12 @@ class ChatDetailsButtonRowState extends State { filter = room.pangeaSpaceParents.isNotEmpty ? 'space' : 'contacts'; } NavigationUtil.goToSpaceRoute( - '/rooms/${room.id}/details/invite?filter=$filter', + room.id, + ['details', 'invite'], context, + queryParams: { + 'filter': filter, + }, ); }, enabled: room.canInvite, @@ -149,7 +154,7 @@ class ChatDetailsButtonRowState extends State { future: room.leave, ); if (!resp.isError) { - NavigationUtil.goToSpaceRoute("/rooms", context); + NavigationUtil.goToSpaceRoute(null, [], context); } }, enabled: room.membership == Membership.join, @@ -174,7 +179,7 @@ class ChatDetailsButtonRowState extends State { future: room.delete, ); if (resp.isError) return; - NavigationUtil.goToSpaceRoute("/rooms", context); + NavigationUtil.goToSpaceRoute(null, [], context); }, enabled: room.isRoomAdmin, visible: !room.isDirectChat, diff --git a/lib/pangea/chat_settings/pages/chat_details_content.dart b/lib/pangea/chat_settings/pages/chat_details_content.dart index b875a2fa5..b97eb0cfb 100644 --- a/lib/pangea/chat_settings/pages/chat_details_content.dart +++ b/lib/pangea/chat_settings/pages/chat_details_content.dart @@ -120,8 +120,12 @@ class ChatDetailsContent extends StatelessWidget { onPressed: room.isDirectChat || !room.canInvite ? null : () => NavigationUtil.goToSpaceRoute( - '/rooms/${controller.roomId}/details/invite?filter=participants', + controller.roomId, + ['details', 'invite'], context, + queryParams: { + 'filter': 'participants', + }, ), icon: const Icon( Icons.group_outlined, diff --git a/lib/pangea/chat_settings/pages/pangea_invitation_selection_view.dart b/lib/pangea/chat_settings/pages/pangea_invitation_selection_view.dart index 8816aaf1b..d4515a353 100644 --- a/lib/pangea/chat_settings/pages/pangea_invitation_selection_view.dart +++ b/lib/pangea/chat_settings/pages/pangea_invitation_selection_view.dart @@ -72,8 +72,7 @@ class PangeaInvitationSelectionView extends StatelessWidget { ), ], ), - onPressed: () => - NavigationUtil.goToSpaceRoute('/rooms/${room.id}', context), + onPressed: () => NavigationUtil.goToSpaceRoute(room.id, [], context), ); return Scaffold( diff --git a/lib/pangea/chat_settings/pages/room_participants_widget.dart b/lib/pangea/chat_settings/pages/room_participants_widget.dart index 6c7832869..ba6484e8b 100644 --- a/lib/pangea/chat_settings/pages/room_participants_widget.dart +++ b/lib/pangea/chat_settings/pages/room_participants_widget.dart @@ -70,7 +70,8 @@ class RoomParticipantsSection extends StatelessWidget { cursor: SystemMouseCursors.click, child: GestureDetector( onTap: () => NavigationUtil.goToSpaceRoute( - "/rooms/${room.id}/details/invite", + room.id, + ['details', 'invite'], context, ), child: HoverBuilder( diff --git a/lib/pangea/chat_settings/widgets/chat_context_menu_action.dart b/lib/pangea/chat_settings/widgets/chat_context_menu_action.dart index 38667768b..f8efca23d 100644 --- a/lib/pangea/chat_settings/widgets/chat_context_menu_action.dart +++ b/lib/pangea/chat_settings/widgets/chat_context_menu_action.dart @@ -263,7 +263,7 @@ void chatContextMenuAction( if (!resp.isError) { isSpace ? context.go('/rooms') - : NavigationUtil.goToSpaceRoute("/rooms", context); + : NavigationUtil.goToSpaceRoute(null, [], context); } return; @@ -285,7 +285,7 @@ void chatContextMenuAction( future: room.delete, ); if (!resp.isError) { - NavigationUtil.goToSpaceRoute("/rooms", context); + NavigationUtil.goToSpaceRoute(null, [], context); } } return; diff --git a/lib/pangea/course_chats/course_chats_page.dart b/lib/pangea/course_chats/course_chats_page.dart index 9502dc63f..6945aadfe 100644 --- a/lib/pangea/course_chats/course_chats_page.dart +++ b/lib/pangea/course_chats/course_chats_page.dart @@ -391,9 +391,8 @@ class CourseChatsController extends State return; case InviteAction.block: final userId = inviteEvent?.senderId; - NavigationUtil.goToSpaceRoute( + context.go( '/rooms/settings/security/ignorelist', - context, extra: userId, ); return; @@ -424,19 +423,16 @@ class CourseChatsController extends State } if (room.membership == Membership.leave) { - NavigationUtil.goToSpaceRoute('/rooms/archive/${room.id}', context); + context.go('/rooms/archive/${room.id}'); return; } if (room.isSpace) { - NavigationUtil.goToSpaceRoute( - "/rooms/spaces/${room.id}/details", - context, - ); + context.go("/rooms/spaces/${room.id}/details"); return; } - NavigationUtil.goToSpaceRoute('/rooms/${room.id}', context); + NavigationUtil.goToSpaceRoute(room.id, [], context); } void joinChildRoom(SpaceRoomsChunk item) async { diff --git a/lib/pangea/navigation/navigation_util.dart b/lib/pangea/navigation/navigation_util.dart index 54576ee83..3a9607374 100644 --- a/lib/pangea/navigation/navigation_util.dart +++ b/lib/pangea/navigation/navigation_util.dart @@ -4,28 +4,70 @@ import 'package:go_router/go_router.dart'; class NavigationUtil { static void goToSpaceRoute( - String route, + String? goalRoomID, + List goalSubroute, BuildContext context, { Object? extra, + Map? queryParams, }) { final currentRoute = GoRouterState.of(context); final currentRouteSegments = currentRoute.uri.pathSegments; + String queryString = ''; + if (queryParams != null && queryParams.isNotEmpty) { + queryString = + '?${queryParams.entries.map((e) => '${Uri.encodeComponent(e.key)}=${Uri.encodeComponent(e.value)}').join('&')}'; + } if (currentRouteSegments.length > 1 && currentRouteSegments[0] == 'rooms' && - currentRouteSegments[1] == 'spaces') { - final spaceId = currentRoute.pathParameters['spaceid']; - final subroute = route.split('/rooms/'); - String goalRoute = "/rooms/spaces/$spaceId/"; - if (subroute.length > 1) { - goalRoute += subroute[1]; - } - if (goalRoute != currentRoute.uri.path) { - context.go(goalRoute, extra: extra); + currentRouteSegments[1] == 'spaces' && + currentRoute.pathParameters.containsKey('spaceid')) { + final spaceId = currentRoute.pathParameters['spaceid']!; + if (goalRoomID == null) { + context.go('/rooms/spaces/$spaceId$queryString', extra: extra); return; } + + if (spaceId == goalRoomID) { + if (goalSubroute.isEmpty) { + context.go('/rooms/spaces/$spaceId$queryString', extra: extra); + return; + } + context.go( + '/rooms/spaces/$spaceId/${goalSubroute.join('/')}$queryString', + extra: extra, + ); + return; + } + + if (goalSubroute.isEmpty) { + context.go( + '/rooms/spaces/$spaceId/$goalRoomID$queryString', + extra: extra, + ); + return; + } + + context.go( + '/rooms/spaces/$spaceId/$goalRoomID/${goalSubroute.join('/')}$queryString', + extra: extra, + ); + return; } - context.go(route, extra: extra); + if (goalRoomID == null) { + context.go('/rooms$queryString', extra: extra); + return; + } + + if (goalSubroute.isEmpty) { + context.go('/rooms/$goalRoomID$queryString', extra: extra); + return; + } + + context.go( + '/rooms/$goalRoomID/${goalSubroute.join('/')}$queryString', + extra: extra, + ); } }