TF-1194 create new default identity: update identites controller and identity_creator controller

This commit is contained in:
sherlockvn
2023-01-16 17:04:23 +07:00
committed by Dat Vu
parent bf8005927e
commit ce46de9e73
2 changed files with 90 additions and 30 deletions
@@ -3,18 +3,23 @@ import 'package:core/utils/app_logger.dart';
import 'package:core/utils/build_utils.dart'; import 'package:core/utils/build_utils.dart';
import 'package:enough_html_editor/enough_html_editor.dart'; import 'package:enough_html_editor/enough_html_editor.dart';
import 'package:flutter/cupertino.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:html_editor_enhanced/html_editor.dart';
import 'package:jmap_dart_client/jmap/account_id.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/id.dart';
import 'package:jmap_dart_client/jmap/core/properties/properties.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/identities/identity.dart';
import 'package:jmap_dart_client/jmap/mail/email/email_address.dart'; import 'package:jmap_dart_client/jmap/mail/email/email_address.dart';
import 'package:model/extensions/email_address_extension.dart'; import 'package:model/model.dart';
import 'package:model/extensions/identity_extension.dart';
import 'package:model/user/user_profile.dart';
import 'package:rich_text_composer/richtext_controller.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/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/identity_creator_arguments.dart';
import 'package:tmail_ui_user/features/identity_creator/presentation/model/signature_type.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'; 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<EmailAddress>(); final replyToOfIdentity = Rxn<EmailAddress>();
final bccOfIdentity = Rxn<EmailAddress>(); final bccOfIdentity = Rxn<EmailAddress>();
final actionType = IdentityActionType.create.obs; final actionType = IdentityActionType.create.obs;
final isDefaultIdentity = RxBool(false);
final htmlEditorNode = FocusNode(debugLabel: 'html_editor');
final identityCreatorBinding = IdentityCreatorBindings();
late RichTextController keyboardRichTextController; late RichTextController keyboardRichTextController;
late RichTextWebController richTextWebController;
late RichTextMobileTabletController richTextMobileTabletController;
late HtmlEditorController signatureHtmlEditorController; late HtmlEditorController signatureHtmlEditorController;
TextEditingController? signaturePlainEditorController; TextEditingController? signaturePlainEditorController;
TextEditingController? inputNameIdentityController; TextEditingController? inputNameIdentityController;
@@ -88,7 +98,10 @@ class IdentityCreatorController extends BaseController {
void onInit() { void onInit() {
super.onInit(); super.onInit();
keyboardRichTextController = RichTextController(); keyboardRichTextController = RichTextController();
signatureHtmlEditorController = HtmlEditorController(processNewLineAsBr: true); richTextWebController = RichTextWebController();
richTextMobileTabletController = RichTextMobileTabletController();
signatureHtmlEditorController =
HtmlEditorController(processNewLineAsBr: true);
signaturePlainEditorController = TextEditingController(); signaturePlainEditorController = TextEditingController();
inputNameIdentityController = TextEditingController(); inputNameIdentityController = TextEditingController();
inputBccIdentityController = TextEditingController(); inputBccIdentityController = TextEditingController();
@@ -158,13 +171,12 @@ class IdentityCreatorController extends BaseController {
void _getALlIdentitiesSuccess(GetAllIdentitiesSuccess success) { void _getALlIdentitiesSuccess(GetAllIdentitiesSuccess success) {
if (success.identities?.isNotEmpty == true) { if (success.identities?.isNotEmpty == true) {
listEmailAddressDefault.value = success.identities listEmailAddressDefault.value = success.identities!
!.map((identity) => identity.toEmailAddressNoName()) .map((identity) => identity.toEmailAddressNoName())
.toSet() .toSet()
.toList(); .toList();
listEmailAddressOfReplyTo.add(noneEmailAddress); listEmailAddressOfReplyTo.add(noneEmailAddress);
listEmailAddressOfReplyTo.addAll(listEmailAddressDefault); listEmailAddressOfReplyTo.addAll(listEmailAddressDefault);
_setUpAllFieldEmailAddress(); _setUpAllFieldEmailAddress();
} else { } else {
_setDefaultEmailAddressList(); _setDefaultEmailAddressList();
@@ -286,21 +298,28 @@ class IdentityCreatorController extends BaseController {
? {replyToOfIdentity.value!} ? {replyToOfIdentity.value!}
: <EmailAddress>{}; : <EmailAddress>{};
final sortOrder = isDefaultIdentity.value ? UnsignedInt(0) : null;
final newIdentity = Identity( final newIdentity = Identity(
name: _nameIdentity, name: _nameIdentity,
email: emailOfIdentity.value?.email, email: emailOfIdentity.value?.email,
replyTo: replyToAddress, replyTo: replyToAddress,
bcc: bccAddress, bcc: bccAddress,
textSignature: Signature(signaturePlainText), textSignature: Signature(signaturePlainText),
htmlSignature: Signature(signatureHtmlText ?? '')); htmlSignature: Signature(signatureHtmlText ?? ''),
sortOrder: sortOrder);
final generateCreateId = Id(_uuid.v1()); final generateCreateId = Id(_uuid.v1());
if (actionType.value == IdentityActionType.create) { if (actionType.value == IdentityActionType.create) {
final identityRequest = CreateNewIdentityRequest(generateCreateId, newIdentity); final identityRequest = CreateNewIdentityRequest(
generateCreateId,
newIdentity,
isDefaultIdentity: isDefaultIdentity.value
);
_disposeWidget();
if (BuildUtils.isWeb) { if (BuildUtils.isWeb) {
_disposeWidget();
onCreatedIdentityCallback?.call(identityRequest); onCreatedIdentityCallback?.call(identityRequest);
} else { } else {
popBack(result: identityRequest); popBack(result: identityRequest);
@@ -318,6 +337,11 @@ class IdentityCreatorController extends BaseController {
popBack(result: identityRequest); popBack(result: identityRequest);
} }
} }
identityCreatorBinding.dispose();
}
void onCheckboxChanged() {
isDefaultIdentity.value = !isDefaultIdentity.value;
} }
String? _getErrorInputNameString(BuildContext context) { String? _getErrorInputNameString(BuildContext context) {
@@ -364,12 +388,6 @@ class IdentityCreatorController extends BaseController {
} }
} }
void _clearAll() {
signaturePlainEditorController?.clear();
inputNameIdentityController?.clear();
inputBccIdentityController?.clear();
}
List<EmailAddress> getSuggestionEmailAddress(String? pattern) { List<EmailAddress> getSuggestionEmailAddress(String? pattern) {
if (pattern == null || pattern.isEmpty) { if (pattern == null || pattern.isEmpty) {
return List.empty(); return List.empty();
@@ -382,19 +400,19 @@ class IdentityCreatorController extends BaseController {
void clearFocusEditor(BuildContext context) { void clearFocusEditor(BuildContext context) {
if (!BuildUtils.isWeb) { if (!BuildUtils.isWeb) {
signatureHtmlEditorMobileController?.unfocus(); signatureHtmlEditorMobileController?.unfocus();
richTextMobileTabletController.htmlEditorApi?.unfocus();
keyboardRichTextController.hideRichTextView();
} }
FocusScope.of(context).unfocus(); SystemChannels.textInput.invokeMethod('TextInput.hide');
} }
void closeView(BuildContext context) { void closeView(BuildContext context) {
_clearAll();
clearFocusEditor(context);
if (BuildUtils.isWeb) { if (BuildUtils.isWeb) {
_disposeWidget(); _disposeWidget();
onDismissIdentityCreator?.call(); onDismissIdentityCreator?.call();
} else { } else {
popBack(); popBack();
identityCreatorBinding.dispose();
} }
} }
@@ -13,13 +13,17 @@ import 'package:get/get.dart';
import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/identities/identity.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/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/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/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/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/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/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/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/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/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/delete_identity_interactor.dart';
import 'package:tmail_ui_user/features/manage_account/domain/usecases/edit_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/identity_action_type.dart';
import 'package:tmail_ui_user/features/manage_account/presentation/model/settings_page_level.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/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/routes/app_routes.dart';
import 'package:tmail_ui_user/main/routes/route_navigation.dart'; import 'package:tmail_ui_user/main/routes/route_navigation.dart';
class IdentitiesController extends BaseController { class IdentitiesController extends BaseController {
@@ -37,9 +40,11 @@ class IdentitiesController extends BaseController {
final _appToast = Get.find<AppToast>(); final _appToast = Get.find<AppToast>();
final _imagePaths = Get.find<ImagePaths>(); final _imagePaths = Get.find<ImagePaths>();
final _responsiveUtils = Get.find<ResponsiveUtils>(); final _responsiveUtils = Get.find<ResponsiveUtils>();
final _identityCreatorBindings = IdentityCreatorBindings();
final GetAllIdentitiesInteractor _getAllIdentitiesInteractor; final GetAllIdentitiesInteractor _getAllIdentitiesInteractor;
final CreateNewIdentityInteractor _createNewIdentityInteractor; final CreateNewIdentityInteractor _createNewIdentityInteractor;
final CreateNewDefaultIdentityInteractor _createNewDefaultIdentityInteractor;
final DeleteIdentityInteractor _deleteIdentityInteractor; final DeleteIdentityInteractor _deleteIdentityInteractor;
final EditIdentityInteractor _editIdentityInteractor; final EditIdentityInteractor _editIdentityInteractor;
@@ -53,6 +58,7 @@ class IdentitiesController extends BaseController {
this._deleteIdentityInteractor, this._deleteIdentityInteractor,
this._createNewIdentityInteractor, this._createNewIdentityInteractor,
this._editIdentityInteractor, this._editIdentityInteractor,
this._createNewDefaultIdentityInteractor
); );
@override @override
@@ -80,6 +86,8 @@ class IdentitiesController extends BaseController {
_handleGetAllIdentitiesSuccess(success); _handleGetAllIdentitiesSuccess(success);
} else if (success is CreateNewIdentitySuccess) { } else if (success is CreateNewIdentitySuccess) {
_createNewIdentitySuccess(success); _createNewIdentitySuccess(success);
} else if (success is CreateNewDefaultIdentitySuccess) {
_createNewDefaultIdentitySuccess(success);
} else if (success is DeleteIdentitySuccess) { } else if (success is DeleteIdentitySuccess) {
_deleteIdentitySuccess(success); _deleteIdentitySuccess(success);
} else if (success is EditIdentitySuccess) { } else if (success is EditIdentitySuccess) {
@@ -154,9 +162,8 @@ class IdentitiesController extends BaseController {
} }
}); });
} else { } else {
final newIdentityArguments = await push( final newIdentityArguments =
AppRoutes.identityCreator, await _getIdentityRequest(context, arguments);
arguments: arguments);
if (newIdentityArguments is CreateNewIdentityRequest) { if (newIdentityArguments is CreateNewIdentityRequest) {
_createNewIdentityAction(accountId, newIdentityArguments); _createNewIdentityAction(accountId, newIdentityArguments);
@@ -167,8 +174,34 @@ class IdentitiesController extends BaseController {
} }
} }
void _createNewIdentityAction(AccountId accountId, CreateNewIdentityRequest identityRequest) async { Future<dynamic> _getIdentityRequest(
consumeState(_createNewIdentityInteractor.execute(accountId, identityRequest)); 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) { void _createNewIdentitySuccess(CreateNewIdentitySuccess success) {
@@ -182,6 +215,17 @@ class IdentitiesController extends BaseController {
_refreshAllIdentities(); _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) { void openConfirmationDialogDeleteIdentityAction(BuildContext context, Identity identity) {
if (_responsiveUtils.isScreenWithShortestSide(context)) { if (_responsiveUtils.isScreenWithShortestSide(context)) {
(ConfirmationDialogActionSheetBuilder(context) (ConfirmationDialogActionSheetBuilder(context)
@@ -294,9 +338,7 @@ class IdentitiesController extends BaseController {
} }
}); });
} else { } else {
final newIdentityArguments = await push( final newIdentityArguments = await _getIdentityRequest(context, arguments);
AppRoutes.identityCreator,
arguments: arguments);
if (newIdentityArguments is CreateNewIdentityRequest) { if (newIdentityArguments is CreateNewIdentityRequest) {
_createNewIdentityAction(accountId, newIdentityArguments); _createNewIdentityAction(accountId, newIdentityArguments);