From ce46de9e73881fd6812141927e157b1a84ab9100 Mon Sep 17 00:00:00 2001 From: sherlockvn Date: Mon, 16 Jan 2023 17:04:23 +0700 Subject: [PATCH] TF-1194 create new default identity: update identites controller and identity_creator controller --- .../identity_creator_controller.dart | 60 ++++++++++++------- .../identities/identities_controller.dart | 60 ++++++++++++++++--- 2 files changed, 90 insertions(+), 30 deletions(-) diff --git a/lib/features/identity_creator/presentation/identity_creator_controller.dart b/lib/features/identity_creator/presentation/identity_creator_controller.dart index e64f34700..2a5371ad7 100644 --- a/lib/features/identity_creator/presentation/identity_creator_controller.dart +++ b/lib/features/identity_creator/presentation/identity_creator_controller.dart @@ -3,18 +3,23 @@ import 'package:core/utils/app_logger.dart'; import 'package:core/utils/build_utils.dart'; import 'package:enough_html_editor/enough_html_editor.dart'; import 'package:flutter/cupertino.dart'; -import 'package:get/get.dart'; +import 'package:flutter/services.dart'; +import 'package:get/get_core/get_core.dart'; +import 'package:get/get_instance/get_instance.dart'; +import 'package:get/get_rx/get_rx.dart'; import 'package:html_editor_enhanced/html_editor.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/core/id.dart'; import 'package:jmap_dart_client/jmap/core/properties/properties.dart'; +import 'package:jmap_dart_client/jmap/core/unsigned_int.dart'; import 'package:jmap_dart_client/jmap/identities/identity.dart'; import 'package:jmap_dart_client/jmap/mail/email/email_address.dart'; -import 'package:model/extensions/email_address_extension.dart'; -import 'package:model/extensions/identity_extension.dart'; -import 'package:model/user/user_profile.dart'; +import 'package:model/model.dart'; import 'package:rich_text_composer/richtext_controller.dart'; import 'package:tmail_ui_user/features/base/base_controller.dart'; +import 'package:tmail_ui_user/features/composer/presentation/controller/rich_text_mobile_tablet_controller.dart'; +import 'package:tmail_ui_user/features/composer/presentation/controller/rich_text_web_controller.dart'; +import 'package:tmail_ui_user/features/identity_creator/presentation/identity_creator_bindings.dart'; import 'package:tmail_ui_user/features/identity_creator/presentation/model/identity_creator_arguments.dart'; import 'package:tmail_ui_user/features/identity_creator/presentation/model/signature_type.dart'; import 'package:tmail_ui_user/features/mailbox_creator/domain/model/verification/email_address_validator.dart'; @@ -49,8 +54,13 @@ class IdentityCreatorController extends BaseController { final replyToOfIdentity = Rxn(); final bccOfIdentity = Rxn(); final actionType = IdentityActionType.create.obs; + final isDefaultIdentity = RxBool(false); + final htmlEditorNode = FocusNode(debugLabel: 'html_editor'); + final identityCreatorBinding = IdentityCreatorBindings(); late RichTextController keyboardRichTextController; + late RichTextWebController richTextWebController; + late RichTextMobileTabletController richTextMobileTabletController; late HtmlEditorController signatureHtmlEditorController; TextEditingController? signaturePlainEditorController; TextEditingController? inputNameIdentityController; @@ -88,7 +98,10 @@ class IdentityCreatorController extends BaseController { void onInit() { super.onInit(); keyboardRichTextController = RichTextController(); - signatureHtmlEditorController = HtmlEditorController(processNewLineAsBr: true); + richTextWebController = RichTextWebController(); + richTextMobileTabletController = RichTextMobileTabletController(); + signatureHtmlEditorController = + HtmlEditorController(processNewLineAsBr: true); signaturePlainEditorController = TextEditingController(); inputNameIdentityController = TextEditingController(); inputBccIdentityController = TextEditingController(); @@ -158,13 +171,12 @@ class IdentityCreatorController extends BaseController { void _getALlIdentitiesSuccess(GetAllIdentitiesSuccess success) { if (success.identities?.isNotEmpty == true) { - listEmailAddressDefault.value = success.identities - !.map((identity) => identity.toEmailAddressNoName()) + listEmailAddressDefault.value = success.identities! + .map((identity) => identity.toEmailAddressNoName()) .toSet() .toList(); listEmailAddressOfReplyTo.add(noneEmailAddress); listEmailAddressOfReplyTo.addAll(listEmailAddressDefault); - _setUpAllFieldEmailAddress(); } else { _setDefaultEmailAddressList(); @@ -286,21 +298,28 @@ class IdentityCreatorController extends BaseController { ? {replyToOfIdentity.value!} : {}; + final sortOrder = isDefaultIdentity.value ? UnsignedInt(0) : null; + final newIdentity = Identity( name: _nameIdentity, email: emailOfIdentity.value?.email, replyTo: replyToAddress, bcc: bccAddress, textSignature: Signature(signaturePlainText), - htmlSignature: Signature(signatureHtmlText ?? '')); + htmlSignature: Signature(signatureHtmlText ?? ''), + sortOrder: sortOrder); final generateCreateId = Id(_uuid.v1()); if (actionType.value == IdentityActionType.create) { - final identityRequest = CreateNewIdentityRequest(generateCreateId, newIdentity); + final identityRequest = CreateNewIdentityRequest( + generateCreateId, + newIdentity, + isDefaultIdentity: isDefaultIdentity.value + ); + _disposeWidget(); if (BuildUtils.isWeb) { - _disposeWidget(); onCreatedIdentityCallback?.call(identityRequest); } else { popBack(result: identityRequest); @@ -318,6 +337,11 @@ class IdentityCreatorController extends BaseController { popBack(result: identityRequest); } } + identityCreatorBinding.dispose(); + } + + void onCheckboxChanged() { + isDefaultIdentity.value = !isDefaultIdentity.value; } String? _getErrorInputNameString(BuildContext context) { @@ -364,12 +388,6 @@ class IdentityCreatorController extends BaseController { } } - void _clearAll() { - signaturePlainEditorController?.clear(); - inputNameIdentityController?.clear(); - inputBccIdentityController?.clear(); - } - List getSuggestionEmailAddress(String? pattern) { if (pattern == null || pattern.isEmpty) { return List.empty(); @@ -382,19 +400,19 @@ class IdentityCreatorController extends BaseController { void clearFocusEditor(BuildContext context) { if (!BuildUtils.isWeb) { signatureHtmlEditorMobileController?.unfocus(); + richTextMobileTabletController.htmlEditorApi?.unfocus(); + keyboardRichTextController.hideRichTextView(); } - FocusScope.of(context).unfocus(); + SystemChannels.textInput.invokeMethod('TextInput.hide'); } void closeView(BuildContext context) { - _clearAll(); - clearFocusEditor(context); - if (BuildUtils.isWeb) { _disposeWidget(); onDismissIdentityCreator?.call(); } else { popBack(); + identityCreatorBinding.dispose(); } } diff --git a/lib/features/manage_account/presentation/profiles/identities/identities_controller.dart b/lib/features/manage_account/presentation/profiles/identities/identities_controller.dart index b2b11cebd..e2c464dc4 100644 --- a/lib/features/manage_account/presentation/profiles/identities/identities_controller.dart +++ b/lib/features/manage_account/presentation/profiles/identities/identities_controller.dart @@ -13,13 +13,17 @@ import 'package:get/get.dart'; import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/identities/identity.dart'; import 'package:tmail_ui_user/features/base/base_controller.dart'; +import 'package:tmail_ui_user/features/identity_creator/presentation/identity_creator_bindings.dart'; +import 'package:tmail_ui_user/features/identity_creator/presentation/identity_creator_view.dart'; import 'package:tmail_ui_user/features/identity_creator/presentation/model/identity_creator_arguments.dart'; import 'package:tmail_ui_user/features/manage_account/domain/model/create_new_identity_request.dart'; import 'package:tmail_ui_user/features/manage_account/domain/model/edit_identity_request.dart'; +import 'package:tmail_ui_user/features/manage_account/domain/state/create_new_default_identity_state.dart'; import 'package:tmail_ui_user/features/manage_account/domain/state/create_new_identity_state.dart'; import 'package:tmail_ui_user/features/manage_account/domain/state/delete_identity_state.dart'; import 'package:tmail_ui_user/features/manage_account/domain/state/edit_identity_state.dart'; import 'package:tmail_ui_user/features/manage_account/domain/state/get_all_identities_state.dart'; +import 'package:tmail_ui_user/features/manage_account/domain/usecases/create_new_default_identity_interactor.dart'; import 'package:tmail_ui_user/features/manage_account/domain/usecases/create_new_identity_interactor.dart'; import 'package:tmail_ui_user/features/manage_account/domain/usecases/delete_identity_interactor.dart'; import 'package:tmail_ui_user/features/manage_account/domain/usecases/edit_identity_interactor.dart'; @@ -28,7 +32,6 @@ import 'package:tmail_ui_user/features/manage_account/presentation/manage_accoun import 'package:tmail_ui_user/features/manage_account/presentation/model/identity_action_type.dart'; import 'package:tmail_ui_user/features/manage_account/presentation/model/settings_page_level.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; -import 'package:tmail_ui_user/main/routes/app_routes.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart'; class IdentitiesController extends BaseController { @@ -37,9 +40,11 @@ class IdentitiesController extends BaseController { final _appToast = Get.find(); final _imagePaths = Get.find(); final _responsiveUtils = Get.find(); + final _identityCreatorBindings = IdentityCreatorBindings(); final GetAllIdentitiesInteractor _getAllIdentitiesInteractor; final CreateNewIdentityInteractor _createNewIdentityInteractor; + final CreateNewDefaultIdentityInteractor _createNewDefaultIdentityInteractor; final DeleteIdentityInteractor _deleteIdentityInteractor; final EditIdentityInteractor _editIdentityInteractor; @@ -53,6 +58,7 @@ class IdentitiesController extends BaseController { this._deleteIdentityInteractor, this._createNewIdentityInteractor, this._editIdentityInteractor, + this._createNewDefaultIdentityInteractor ); @override @@ -80,6 +86,8 @@ class IdentitiesController extends BaseController { _handleGetAllIdentitiesSuccess(success); } else if (success is CreateNewIdentitySuccess) { _createNewIdentitySuccess(success); + } else if (success is CreateNewDefaultIdentitySuccess) { + _createNewDefaultIdentitySuccess(success); } else if (success is DeleteIdentitySuccess) { _deleteIdentitySuccess(success); } else if (success is EditIdentitySuccess) { @@ -154,9 +162,8 @@ class IdentitiesController extends BaseController { } }); } else { - final newIdentityArguments = await push( - AppRoutes.identityCreator, - arguments: arguments); + final newIdentityArguments = + await _getIdentityRequest(context, arguments); if (newIdentityArguments is CreateNewIdentityRequest) { _createNewIdentityAction(accountId, newIdentityArguments); @@ -167,8 +174,34 @@ class IdentitiesController extends BaseController { } } - void _createNewIdentityAction(AccountId accountId, CreateNewIdentityRequest identityRequest) async { - consumeState(_createNewIdentityInteractor.execute(accountId, identityRequest)); + Future _getIdentityRequest( + BuildContext context, + dynamic arguments + ) async { + return await showModalBottomSheet( + enableDrag: false, + context: context, + isScrollControlled: true, + shape: const RoundedRectangleBorder( + borderRadius: BorderRadius.only( + topLeft: Radius.circular(16.0), + topRight: Radius.circular(16.0)), + ), + builder: (context) { + _identityCreatorBindings.dependencies(); + return IdentityCreatorView.fromArguments(arguments); + }); + } + + void _createNewIdentityAction( + AccountId accountId, + CreateNewIdentityRequest identityRequest + ) async { + if (identityRequest.isDefaultIdentity) { + consumeState(_createNewDefaultIdentityInteractor.execute(accountId, identityRequest)); + } else { + consumeState(_createNewIdentityInteractor.execute(accountId, identityRequest)); + } } void _createNewIdentitySuccess(CreateNewIdentitySuccess success) { @@ -182,6 +215,17 @@ class IdentitiesController extends BaseController { _refreshAllIdentities(); } + void _createNewDefaultIdentitySuccess(CreateNewDefaultIdentitySuccess success) { + if (currentOverlayContext != null && currentContext != null) { + _appToast.showToastWithIcon( + currentOverlayContext!, + message: AppLocalizations.of(currentContext!).you_have_created_a_new_default_identity, + icon: _imagePaths.icSelected); + } + + _refreshAllIdentities(); + } + void openConfirmationDialogDeleteIdentityAction(BuildContext context, Identity identity) { if (_responsiveUtils.isScreenWithShortestSide(context)) { (ConfirmationDialogActionSheetBuilder(context) @@ -294,9 +338,7 @@ class IdentitiesController extends BaseController { } }); } else { - final newIdentityArguments = await push( - AppRoutes.identityCreator, - arguments: arguments); + final newIdentityArguments = await _getIdentityRequest(context, arguments); if (newIdentityArguments is CreateNewIdentityRequest) { _createNewIdentityAction(accountId, newIdentityArguments);