diff --git a/lib/features/labels/domain/model/open_edit_label_modal_params.dart b/lib/features/labels/domain/model/open_edit_label_modal_params.dart index 6b46c8737..753ba01d7 100644 --- a/lib/features/labels/domain/model/open_edit_label_modal_params.dart +++ b/lib/features/labels/domain/model/open_edit_label_modal_params.dart @@ -1,31 +1,19 @@ import 'package:equatable/equatable.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:labels/model/label.dart'; -import 'package:tmail_ui_user/features/labels/domain/usecases/create_new_label_interactor.dart'; -import 'package:tmail_ui_user/features/labels/domain/usecases/edit_label_interactor.dart'; -import 'package:tmail_ui_user/features/mailbox_creator/domain/usecases/verify_name_interactor.dart'; class OpenEditLabelModalParams with EquatableMixin { final Label selectedLabel; - final AccountId accountId; - final VerifyNameInteractor verifyNameInteractor; - final CreateNewLabelInteractor createNewLabelInteractor; - final EditLabelInteractor editLabelInteractor; + final AccountId? accountId; const OpenEditLabelModalParams({ required this.selectedLabel, required this.accountId, - required this.verifyNameInteractor, - required this.createNewLabelInteractor, - required this.editLabelInteractor, }); @override List get props => [ selectedLabel, accountId, - verifyNameInteractor, - createNewLabelInteractor, - editLabelInteractor, ]; } diff --git a/lib/features/labels/presentation/delegates/add_list_label_to_list_emails_delegate.dart b/lib/features/labels/presentation/delegates/add_list_label_to_list_emails_delegate.dart index ed46ef018..e177097ab 100644 --- a/lib/features/labels/presentation/delegates/add_list_label_to_list_emails_delegate.dart +++ b/lib/features/labels/presentation/delegates/add_list_label_to_list_emails_delegate.dart @@ -41,6 +41,8 @@ class AddListLabelToListEmailsDelegate extends BaseController { ); }, imagePaths: imagePaths, + onCreateALabelAction: () => _labelController.onCreateALabelAction( + accountId: _labelController.accountId, hasResult: true), ), dialogLabel: 'choose-label-modal', ); diff --git a/lib/features/labels/presentation/extensions/handle_label_action_type_extension.dart b/lib/features/labels/presentation/extensions/handle_label_action_type_extension.dart index 70380b682..b78971b5b 100644 --- a/lib/features/labels/presentation/extensions/handle_label_action_type_extension.dart +++ b/lib/features/labels/presentation/extensions/handle_label_action_type_extension.dart @@ -9,12 +9,9 @@ import 'package:tmail_ui_user/features/home/data/exceptions/session_exceptions.d import 'package:tmail_ui_user/features/labels/domain/model/open_edit_label_modal_params.dart'; import 'package:tmail_ui_user/features/labels/domain/state/delete_a_label_state.dart'; import 'package:tmail_ui_user/features/labels/domain/state/edit_label_state.dart'; -import 'package:tmail_ui_user/features/labels/domain/usecases/create_new_label_interactor.dart'; -import 'package:tmail_ui_user/features/labels/domain/usecases/edit_label_interactor.dart'; import 'package:tmail_ui_user/features/labels/presentation/label_controller.dart'; import 'package:tmail_ui_user/features/labels/presentation/models/label_action_type.dart'; import 'package:tmail_ui_user/features/labels/presentation/widgets/create_new_label_modal.dart'; -import 'package:tmail_ui_user/features/mailbox_creator/domain/usecases/verify_name_interactor.dart'; import 'package:tmail_ui_user/main/exceptions/logic_exception.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart'; @@ -48,31 +45,10 @@ extension HandleLabelActionTypeExtension on LabelController { required AccountId? accountId, required Label label, }) async { - final createNewLabelInteractor = getBinding(); - final editLabelInteractor = getBinding(); - final verifyNameInteractor = getBinding(); - - final isInteractorsInitialized = createNewLabelInteractor != null && - editLabelInteractor != null && - verifyNameInteractor != null; - - if (!isInteractorsInitialized) { - _handleEditLabelFailure(EditLabelFailure(const InteractorNotInitialized())); - return; - } - - if (accountId == null) { - _handleEditLabelFailure(EditLabelFailure(NotFoundAccountIdException())); - return; - } - final resultState = await openEditLabelModal( params: OpenEditLabelModalParams( selectedLabel: label, accountId: accountId, - verifyNameInteractor: verifyNameInteractor, - createNewLabelInteractor: createNewLabelInteractor, - editLabelInteractor: editLabelInteractor, ), ); @@ -86,10 +62,12 @@ extension HandleLabelActionTypeExtension on LabelController { void _handleEditLabelSuccess(EditLabelSuccess success) { toastManager.showMessageSuccess(success); syncListLabels(success.newLabel); + popBack(); } void _handleEditLabelFailure(EditLabelFailure failure) { toastManager.showMessageFailure(failure); + popBack(); } void syncListLabels(Label newLabel) { diff --git a/lib/features/labels/presentation/label_controller.dart b/lib/features/labels/presentation/label_controller.dart index 30c88be67..2587fd4bb 100644 --- a/lib/features/labels/presentation/label_controller.dart +++ b/lib/features/labels/presentation/label_controller.dart @@ -8,15 +8,12 @@ import 'package:jmap_dart_client/jmap/core/state.dart'; import 'package:labels/labels.dart'; import 'package:model/mailbox/expand_mode.dart'; import 'package:tmail_ui_user/features/base/base_controller.dart'; -import 'package:tmail_ui_user/features/home/data/exceptions/session_exceptions.dart'; import 'package:tmail_ui_user/features/home/domain/extensions/session_extensions.dart'; import 'package:tmail_ui_user/features/labels/domain/model/open_edit_label_modal_params.dart'; import 'package:tmail_ui_user/features/labels/domain/state/create_new_label_state.dart'; import 'package:tmail_ui_user/features/labels/domain/state/delete_a_label_state.dart'; import 'package:tmail_ui_user/features/labels/domain/state/get_all_label_state.dart'; -import 'package:tmail_ui_user/features/labels/domain/usecases/create_new_label_interactor.dart'; import 'package:tmail_ui_user/features/labels/domain/usecases/delete_a_label_interactor.dart'; -import 'package:tmail_ui_user/features/labels/domain/usecases/edit_label_interactor.dart'; import 'package:tmail_ui_user/features/labels/domain/usecases/get_all_label_interactor.dart'; import 'package:tmail_ui_user/features/labels/domain/usecases/get_label_changes_interactor.dart'; import 'package:tmail_ui_user/features/labels/presentation/extensions/handle_label_action_type_extension.dart'; @@ -25,13 +22,11 @@ import 'package:tmail_ui_user/features/labels/presentation/extensions/handle_lab import 'package:tmail_ui_user/features/labels/presentation/label_interactor_bindings.dart'; import 'package:tmail_ui_user/features/labels/presentation/mixin/label_context_menu_mixin.dart'; import 'package:tmail_ui_user/features/labels/presentation/widgets/create_new_label_modal.dart'; -import 'package:tmail_ui_user/features/mailbox_creator/domain/usecases/verify_name_interactor.dart'; import 'package:tmail_ui_user/main/routes/dialog_router.dart'; import 'package:tmail_ui_user/features/manage_account/domain/state/get_label_setting_state.dart'; import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_label_setting_state_interactor.dart'; import 'package:tmail_ui_user/features/push_notification/presentation/websocket/web_socket_queue_handler.dart'; import 'package:tmail_ui_user/main/error/capability_validator.dart'; -import 'package:tmail_ui_user/main/exceptions/logic_exception.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart'; class LabelController extends BaseController @@ -142,10 +137,7 @@ class LabelController extends BaseController } Future openCreateNewLabelModal({ - required AccountId accountId, - required VerifyNameInteractor verifyNameInteractor, - required CreateNewLabelInteractor createNewLabelInteractor, - required EditLabelInteractor editLabelInteractor, + required AccountId? accountId, }) async { return DialogRouter().openDialogModal( child: CreateNewLabelModal( @@ -153,9 +145,6 @@ class LabelController extends BaseController labels: labels, accountId: accountId, imagePaths: imagePaths, - verifyNameInteractor: verifyNameInteractor, - createNewLabelInteractor: createNewLabelInteractor, - editLabelInteractor: editLabelInteractor, ), dialogLabel: 'create-new-label-modal', ); @@ -172,50 +161,28 @@ class LabelController extends BaseController imagePaths: imagePaths, selectedLabel: params.selectedLabel, actionType: LabelActionType.edit, - verifyNameInteractor: params.verifyNameInteractor, - createNewLabelInteractor: params.createNewLabelInteractor, - editLabelInteractor: params.editLabelInteractor, ), dialogLabel: 'edit-label-modal', ); } - Future onCreateALabelAction({ + Future onCreateALabelAction({ required AccountId? accountId, OnLabelActionCallback? onLabelActionCallback, bool shouldPop = false, + bool hasResult = false, }) async { - final createNewLabelInteractor = getBinding(); - final editLabelInteractor = getBinding(); - final verifyNameInteractor = getBinding(); - - final isInteractorsInitialized = createNewLabelInteractor != null && - editLabelInteractor != null && - verifyNameInteractor != null; - - if (!isInteractorsInitialized) { - _handleCreateNewLabelFailure( - failure: CreateNewLabelFailure(const InteractorNotInitialized()), - ); - return; - } - - if (accountId == null) { - _handleCreateNewLabelFailure( - failure: CreateNewLabelFailure(NotFoundAccountIdException()), - ); - return; - } - final resultState = await openCreateNewLabelModal( accountId: accountId, - verifyNameInteractor: verifyNameInteractor, - createNewLabelInteractor: createNewLabelInteractor, - editLabelInteractor: editLabelInteractor, ); if (resultState is CreateNewLabelSuccess) { - _handleCreateNewLabelSuccess( + _addLabelToList(resultState.newLabel); + if (hasResult) { + toastManager.showMessageSuccess(resultState); + return resultState.newLabel; + } + _handleCreateNewLabelSuccessWithoutListUpdate( success: resultState, onLabelActionCallback: onLabelActionCallback, shouldPop: shouldPop, @@ -223,9 +190,11 @@ class LabelController extends BaseController } else if (resultState is CreateNewLabelFailure) { _handleCreateNewLabelFailure(failure: resultState); } + + return null; } - void _handleCreateNewLabelSuccess({ + void _handleCreateNewLabelSuccessWithoutListUpdate({ required CreateNewLabelSuccess success, OnLabelActionCallback? onLabelActionCallback, bool shouldPop = false, @@ -233,7 +202,6 @@ class LabelController extends BaseController if (onLabelActionCallback == null && !shouldPop) { toastManager.showMessageSuccess(success); } - _addLabelToList(success.newLabel); if (onLabelActionCallback != null) { onLabelActionCallback(success.newLabel); } diff --git a/lib/features/labels/presentation/label_interactor_bindings.dart b/lib/features/labels/presentation/label_interactor_bindings.dart index 3d4f35fd1..8e42cfc21 100644 --- a/lib/features/labels/presentation/label_interactor_bindings.dart +++ b/lib/features/labels/presentation/label_interactor_bindings.dart @@ -11,7 +11,6 @@ import 'package:tmail_ui_user/features/labels/domain/usecases/edit_label_interac import 'package:tmail_ui_user/features/labels/domain/usecases/delete_a_label_interactor.dart'; import 'package:tmail_ui_user/features/labels/domain/usecases/get_all_label_interactor.dart'; import 'package:tmail_ui_user/features/labels/domain/usecases/get_label_changes_interactor.dart'; -import 'package:tmail_ui_user/features/mailbox_creator/domain/usecases/verify_name_interactor.dart'; import 'package:tmail_ui_user/main/exceptions/thrower/remote_exception_thrower.dart'; import 'package:uuid/uuid.dart'; @@ -35,11 +34,11 @@ class LabelInteractorBindings extends InteractorsBindings { @override void bindingsInteractor() { Get.lazyPut(() => GetAllLabelInteractor(Get.find())); - Get.lazyPut(() => CreateNewLabelInteractor(Get.find())); - Get.lazyPut(() => EditLabelInteractor(Get.find())); + // Use `fenix: true` to avoid GetX dispose or SmartManagement cleanup when using it in dialogs. + Get.lazyPut(() => CreateNewLabelInteractor(Get.find()), fenix: true); + Get.lazyPut(() => EditLabelInteractor(Get.find()), fenix: true); Get.lazyPut(() => DeleteALabelInteractor(Get.find())); Get.lazyPut(() => GetLabelChangesInteractor(Get.find())); - Get.lazyPut(() => VerifyNameInteractor()); } @override diff --git a/lib/features/labels/presentation/widgets/choose_label_modal.dart b/lib/features/labels/presentation/widgets/choose_label_modal.dart index df4d6f073..01483fb16 100644 --- a/lib/features/labels/presentation/widgets/choose_label_modal.dart +++ b/lib/features/labels/presentation/widgets/choose_label_modal.dart @@ -12,17 +12,20 @@ import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart'; typedef OnLabelAsToEmailsAction = Function(List