fix: don't double space ID on navigation (#5163)
This commit is contained in:
parent
0f80e9349f
commit
1f9f2ab24a
17 changed files with 113 additions and 71 deletions
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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#
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
},
|
||||
|
|
|
|||
|
|
@ -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#
|
||||
),
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
);
|
||||
}
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
|
|
|
|||
|
|
@ -72,8 +72,7 @@ class PangeaInvitationSelectionView extends StatelessWidget {
|
|||
),
|
||||
],
|
||||
),
|
||||
onPressed: () =>
|
||||
NavigationUtil.goToSpaceRoute('/rooms/${room.id}', context),
|
||||
onPressed: () => NavigationUtil.goToSpaceRoute(room.id, [], context),
|
||||
);
|
||||
|
||||
return Scaffold(
|
||||
|
|
|
|||
|
|
@ -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(
|
||||
|
|
|
|||
|
|
@ -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;
|
||||
|
|
|
|||
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Reference in a new issue