diff --git a/lib/pages/chat/chat.dart b/lib/pages/chat/chat.dart index 2bd931879..72e755afd 100644 --- a/lib/pages/chat/chat.dart +++ b/lib/pages/chat/chat.dart @@ -232,8 +232,7 @@ class ChatController extends State void archiveChat() async { final success = await showFutureLoadingDialog( context: context, - future: room - .leave, // Edit - Add room.archive method in pangea_room_extension.dart + future: room.archive, ); if (success.error != null) return; context.go('/rooms'); diff --git a/lib/pages/chat_details/chat_details_view.dart b/lib/pages/chat_details/chat_details_view.dart index 36b136caa..e8a7e22c4 100644 --- a/lib/pages/chat_details/chat_details_view.dart +++ b/lib/pages/chat_details/chat_details_view.dart @@ -9,7 +9,6 @@ import 'package:fluffychat/pangea/pages/class_settings/p_class_widgets/class_det import 'package:fluffychat/pangea/pages/class_settings/p_class_widgets/class_invitation_buttons.dart'; import 'package:fluffychat/pangea/pages/class_settings/p_class_widgets/class_name_button.dart'; import 'package:fluffychat/pangea/pages/class_settings/p_class_widgets/room_rules_editor.dart'; -import 'package:fluffychat/pangea/utils/archive_space.dart'; import 'package:fluffychat/pangea/utils/lock_room.dart'; import 'package:fluffychat/pangea/widgets/class/add_class_and_invite.dart'; import 'package:fluffychat/pangea/widgets/class/add_space_toggles.dart'; @@ -557,13 +556,10 @@ class ChatDetailsView extends StatelessWidget { context: context, future: () async { room.isSpace - ? await archiveSpace( - // Edit - contents - room, + ? await room.archiveSpace( Matrix.of(context).client, ) - : await room - .leave(); // Edit - archive, not leave + : await room.archive(); }, ); if (success.error == null) { @@ -602,9 +598,7 @@ class ChatDetailsView extends StatelessWidget { context: context, future: () async { room.isSpace - ? await archiveSpace( - // Edit = leaveSpace - room, + ? await room.leaveSpace( Matrix.of(context).client, ) : await room.leave(); diff --git a/lib/pages/chat_list/chat_list.dart b/lib/pages/chat_list/chat_list.dart index c0791c936..ecb878083 100644 --- a/lib/pages/chat_list/chat_list.dart +++ b/lib/pages/chat_list/chat_list.dart @@ -679,6 +679,31 @@ class ChatListController extends State // Pangea# } + // #Pangea + Future leaveAction() async { + final confirmed = await showOkCancelAlertDialog( + useRootNavigator: false, + context: context, + title: L10n.of(context)!.areYouSure, + okLabel: L10n.of(context)!.yes, + cancelLabel: L10n.of(context)!.cancel, + message: L10n.of(context)!.leaveRoomDescription, + ) == + OkCancelResult.ok; + if (!confirmed) return; + final bool leftActiveRoom = + selectedRoomIds.contains(Matrix.of(context).activeRoomId); + await showFutureLoadingDialog( + context: context, + future: () => _leaveSelectedRooms(), + ); + setState(() {}); + if (leftActiveRoom) { + context.go('/rooms'); + } + } + // Pangea# + void dismissStatusList() async { final result = await showOkCancelAlertDialog( title: L10n.of(context)!.hidePresences, @@ -729,16 +754,31 @@ class ChatListController extends State final roomId = selectedRoomIds.first; try { // #Pangea + // await client.getRoomById(roomId)!.leave(); + await client.getRoomById(roomId)!.archive(); + // Pangea# + } finally { + toggleSelection(roomId); + } + } + } + + // #Pangea + Future _leaveSelectedRooms() async { + final client = Matrix.of(context).client; + while (selectedRoomIds.isNotEmpty) { + final roomId = selectedRoomIds.first; + try { if (client.getRoomById(roomId)!.isUnread) { await client.getRoomById(roomId)!.markUnread(false); } - // Pangea# await client.getRoomById(roomId)!.leave(); } finally { toggleSelection(roomId); } } } + // Pangea# Future addToSpace() async { final selectedSpace = await showConfirmationDialog( diff --git a/lib/pages/chat_list/chat_list_header.dart b/lib/pages/chat_list/chat_list_header.dart index ac555cb45..e2e790bf1 100644 --- a/lib/pages/chat_list/chat_list_header.dart +++ b/lib/pages/chat_list/chat_list_header.dart @@ -190,8 +190,7 @@ class ChatListHeader extends StatelessWidget implements PreferredSizeWidget { IconButton( icon: const Icon(Icons.arrow_forward), tooltip: L10n.of(context)!.leave, - onPressed: - controller.archiveAction, // Edit - make leaveAction + onPressed: controller.leaveAction, ), // Pangea# ] diff --git a/lib/pages/chat_list/chat_list_item.dart b/lib/pages/chat_list/chat_list_item.dart index 9775ec624..df27aae21 100644 --- a/lib/pages/chat_list/chat_list_item.dart +++ b/lib/pages/chat_list/chat_list_item.dart @@ -53,11 +53,39 @@ class ChatListItem extends StatelessWidget { message: L10n.of(context)!.archiveRoomDescription, ); if (confirmed == OkCancelResult.cancel) return; - // #Pangea + await showFutureLoadingDialog( + context: context, + // #Pangea + // future: () => room.leave(), + future: () => room.archive(), + // Pangea# + ); + return; + } + } + + // #Pangea + Future leaveAction(BuildContext context) async { + { + if ([Membership.leave, Membership.ban].contains(room.membership)) { + await showFutureLoadingDialog( + context: context, + future: () => room.forget(), + ); + return; + } + final confirmed = await showOkCancelAlertDialog( + useRootNavigator: false, + context: context, + title: L10n.of(context)!.areYouSure, + okLabel: L10n.of(context)!.yes, + cancelLabel: L10n.of(context)!.no, + message: L10n.of(context)!.leaveRoomDescription, + ); + if (confirmed == OkCancelResult.cancel) return; if (room.isUnread) { await room.markUnread(false); } - // Pangea# await showFutureLoadingDialog( context: context, future: () => room.leave(), @@ -65,6 +93,7 @@ class ChatListItem extends StatelessWidget { return; } } + // Pangea# @override Widget build(BuildContext context) { diff --git a/lib/pages/chat_list/space_view.dart b/lib/pages/chat_list/space_view.dart index 9b02845ef..63b1fd897 100644 --- a/lib/pages/chat_list/space_view.dart +++ b/lib/pages/chat_list/space_view.dart @@ -11,7 +11,6 @@ import 'package:fluffychat/pangea/constants/class_default_values.dart'; import 'package:fluffychat/pangea/constants/pangea_room_types.dart'; import 'package:fluffychat/pangea/extensions/pangea_room_extension.dart'; import 'package:fluffychat/pangea/extensions/sync_update_extension.dart'; -import 'package:fluffychat/pangea/utils/archive_space.dart'; import 'package:fluffychat/pangea/utils/chat_list_handle_space_tap.dart'; import 'package:fluffychat/utils/matrix_sdk_extensions/matrix_locals.dart'; import 'package:fluffychat/widgets/avatar.dart'; @@ -283,22 +282,29 @@ class _SpaceViewState extends State { _onJoinSpaceChild(spaceChild!); break; case SpaceChildContextAction.leave: - await showFutureLoadingDialog( - context: context, - // #Pangea - // future: room!.leave, - future: () async { - if (room!.isUnread) { - await room.markUnread(false); - } - await room.leave(); // Edit - use leaveAction? - if (Matrix.of(context).activeRoomId == room.id) { - context.go('/rooms'); - } - }, - // Pangea# - ); + // #Pangea + widget.controller.cancelAction(); + if (room == null) return; + widget.controller.toggleSelection(room.id); + room.isSpace + ? await showFutureLoadingDialog( + context: context, + future: () async { + await room.leaveSpace( + Matrix.of(context).client, + ); + widget.controller.selectedRoomIds.clear(); + }, + ) + : await widget.controller.leaveAction(); + _refresh(); break; + // await showFutureLoadingDialog( + // context: context, + // future: room!.leave, + // ); + // break; + // Pangea# case SpaceChildContextAction.removeFromSpace: await showFutureLoadingDialog( context: context, @@ -306,8 +312,7 @@ class _SpaceViewState extends State { ); break; // #Pangea - case SpaceChildContextAction - .archive: // Edit - change behavior to archive space for all users + case SpaceChildContextAction.archive: widget.controller.cancelAction(); // #Pangea if (room == null) return; @@ -317,8 +322,7 @@ class _SpaceViewState extends State { ? await showFutureLoadingDialog( context: context, future: () async { - await archiveSpace( - room, + await room.archiveSpace( Matrix.of(context).client, ); widget.controller.selectedRoomIds.clear(); diff --git a/lib/pangea/extensions/pangea_room_extension.dart b/lib/pangea/extensions/pangea_room_extension.dart index 4d08f0b62..626615cb4 100644 --- a/lib/pangea/extensions/pangea_room_extension.dart +++ b/lib/pangea/extensions/pangea_room_extension.dart @@ -808,6 +808,43 @@ extension PangeaRoom on Room { ); } + Future archive() async { + final participants = await requestParticipants(); + final students = participants + .where( + (e) => + e.powerLevel < ClassDefaultValues.powerLevelOfAdmin && + e.id != BotName.byEnvironment, + ) + .toList(); + for (final student in students) { + await kick(student.id); + } + if (isUnread) { + await markUnread(false); + } + await leave(); + } + + Future archiveSpace(Client client) async { + final List children = await getChildRooms(); + for (final Room child in children) { + await child.archive(); + } + await archive(); + } + + Future leaveSpace(Client client) async { + final List children = await getChildRooms(); + for (final Room child in children) { + if (child.isUnread) { + await child.markUnread(false); + } + await child.leave(); + } + await leave(); + } + bool canIAddSpaceChild(Room? room) { if (!isSpace) { ErrorHandler.logError( diff --git a/lib/pangea/utils/archive_space.dart b/lib/pangea/utils/archive_space.dart deleted file mode 100644 index ac83980fb..000000000 --- a/lib/pangea/utils/archive_space.dart +++ /dev/null @@ -1,22 +0,0 @@ -import 'package:fluffychat/pangea/extensions/pangea_room_extension.dart'; -import 'package:fluffychat/pangea/utils/error_handler.dart'; -import 'package:matrix/matrix.dart'; - -Future archiveSpace(Room? space, Client client) async { - if (space == null) { - ErrorHandler.logError( - e: 'Tried to archive a space that is null. This should not happen.', - s: StackTrace.current, - ); - return; - } - - final List children = await space.getChildRooms(); - for (final Room child in children) { - if (child.isUnread) { - await child.markUnread(false); - } - await child.leave(); - } - await space.leave(); -} diff --git a/lib/widgets/chat_settings_popup_menu.dart b/lib/widgets/chat_settings_popup_menu.dart index 970879918..fe4a45c44 100644 --- a/lib/widgets/chat_settings_popup_menu.dart +++ b/lib/widgets/chat_settings_popup_menu.dart @@ -191,8 +191,7 @@ class ChatSettingsPopupMenuState extends State { if (confirmed == OkCancelResult.ok) { final success = await showFutureLoadingDialog( context: context, - future: () => - widget.room.leave(), // Edit - archive, not leave + future: () => widget.room.archive(), ); if (success.error == null) { context.go('/rooms');