fix: don't double space ID on navigation (#5163)

This commit is contained in:
ggurdin 2026-01-09 13:24:00 -05:00 committed by GitHub
parent 0f80e9349f
commit 1f9f2ab24a
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
17 changed files with 113 additions and 71 deletions

View file

@ -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<ChatPageWithRoom>
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<ChatPageWithRoom>
s: StackTrace.current,
data: {"roomId": roomId},
);
NavigationUtil.goToSpaceRoute('/rooms', context);
NavigationUtil.goToSpaceRoute(null, [], context);
}
}
@ -2390,7 +2390,7 @@ class ChatController extends State<ChatPageWithRoom>
);
}
NavigationUtil.goToSpaceRoute('/rooms', context);
NavigationUtil.goToSpaceRoute(null, [], context);
}
Future<void> requestRegeneration(String eventId) async {

View file

@ -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#

View file

@ -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,
);
}

View file

@ -360,7 +360,7 @@ class ChatDetailsController extends State<ChatDetails>
);
if (resp.isError || resp.result == null || !mounted) return;
NavigationUtil.goToSpaceRoute('/rooms/${resp.result}/invite', context);
NavigationUtil.goToSpaceRoute(resp.result, ['invite'], context);
}
Future<void> _loadCourseInfo() async {

View file

@ -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<ChatList>
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<ChatList>
}
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<ChatList>
// #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<ChatList>
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;
},

View file

@ -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#
),

View file

@ -32,7 +32,8 @@ class ActivitySessionPopupMenuState extends State<ActivitySessionPopupMenu>
break;
case ActivityPopupMenuActions.invite:
NavigationUtil.goToSpaceRoute(
'/rooms/${widget.room.id}/invite',
widget.room.id,
['invite'],
context,
);
break;

View file

@ -379,7 +379,8 @@ class ActivitySessionStartController extends State<ActivitySessionStartPage>
}
NavigationUtil.goToSpaceRoute(
"/rooms/${widget.roomId}",
widget.roomId,
[],
context,
);
}
@ -409,7 +410,8 @@ class ActivitySessionStartController extends State<ActivitySessionStartPage>
if (!resp.isError) {
NavigationUtil.goToSpaceRoute(
"/rooms/${resp.result}",
resp.result,
[],
context,
);
}
@ -456,7 +458,7 @@ class ActivitySessionStartController extends State<ActivitySessionStartPage>
Future<void> 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<ActivitySessionStartPage>
);
if (!resp.isError) {
NavigationUtil.goToSpaceRoute("/rooms/$roomId", context);
NavigationUtil.goToSpaceRoute(roomId, [], context);
}
}

View file

@ -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,
);
}

View file

@ -98,7 +98,8 @@ class PublicRoomBottomSheetState extends State<PublicRoomBottomSheet> {
void _goToRoom(String roomID) {
if (chunk?.roomType != 'm.space' && !client.getRoomById(roomID)!.isSpace) {
NavigationUtil.goToSpaceRoute(
"/rooms/$roomID",
roomID,
[],
context,
);
} else {

View file

@ -72,7 +72,8 @@ class ChatDetailsButtonRowState extends State<ChatDetailsButtonRow> {
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<ChatDetailsButtonRow> {
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<ChatDetailsButtonRow> {
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<ChatDetailsButtonRow> {
future: room.delete,
);
if (resp.isError) return;
NavigationUtil.goToSpaceRoute("/rooms", context);
NavigationUtil.goToSpaceRoute(null, [], context);
},
enabled: room.isRoomAdmin,
visible: !room.isDirectChat,

View file

@ -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,

View file

@ -72,8 +72,7 @@ class PangeaInvitationSelectionView extends StatelessWidget {
),
],
),
onPressed: () =>
NavigationUtil.goToSpaceRoute('/rooms/${room.id}', context),
onPressed: () => NavigationUtil.goToSpaceRoute(room.id, [], context),
);
return Scaffold(

View file

@ -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(

View file

@ -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;

View file

@ -391,9 +391,8 @@ class CourseChatsController extends State<CourseChats>
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<CourseChats>
}
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 {

View file

@ -4,28 +4,70 @@ import 'package:go_router/go_router.dart';
class NavigationUtil {
static void goToSpaceRoute(
String route,
String? goalRoomID,
List<String> goalSubroute,
BuildContext context, {
Object? extra,
Map<String, String>? 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,
);
}
}