diff --git a/lib/config/routes.dart b/lib/config/routes.dart index 7c2f9d42c..1ea1fdac7 100644 --- a/lib/config/routes.dart +++ b/lib/config/routes.dart @@ -46,7 +46,6 @@ import 'package:fluffychat/pangea/common/utils/p_vguard.dart'; import 'package:fluffychat/pangea/constructs/construct_identifier.dart'; import 'package:fluffychat/pangea/course_creation/course_invite_page.dart'; import 'package:fluffychat/pangea/course_creation/selected_course_page.dart'; -import 'package:fluffychat/pangea/extensions/pangea_room_extension.dart'; import 'package:fluffychat/pangea/join_codes/join_with_link_page.dart'; import 'package:fluffychat/pangea/learning_settings/settings_learning.dart'; import 'package:fluffychat/pangea/login/pages/add_course_page.dart'; @@ -993,30 +992,7 @@ abstract class AppRoutes { ), ); }, - // #Pangea - // redirect: loggedOutRedirect, - redirect: (context, state) { - String subroute = state.fullPath!.split('roomid').last; - if (state.uri.queryParameters.isNotEmpty) { - final queryString = state.uri.queryParameters.entries - .map((e) => '${e.key}=${e.value}') - .join('&'); - subroute = '$subroute?$queryString'; - } - - final roomId = state.pathParameters['roomid']!; - final room = Matrix.of(context).client.getRoomById(roomId); - if (room != null && room.isSpace) { - return "/rooms/spaces/${room.id}$subroute"; - } - - final parent = room?.firstSpaceParent; - if (parent != null && state.fullPath != null) { - return "/rooms/spaces/${parent.id}/$roomId$subroute"; - } - return loggedOutRedirect(context, state); - }, - // Pangea# + redirect: loggedOutRedirect, routes: [ GoRoute( path: 'search', diff --git a/lib/pages/chat/chat.dart b/lib/pages/chat/chat.dart index 31eec29e2..c33aee1a0 100644 --- a/lib/pages/chat/chat.dart +++ b/lib/pages/chat/chat.dart @@ -66,6 +66,7 @@ import 'package:fluffychat/pangea/languages/language_service.dart'; import 'package:fluffychat/pangea/learning_settings/disable_language_tools_popup.dart'; import 'package:fluffychat/pangea/learning_settings/language_mismatch_repo.dart'; import 'package:fluffychat/pangea/learning_settings/p_language_dialog.dart'; +import 'package:fluffychat/pangea/navigation/navigation_util.dart'; import 'package:fluffychat/pangea/spaces/load_participants_builder.dart'; import 'package:fluffychat/pangea/subscription/widgets/paywall_card.dart'; import 'package:fluffychat/pangea/token_info_feedback/show_token_feedback_dialog.dart'; @@ -129,7 +130,7 @@ class ChatPage extends StatelessWidget { s: StackTrace.current, data: {"roomId": roomId}, ); - context.go("/rooms"); + NavigationUtil.goToSpaceRoute('/rooms', context); } if (room == null || room.membership == Membership.leave) { @@ -287,7 +288,10 @@ class ChatController extends State future: room.leave, ); if (success.error != null) return; - context.go('/rooms'); + // #Pangea + // context.go('/rooms'); + NavigationUtil.goToSpaceRoute('/rooms', context); + // Pangea# } // #Pangea @@ -808,7 +812,7 @@ class ChatController extends State s: StackTrace.current, data: {"roomId": roomId}, ); - context.go("/rooms"); + NavigationUtil.goToSpaceRoute('/rooms', context); } } @@ -2339,7 +2343,6 @@ class ChatController extends State } Future onLeave() async { - final parentSpaceId = room.courseParent?.id; final confirmed = await showOkCancelAlertDialog( context: context, title: L10n.of(context).areYouSure, @@ -2363,9 +2366,7 @@ class ChatController extends State ); } - context.go( - parentSpaceId != null ? '/rooms/spaces/$parentSpaceId' : '/rooms', - ); + NavigationUtil.goToSpaceRoute('/rooms', 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 089ac79f2..616a8ebfa 100644 --- a/lib/pages/chat/chat_app_bar_title.dart +++ b/lib/pages/chat/chat_app_bar_title.dart @@ -1,11 +1,11 @@ import 'package:flutter/material.dart'; -import 'package:go_router/go_router.dart'; import 'package:matrix/matrix.dart'; import 'package:fluffychat/config/themes.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/chat/chat.dart'; +import 'package:fluffychat/pangea/navigation/navigation_util.dart'; import 'package:fluffychat/utils/date_time_extension.dart'; import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; import 'package:fluffychat/utils/sync_status_localization.dart'; @@ -37,7 +37,13 @@ class ChatAppBarTitle extends StatelessWidget { ? null : () => FluffyThemes.isThreeColumnMode(context) ? controller.toggleDisplayChatDetailsColumn() - : context.go('/rooms/${room.id}/details'), + // #Pangea + // : context.go('/rooms/${room.id}/details'), + : NavigationUtil.goToSpaceRoute( + '/rooms/${room.id}/details', + context, + ), + // Pangea# child: Row( children: [ Hero( diff --git a/lib/pages/chat/chat_view.dart b/lib/pages/chat/chat_view.dart index 6a22938c5..b685ae2f2 100644 --- a/lib/pages/chat/chat_view.dart +++ b/lib/pages/chat/chat_view.dart @@ -24,6 +24,7 @@ import 'package:fluffychat/pangea/analytics_misc/level_up/star_rain_widget.dart' import 'package:fluffychat/pangea/chat/widgets/chat_floating_action_button.dart'; import 'package:fluffychat/pangea/chat/widgets/chat_input_bar.dart'; import 'package:fluffychat/pangea/chat/widgets/chat_view_background.dart'; +import 'package:fluffychat/pangea/navigation/navigation_util.dart'; import 'package:fluffychat/utils/account_config.dart'; import 'package:fluffychat/utils/localized_exception_extension.dart'; import 'package:fluffychat/widgets/future_loading_dialog.dart'; @@ -159,7 +160,10 @@ class ChatView extends StatelessWidget { icon: const Icon(Icons.search_outlined), tooltip: L10n.of(context).search, onPressed: () { - context.go('/rooms/${controller.room.id}/search'); + NavigationUtil.goToSpaceRoute( + '/rooms/${controller.room.id}/search', + context, + ); }, ), IconButton( @@ -167,9 +171,15 @@ class ChatView extends StatelessWidget { tooltip: L10n.of(context).chatDetails, onPressed: () { if (GoRouterState.of(context).uri.path.endsWith('/details')) { - context.go('/rooms/${controller.room.id}'); + NavigationUtil.goToSpaceRoute( + '/rooms/${controller.room.id}', + context, + ); } else { - context.go('/rooms/${controller.room.id}/details'); + NavigationUtil.goToSpaceRoute( + '/rooms/${controller.room.id}/details', + context, + ); } }, ), diff --git a/lib/pages/chat_details/chat_details.dart b/lib/pages/chat_details/chat_details.dart index 798ac7471..51ab8369b 100644 --- a/lib/pages/chat_details/chat_details.dart +++ b/lib/pages/chat_details/chat_details.dart @@ -19,6 +19,7 @@ import 'package:fluffychat/pangea/course_plans/courses/course_plan_builder.dart' import 'package:fluffychat/pangea/course_plans/courses/course_plan_room_extension.dart'; import 'package:fluffychat/pangea/extensions/join_rule_extension.dart'; import 'package:fluffychat/pangea/extensions/pangea_room_extension.dart'; +import 'package:fluffychat/pangea/navigation/navigation_util.dart'; import 'package:fluffychat/utils/file_selector.dart'; import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; import 'package:fluffychat/utils/platform_infos.dart'; @@ -359,7 +360,7 @@ class ChatDetailsController extends State ); if (resp.isError || resp.result == null || !mounted) return; - context.go('/rooms/${resp.result}/invite'); + NavigationUtil.goToSpaceRoute('/rooms/${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 b9b8ddd9f..39d123b72 100644 --- a/lib/pages/chat_list/chat_list.dart +++ b/lib/pages/chat_list/chat_list.dart @@ -22,6 +22,7 @@ import 'package:fluffychat/pangea/common/utils/error_handler.dart'; import 'package:fluffychat/pangea/extensions/pangea_room_extension.dart'; import 'package:fluffychat/pangea/join_codes/space_code_controller.dart'; import 'package:fluffychat/pangea/join_codes/space_code_repo.dart'; +import 'package:fluffychat/pangea/navigation/navigation_util.dart'; import 'package:fluffychat/pangea/subscription/widgets/subscription_snackbar.dart'; import 'package:fluffychat/utils/localized_exception_extension.dart'; import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; @@ -212,7 +213,14 @@ class ChatListController extends State return; case InviteAction.block: final userId = inviteEvent?.senderId; - context.go('/rooms/settings/security/ignorelist', extra: userId); + // #Pangea + // context.go('/rooms/settings/security/ignorelist', extra: userId); + NavigationUtil.goToSpaceRoute( + '/rooms/settings/security/ignorelist', + context, + extra: userId, + ); + // Pangea# return; } if (!mounted) return; @@ -241,7 +249,13 @@ class ChatListController extends State } if (room.membership == Membership.leave) { - context.go('/rooms/archive/${room.id}'); + // #Pangea + // context.go('/rooms/archive/${room.id}'); + NavigationUtil.goToSpaceRoute( + '/rooms/archive/${room.id}', + context, + ); + // Pangea# return; } @@ -250,7 +264,13 @@ class ChatListController extends State return; } - context.go('/rooms/${room.id}'); + // #Pangea + // context.go('/rooms/${room.id}'); + NavigationUtil.goToSpaceRoute( + '/rooms/${room.id}', + context, + ); + // Pangea# } bool Function(Room) getRoomFilterByActiveFilter(ActiveFilter activeFilter) { @@ -258,36 +278,24 @@ class ChatListController extends State case ActiveFilter.allChats: // #Pangea // return (room) => true; - return (room) => - !room.isHiddenRoom && - !room.isSpace && - room.firstSpaceParent == null; + return (room) => !room.isHiddenRoom && !room.isSpace; // Pangea# case ActiveFilter.messages: // #Pangea // return (room) => !room.isSpace && room.isDirectChat; return (room) => - !room.isSpace && - room.isDirectChat && - !room.isHiddenRoom && - room.firstSpaceParent == null; + !room.isSpace && room.isDirectChat && !room.isHiddenRoom; // Pangea# case ActiveFilter.groups: // #Pangea // return (room) => !room.isSpace && !room.isDirectChat; return (room) => - !room.isSpace && - !room.isDirectChat && - !room.isHiddenRoom && - room.firstSpaceParent == null; + !room.isSpace && !room.isDirectChat && !room.isHiddenRoom; // Pangea# case ActiveFilter.unread: // #Pangea // return (room) => room.isUnreadOrInvited; - return (room) => - room.isUnreadOrInvited && - !room.isHiddenRoom && - room.firstSpaceParent == null; + return (room) => room.isUnreadOrInvited && !room.isHiddenRoom; // Pangea# case ActiveFilter.spaces: return (room) => room.isSpace; @@ -659,7 +667,10 @@ class ChatListController extends State future: () async { await room.leave(); if (GoRouterState.of(context).uri.toString().contains(roomID)) { - context.go("/rooms"); + NavigationUtil.goToSpaceRoute( + "/rooms", + 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 e8dcfd067..313e277b7 100644 --- a/lib/pages/chat_search/chat_search_message_tab.dart +++ b/lib/pages/chat_search/chat_search_message_tab.dart @@ -1,10 +1,10 @@ import 'package:flutter/material.dart'; import 'package:flutter_linkify/flutter_linkify.dart'; -import 'package:go_router/go_router.dart'; import 'package:matrix/matrix.dart'; import 'package:fluffychat/l10n/l10n.dart'; +import 'package:fluffychat/pangea/navigation/navigation_util.dart'; import 'package:fluffychat/utils/date_time_extension.dart'; import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; import 'package:fluffychat/utils/url_launcher.dart'; @@ -200,12 +200,18 @@ class _MessageSearchResultListTile extends StatelessWidget { icon: const Icon( Icons.chevron_right_outlined, ), - onPressed: () => context.go( - '/${Uri( - pathSegments: ['rooms', room.id], - queryParameters: {'event': event.eventId}, - )}', + // #Pangea + // onPressed: () => context.go( + // '/${Uri( + // pathSegments: ['rooms', room.id], + // queryParameters: {'event': event.eventId}, + // )}', + // ), + onPressed: () => NavigationUtil.goToSpaceRoute( + '/rooms/${room.id}?event=${event.eventId}', + context, ), + // 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 e45f9adfb..fe91b0870 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 @@ -1,11 +1,10 @@ import 'package:flutter/material.dart'; -import 'package:go_router/go_router.dart'; import 'package:matrix/matrix.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pages/chat_details/chat_download_provider.dart'; -import 'package:fluffychat/pangea/activity_sessions/activity_room_extension.dart'; +import 'package:fluffychat/pangea/navigation/navigation_util.dart'; enum ActivityPopupMenuActions { invite, leave, download } @@ -32,10 +31,9 @@ class ActivitySessionPopupMenuState extends State widget.onLeave(); break; case ActivityPopupMenuActions.invite: - context.go( - widget.room.courseParent != null - ? '/rooms/spaces/${widget.room.courseParent!.id}/${widget.room.id}/invite' - : '/rooms/${widget.room.id}/invite', + NavigationUtil.goToSpaceRoute( + '/rooms/${widget.room.id}/invite', + context, ); break; case ActivityPopupMenuActions.download: 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 bf1387cb6..b72a25396 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 @@ -20,6 +20,7 @@ import 'package:fluffychat/pangea/course_plans/course_activities/course_activity import 'package:fluffychat/pangea/course_plans/courses/course_plan_room_extension.dart'; import 'package:fluffychat/pangea/events/constants/pangea_event_types.dart'; import 'package:fluffychat/pangea/extensions/pangea_room_extension.dart'; +import 'package:fluffychat/pangea/navigation/navigation_util.dart'; import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; import 'package:fluffychat/widgets/future_loading_dialog.dart'; import 'package:fluffychat/widgets/matrix.dart'; @@ -377,7 +378,10 @@ class ActivitySessionStartController extends State } } - context.go("/rooms/spaces/${widget.parentId}/${widget.roomId}"); + NavigationUtil.goToSpaceRoute( + "/rooms/${widget.roomId}", + context, + ); } Future confirmRoleSelection() async { @@ -404,7 +408,10 @@ class ActivitySessionStartController extends State ); if (!resp.isError) { - context.go("/rooms/spaces/${widget.parentId}/${resp.result}"); + NavigationUtil.goToSpaceRoute( + "/rooms/${resp.result}", + context, + ); } } } @@ -449,9 +456,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) { - widget.parentId != null - ? context.go("/rooms/spaces/${widget.parentId}/$roomId") - : context.go("/rooms/$roomId"); + NavigationUtil.goToSpaceRoute("/rooms/$roomId", context); return; } @@ -475,9 +480,7 @@ class ActivitySessionStartController extends State ); if (!resp.isError) { - widget.parentId != null - ? context.go("/rooms/spaces/${widget.parentId}/$roomId") - : context.go("/rooms/$roomId"); + NavigationUtil.goToSpaceRoute("/rooms/$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 7f5c1d7b1..a7d4b47ce 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 @@ -20,6 +20,7 @@ import 'package:fluffychat/pangea/course_chats/open_roles_indicator.dart'; import 'package:fluffychat/pangea/course_plans/course_activities/activity_summaries_provider.dart'; import 'package:fluffychat/pangea/course_plans/course_activities/course_activity_repo.dart'; import 'package:fluffychat/pangea/extensions/pangea_room_extension.dart'; +import 'package:fluffychat/pangea/navigation/navigation_util.dart'; import 'package:fluffychat/utils/stream_extension.dart'; import 'package:fluffychat/widgets/future_loading_dialog.dart'; import 'package:fluffychat/widgets/matrix.dart'; @@ -272,9 +273,12 @@ class ActivitySessionStartView extends StatelessWidget { ), ElevatedButton( style: buttonStyle, - onPressed: () => context.go( - "/rooms/${controller.activityRoom!.id}/invite", - ), + onPressed: () { + NavigationUtil.goToSpaceRoute( + "/rooms/${controller.activityRoom!.id}/invite", + context, + ); + }, child: Row( mainAxisAlignment: MainAxisAlignment.center, @@ -392,9 +396,12 @@ class _ActivityStartButtons extends StatelessWidget { ] else if (joinedActivityRoom != null) ...[ ElevatedButton( style: buttonStyle, - onPressed: () => context.go( - "/rooms/spaces/${controller.widget.parentId}/$joinedActivityRoom", - ), + onPressed: () { + NavigationUtil.goToSpaceRoute( + "/rooms/$joinedActivityRoom", + context, + ); + }, child: Row( mainAxisAlignment: MainAxisAlignment.center, children: [ @@ -427,8 +434,9 @@ class _ActivityStartButtons extends StatelessWidget { ); if (!resp.isError) { - context.go( - "/rooms/spaces/${controller.widget.parentId}/${resp.result}", + NavigationUtil.goToSpaceRoute( + "/rooms/${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 686a22432..d4ad2a003 100644 --- a/lib/pangea/chat_list/widgets/public_room_bottom_sheet.dart +++ b/lib/pangea/chat_list/widgets/public_room_bottom_sheet.dart @@ -8,6 +8,7 @@ import 'package:matrix/matrix.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pangea/extensions/pangea_rooms_chunk_extension.dart'; import 'package:fluffychat/pangea/join_codes/space_code_controller.dart'; +import 'package:fluffychat/pangea/navigation/navigation_util.dart'; import 'package:fluffychat/utils/adaptive_bottom_sheet.dart'; import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/future_loading_dialog.dart'; @@ -96,7 +97,10 @@ class PublicRoomBottomSheetState extends State { void _goToRoom(String roomID) { if (chunk?.roomType != 'm.space' && !client.getRoomById(roomID)!.isSpace) { - outerContext.go("/rooms/$roomID"); + NavigationUtil.goToSpaceRoute( + "/rooms/$roomID", + context, + ); } else { context.go('/rooms/spaces/$roomID/details'); } 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 473ca5f75..a7c10d565 100644 --- a/lib/pangea/chat_settings/pages/chat_details_button_row.dart +++ b/lib/pangea/chat_settings/pages/chat_details_button_row.dart @@ -3,7 +3,6 @@ import 'dart:async'; import 'package:flutter/foundation.dart'; import 'package:flutter/material.dart'; -import 'package:go_router/go_router.dart'; import 'package:matrix/matrix.dart'; import 'package:fluffychat/config/themes.dart'; @@ -13,6 +12,7 @@ import 'package:fluffychat/pangea/activity_sessions/activity_room_extension.dart import 'package:fluffychat/pangea/chat_settings/pages/room_details_buttons.dart'; import 'package:fluffychat/pangea/chat_settings/utils/delete_room.dart'; import 'package:fluffychat/pangea/extensions/pangea_room_extension.dart'; +import 'package:fluffychat/pangea/navigation/navigation_util.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; import 'package:fluffychat/widgets/future_loading_dialog.dart'; import 'package:fluffychat/widgets/matrix.dart'; @@ -70,7 +70,12 @@ class ChatDetailsButtonRowState extends State { ButtonDetails( title: l10n.permissions, icon: const Icon(Icons.edit_attributes_outlined, size: 30.0), - onPressed: () => context.go('/rooms/${room.id}/details/permissions'), + onPressed: () { + NavigationUtil.goToSpaceRoute( + '/rooms/${room.id}/details/permissions', + context, + ); + }, enabled: room.isRoomAdmin, visible: !room.isDirectChat, showInMainView: false, @@ -102,7 +107,10 @@ class ChatDetailsButtonRowState extends State { if (room.getParticipants([Membership.knock]).isEmpty) { filter = room.pangeaSpaceParents.isNotEmpty ? 'space' : 'contacts'; } - context.go('/rooms/${room.id}/details/invite?filter=$filter'); + NavigationUtil.goToSpaceRoute( + '/rooms/${room.id}/details/invite?filter=$filter', + context, + ); }, enabled: room.canInvite, visible: !room.isDirectChat, @@ -142,7 +150,7 @@ class ChatDetailsButtonRowState extends State { future: room.leave, ); if (!resp.isError) { - context.go("/rooms"); + NavigationUtil.goToSpaceRoute("/rooms", context); } }, enabled: room.membership == Membership.join, @@ -152,7 +160,6 @@ class ChatDetailsButtonRowState extends State { title: l10n.delete, icon: const Icon(Icons.delete_outline, size: 30.0), onPressed: () async { - final parentSpaceId = room.courseParent?.id; final confirmed = await showOkCancelAlertDialog( context: context, title: L10n.of(context).areYouSure, @@ -168,11 +175,7 @@ class ChatDetailsButtonRowState extends State { future: room.delete, ); if (resp.isError) return; - context.go( - parentSpaceId != null - ? "/rooms/spaces/$parentSpaceId/details" - : "/rooms", - ); + NavigationUtil.goToSpaceRoute("/rooms", 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 19445495a..b875a2fa5 100644 --- a/lib/pangea/chat_settings/pages/chat_details_content.dart +++ b/lib/pangea/chat_settings/pages/chat_details_content.dart @@ -1,7 +1,6 @@ import 'package:flutter/material.dart'; import 'package:flutter_linkify/flutter_linkify.dart'; -import 'package:go_router/go_router.dart'; import 'package:matrix/matrix.dart'; import 'package:fluffychat/l10n/l10n.dart'; @@ -11,6 +10,7 @@ import 'package:fluffychat/pangea/chat_settings/pages/room_participants_widget.d import 'package:fluffychat/pangea/extensions/pangea_room_extension.dart'; import 'package:fluffychat/pangea/instructions/instructions_enum.dart'; import 'package:fluffychat/pangea/instructions/instructions_inline_tooltip.dart'; +import 'package:fluffychat/pangea/navigation/navigation_util.dart'; import 'package:fluffychat/utils/fluffy_share.dart'; import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; import 'package:fluffychat/utils/url_launcher.dart'; @@ -119,8 +119,9 @@ class ChatDetailsContent extends StatelessWidget { TextButton.icon( onPressed: room.isDirectChat || !room.canInvite ? null - : () => context.push( + : () => NavigationUtil.goToSpaceRoute( '/rooms/${controller.roomId}/details/invite?filter=participants', + context, ), 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 6af355769..8816aaf1b 100644 --- a/lib/pangea/chat_settings/pages/pangea_invitation_selection_view.dart +++ b/lib/pangea/chat_settings/pages/pangea_invitation_selection_view.dart @@ -4,7 +4,6 @@ import 'package:flutter/services.dart'; import 'package:cached_network_image/cached_network_image.dart'; import 'package:collection/collection.dart'; -import 'package:go_router/go_router.dart'; import 'package:matrix/matrix.dart'; import 'package:universal_html/html.dart' as html; @@ -16,6 +15,7 @@ import 'package:fluffychat/pangea/chat_settings/pages/pangea_invitation_selectio import 'package:fluffychat/pangea/common/config/environment.dart'; import 'package:fluffychat/pangea/course_plans/map_clipper.dart'; import 'package:fluffychat/pangea/extensions/pangea_room_extension.dart'; +import 'package:fluffychat/pangea/navigation/navigation_util.dart'; import 'package:fluffychat/pangea/spaces/space_constants.dart'; import 'package:fluffychat/utils/stream_extension.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/user_dialog.dart'; @@ -72,9 +72,8 @@ class PangeaInvitationSelectionView extends StatelessWidget { ), ], ), - onPressed: () => context.go( - room.isSpace ? "/rooms/spaces/${room.id}/details" : "/rooms/${room.id}", - ), + onPressed: () => + NavigationUtil.goToSpaceRoute('/rooms/${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 9b0c2ea05..42332ef6f 100644 --- a/lib/pangea/chat_settings/pages/room_participants_widget.dart +++ b/lib/pangea/chat_settings/pages/room_participants_widget.dart @@ -1,13 +1,13 @@ import 'package:flutter/material.dart'; import 'package:collection/collection.dart'; -import 'package:go_router/go_router.dart'; import 'package:matrix/matrix.dart'; import 'package:fluffychat/config/app_config.dart'; import 'package:fluffychat/l10n/l10n.dart'; import 'package:fluffychat/pangea/analytics_misc/level_display_name.dart'; import 'package:fluffychat/pangea/bot/utils/bot_name.dart'; +import 'package:fluffychat/pangea/navigation/navigation_util.dart'; import 'package:fluffychat/pangea/spaces/load_participants_builder.dart'; import 'package:fluffychat/widgets/avatar.dart'; import 'package:fluffychat/widgets/hover_builder.dart'; @@ -80,8 +80,9 @@ class RoomParticipantsSection extends StatelessWidget { ? MouseRegion( cursor: SystemMouseCursors.click, child: GestureDetector( - onTap: () => context.go( + onTap: () => NavigationUtil.goToSpaceRoute( "/rooms/${room.id}/details/invite", + context, ), child: HoverBuilder( builder: (context, hovered) { diff --git a/lib/pangea/chat_settings/pages/space_details_content.dart b/lib/pangea/chat_settings/pages/space_details_content.dart index d75059be5..a9676c610 100644 --- a/lib/pangea/chat_settings/pages/space_details_content.dart +++ b/lib/pangea/chat_settings/pages/space_details_content.dart @@ -121,7 +121,7 @@ class SpaceDetailsContent extends StatelessWidget { title: l10n.editCourse, description: l10n.editCourseDesc, icon: const Icon(Icons.edit_outlined, size: 30.0), - onPressed: () => context.go('/rooms/${room.id}/details/edit'), + onPressed: () => context.go('/rooms/spaces/${room.id}/details/edit'), enabled: room.isRoomAdmin, showInMainView: false, ), @@ -151,7 +151,8 @@ class SpaceDetailsContent extends StatelessWidget { title: l10n.permissions, description: l10n.permissionsDesc, icon: const Icon(Icons.edit_attributes_outlined, size: 30.0), - onPressed: () => context.go('/rooms/${room.id}/details/permissions'), + onPressed: () => + context.go('/rooms/spaces/${room.id}/details/permissions'), enabled: room.isRoomAdmin, showInMainView: false, ), @@ -159,7 +160,7 @@ class SpaceDetailsContent extends StatelessWidget { title: l10n.access, description: l10n.accessDesc, icon: const Icon(Icons.shield_outlined, size: 30.0), - onPressed: () => context.go('/rooms/${room.id}/details/access'), + onPressed: () => context.go('/rooms/spaces/${room.id}/details/access'), enabled: room.isRoomAdmin && room.spaceParents.isEmpty, showInMainView: false, ), 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 db4f4ddde..bd230f37f 100644 --- a/lib/pangea/chat_settings/widgets/chat_context_menu_action.dart +++ b/lib/pangea/chat_settings/widgets/chat_context_menu_action.dart @@ -9,6 +9,7 @@ import 'package:fluffychat/pangea/activity_sessions/activity_room_extension.dart import 'package:fluffychat/pangea/chat_settings/utils/delete_room.dart'; import 'package:fluffychat/pangea/chat_settings/widgets/delete_space_dialog.dart'; import 'package:fluffychat/pangea/extensions/pangea_room_extension.dart'; +import 'package:fluffychat/pangea/navigation/navigation_util.dart'; import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; import 'package:fluffychat/widgets/adaptive_dialogs/show_ok_cancel_alert_dialog.dart'; import 'package:fluffychat/widgets/avatar.dart'; @@ -248,9 +249,10 @@ void chatContextMenuAction( ); if (confirmed != OkCancelResult.ok) return; + final isSpace = room.isSpace; final resp = await showFutureLoadingDialog( context: context, - future: room.isSpace ? room.leaveSpace : room.leave, + future: isSpace ? room.leaveSpace : room.leave, ); final r = room.client.getRoomById(room.id); @@ -259,11 +261,9 @@ void chatContextMenuAction( } if (!resp.isError) { - outerContext.go( - room.courseParent != null - ? "/rooms/spaces/${room.courseParent!.id}/details" - : "/rooms", - ); + isSpace + ? context.go('/rooms') + : NavigationUtil.goToSpaceRoute("/rooms", context); } return; @@ -277,7 +277,6 @@ void chatContextMenuAction( context.go("/rooms"); } } else { - final parentSpaceId = room.courseParent?.id; final confirmed = await showOkCancelAlertDialog( context: context, title: l10n.areYouSure, @@ -292,11 +291,7 @@ void chatContextMenuAction( future: room.delete, ); if (!resp.isError) { - outerContext.go( - parentSpaceId != null - ? "/rooms/spaces/$parentSpaceId/details" - : "/rooms", - ); + NavigationUtil.goToSpaceRoute("/rooms", context); } } return; diff --git a/lib/pangea/course_chats/course_chats_page.dart b/lib/pangea/course_chats/course_chats_page.dart index 7b0b3389a..9502dc63f 100644 --- a/lib/pangea/course_chats/course_chats_page.dart +++ b/lib/pangea/course_chats/course_chats_page.dart @@ -20,6 +20,7 @@ import 'package:fluffychat/pangea/course_plans/course_activities/activity_summar import 'package:fluffychat/pangea/course_plans/courses/course_plan_builder.dart'; import 'package:fluffychat/pangea/course_plans/courses/course_plan_room_extension.dart'; import 'package:fluffychat/pangea/extensions/pangea_room_extension.dart'; +import 'package:fluffychat/pangea/navigation/navigation_util.dart'; import 'package:fluffychat/pangea/spaces/space_constants.dart'; import 'package:fluffychat/utils/localized_exception_extension.dart'; import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; @@ -390,7 +391,11 @@ class CourseChatsController extends State return; case InviteAction.block: final userId = inviteEvent?.senderId; - context.go('/rooms/settings/security/ignorelist', extra: userId); + NavigationUtil.goToSpaceRoute( + '/rooms/settings/security/ignorelist', + context, + extra: userId, + ); return; } if (!mounted) return; @@ -419,16 +424,19 @@ class CourseChatsController extends State } if (room.membership == Membership.leave) { - context.go('/rooms/archive/${room.id}'); + NavigationUtil.goToSpaceRoute('/rooms/archive/${room.id}', context); return; } if (room.isSpace) { - context.go("/rooms/spaces/${room.id}/details"); + NavigationUtil.goToSpaceRoute( + "/rooms/spaces/${room.id}/details", + context, + ); return; } - context.go('/rooms/${room.id}'); + NavigationUtil.goToSpaceRoute('/rooms/${room.id}', context); } void joinChildRoom(SpaceRoomsChunk item) async { diff --git a/lib/pangea/navigation/navigation_util.dart b/lib/pangea/navigation/navigation_util.dart new file mode 100644 index 000000000..54576ee83 --- /dev/null +++ b/lib/pangea/navigation/navigation_util.dart @@ -0,0 +1,31 @@ +import 'package:flutter/material.dart'; + +import 'package:go_router/go_router.dart'; + +class NavigationUtil { + static void goToSpaceRoute( + String route, + BuildContext context, { + Object? extra, + }) { + final currentRoute = GoRouterState.of(context); + final currentRouteSegments = currentRoute.uri.pathSegments; + + 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); + return; + } + } + + context.go(route, extra: extra); + } +} diff --git a/lib/widgets/navigation_rail.dart b/lib/widgets/navigation_rail.dart index 148daa1f1..9fa128721 100644 --- a/lib/widgets/navigation_rail.dart +++ b/lib/widgets/navigation_rail.dart @@ -159,7 +159,7 @@ class SpacesNavigationRail extends StatelessWidget { collapse(); context.go("/rooms"); }, - toolTip: L10n.of(context).directMessages, + toolTip: L10n.of(context).allChats, unreadBadgeFilter: (room) => room.firstSpaceParent == null, expanded: expanded,