4860 dms all chats (#5015)

* feat: initial work for dms => all chats

* more navigation updates

* change all chats tooltip
This commit is contained in:
ggurdin 2025-12-31 14:05:16 -05:00 committed by GitHub
parent bba33b3a21
commit 2e0d38e801
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
20 changed files with 188 additions and 125 deletions

View file

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

View file

@ -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<ChatPageWithRoom>
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<ChatPageWithRoom>
s: StackTrace.current,
data: {"roomId": roomId},
);
context.go("/rooms");
NavigationUtil.goToSpaceRoute('/rooms', context);
}
}
@ -2339,7 +2343,6 @@ class ChatController extends State<ChatPageWithRoom>
}
Future<void> 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<ChatPageWithRoom>
);
}
context.go(
parentSpaceId != null ? '/rooms/spaces/$parentSpaceId' : '/rooms',
);
NavigationUtil.goToSpaceRoute('/rooms', context);
}
Future<void> requestRegeneration(String eventId) async {

View file

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

View file

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

View file

@ -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<ChatDetails>
);
if (resp.isError || resp.result == null || !mounted) return;
context.go('/rooms/${resp.result}/invite');
NavigationUtil.goToSpaceRoute('/rooms/${resp.result}/invite', context);
}
Future<void> _loadCourseInfo() async {

View file

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

View file

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

View file

@ -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<ActivitySessionPopupMenu>
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:

View file

@ -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<ActivitySessionStartPage>
}
}
context.go("/rooms/spaces/${widget.parentId}/${widget.roomId}");
NavigationUtil.goToSpaceRoute(
"/rooms/${widget.roomId}",
context,
);
}
Future<void> confirmRoleSelection() async {
@ -404,7 +408,10 @@ class ActivitySessionStartController extends State<ActivitySessionStartPage>
);
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<ActivitySessionStartPage>
Future<void> 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<ActivitySessionStartPage>
);
if (!resp.isError) {
widget.parentId != null
? context.go("/rooms/spaces/${widget.parentId}/$roomId")
: context.go("/rooms/$roomId");
NavigationUtil.goToSpaceRoute("/rooms/$roomId", context);
}
}

View file

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

View file

@ -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<PublicRoomBottomSheet> {
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');
}

View file

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

View file

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

View file

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

View file

@ -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) {

View file

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

View file

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

View file

@ -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<CourseChats>
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<CourseChats>
}
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 {

View file

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

View file

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