diff --git a/lib/pangea/chat_settings/pages/space_details_content.dart b/lib/pangea/chat_settings/pages/space_details_content.dart index 54f2b92e9..6a4db73b4 100644 --- a/lib/pangea/chat_settings/pages/space_details_content.dart +++ b/lib/pangea/chat_settings/pages/space_details_content.dart @@ -254,16 +254,7 @@ class SpaceDetailsContent extends StatelessWidget { Icons.delete_outline, size: 30.0, ), - onPressed: () async { - final resp = await showDialog( - context: context, - builder: (_) => DeleteSpaceDialog(space: room), - ); - - if (resp == true) { - context.go("/rooms"); - } - }, + onPressed: () => DeleteSpaceDialog.show(room, context), enabled: room.isRoomAdmin, 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 bd230f37f..38667768b 100644 --- a/lib/pangea/chat_settings/widgets/chat_context_menu_action.dart +++ b/lib/pangea/chat_settings/widgets/chat_context_menu_action.dart @@ -269,13 +269,7 @@ void chatContextMenuAction( return; case ChatContextAction.delete: if (room.isSpace) { - final resp = await showDialog( - context: context, - builder: (_) => DeleteSpaceDialog(space: room), - ); - if (resp == true) { - context.go("/rooms"); - } + await DeleteSpaceDialog.show(room, context); } else { final confirmed = await showOkCancelAlertDialog( context: context, diff --git a/lib/pangea/chat_settings/widgets/delete_space_dialog.dart b/lib/pangea/chat_settings/widgets/delete_space_dialog.dart index 4194762ca..2b16d1d17 100644 --- a/lib/pangea/chat_settings/widgets/delete_space_dialog.dart +++ b/lib/pangea/chat_settings/widgets/delete_space_dialog.dart @@ -1,5 +1,6 @@ import 'package:flutter/material.dart'; +import 'package:go_router/go_router.dart'; import 'package:matrix/matrix.dart'; import 'package:fluffychat/config/themes.dart'; @@ -9,6 +10,7 @@ import 'package:fluffychat/pangea/chat_settings/utils/delete_room.dart'; import 'package:fluffychat/pangea/common/utils/error_handler.dart'; import 'package:fluffychat/pangea/common/widgets/error_indicator.dart'; import 'package:fluffychat/pangea/extensions/pangea_room_extension.dart'; +import 'package:fluffychat/widgets/future_loading_dialog.dart'; class DeleteSpaceDialog extends StatefulWidget { final Room space; @@ -17,6 +19,48 @@ class DeleteSpaceDialog extends StatefulWidget { required this.space, }); + static Future show( + Room room, + BuildContext context, + ) async { + final resp = await showDialog?>( + context: context, + builder: (_) => DeleteSpaceDialog(space: room), + ); + if (resp == null) return; + final result = await showFutureLoadingDialog( + context: context, + future: () => _deleteSpace(room, resp), + ); + + if (!result.isError) { + context.go("/rooms"); + } + } + + static Future _deleteSpace( + Room space, + List rooms, + ) async { + final List> futures = []; + for (final room in rooms) { + final roomInstance = space.client.getRoomById(room.roomId); + if (roomInstance != null) { + // Niether delete not leave activities the user has archived, + // since they're hidden in the main chat UI. + if (roomInstance.isActivitySession) { + if (!roomInstance.hasArchivedActivity) { + futures.add(roomInstance.leave()); + } + } else { + futures.add(roomInstance.delete()); + } + } + } + await Future.wait(futures); + await space.delete(); + } + @override State createState() => DeleteSpaceDialogState(); } @@ -28,7 +72,7 @@ class DeleteSpaceDialogState extends State { bool _loadingRooms = true; String? _roomLoadError; - bool _deleting = false; + final bool _deleting = false; String? _deleteError; @override @@ -99,49 +143,6 @@ class DeleteSpaceDialogState extends State { }).toList(); } - Future _deleteSpace() async { - setState(() { - _deleting = true; - _deleteError = null; - }); - - try { - final List> futures = []; - for (final room in _roomsToDelete) { - final roomInstance = widget.space.client.getRoomById(room.roomId); - if (roomInstance != null) { - // Niether delete not leave activities the user has archived, - // since they're hidden in the main chat UI. - if (roomInstance.isActivitySession) { - if (!roomInstance.hasArchivedActivity) { - futures.add(roomInstance.leave()); - } - } else { - futures.add(roomInstance.delete()); - } - } - } - await Future.wait(futures); - await widget.space.delete(); - Navigator.of(context).pop(true); - } catch (e, s) { - _deleteError = L10n.of(context).oopsSomethingWentWrong; - ErrorHandler.logError( - e: e, - s: s, - data: { - "roomID": widget.space.id, - }, - ); - } finally { - if (mounted) { - setState(() { - _deleting = false; - }); - } - } - } - @override Widget build(BuildContext context) { return Dialog( @@ -271,7 +272,8 @@ class DeleteSpaceDialogState extends State { AnimatedSize( duration: FluffyThemes.animationDuration, child: OutlinedButton( - onPressed: _deleting ? null : _deleteSpace, + onPressed: () => + Navigator.of(context).pop(_roomsToDelete), style: OutlinedButton.styleFrom( foregroundColor: Theme.of(context).colorScheme.error, side: BorderSide(