From 76de84846794278819bf82f65b813e01180d923a Mon Sep 17 00:00:00 2001 From: dab246 Date: Tue, 10 Jan 2023 16:19:08 +0700 Subject: [PATCH] TF-1354 Support inputted email will be automatic enter --- .../presentation/composer_controller.dart | 91 +++++++++++++++++++ .../presentation/composer_view_web.dart | 12 ++- .../widgets/email_address_input_builder.dart | 3 + 3 files changed, 103 insertions(+), 3 deletions(-) diff --git a/lib/features/composer/presentation/composer_controller.dart b/lib/features/composer/presentation/composer_controller.dart index 4b4a07be8..c40a39156 100644 --- a/lib/features/composer/presentation/composer_controller.dart +++ b/lib/features/composer/presentation/composer_controller.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'dart:io'; +import 'package:collection/collection.dart'; import 'package:core/core.dart'; import 'package:dartz/dartz.dart'; import 'package:device_info_plus/device_info_plus.dart'; @@ -28,6 +29,7 @@ import 'package:model/model.dart'; import 'package:permission_handler/permission_handler.dart'; import 'package:receive_sharing_intent/receive_sharing_intent.dart'; import 'package:rich_text_composer/rich_text_composer.dart'; +import 'package:super_tag_editor/tag_editor.dart'; import 'package:tmail_ui_user/features/base/base_controller.dart'; import 'package:tmail_ui_user/features/composer/domain/model/contact_suggestion_source.dart'; import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart'; @@ -114,6 +116,10 @@ class ComposerController extends BaseController { final ccEmailAddressController = TextEditingController(); final bccEmailAddressController = TextEditingController(); + final GlobalKey keyToEmailTagEditor = GlobalKey(); + final GlobalKey keyCcEmailTagEditor = GlobalKey(); + final GlobalKey keyBccEmailTagEditor = GlobalKey(); + FocusNode? subjectEmailInputFocusNode; FocusNode? toAddressFocusNode; @@ -1145,6 +1151,8 @@ class ComposerController extends BaseController { ccAddressExpandMode.value = ExpandMode.COLLAPSE; bccAddressExpandMode.value = ExpandMode.COLLAPSE; htmlEditorApi?.unfocus(); + + autoCreateEmailTag(); } } @@ -1154,6 +1162,88 @@ class ComposerController extends BaseController { toAddressExpandMode.value = ExpandMode.COLLAPSE; ccAddressExpandMode.value = ExpandMode.COLLAPSE; bccAddressExpandMode.value = ExpandMode.COLLAPSE; + + autoCreateEmailTag(); + } + } + + void autoCreateEmailTag() { + final inputToEmail = toEmailAddressController.text; + final inputCcEmail = ccEmailAddressController.text; + final inputBccEmail = bccEmailAddressController.text; + log('ComposerController::_autoCreateEmailTag():inputToEmail: $inputToEmail'); + log('ComposerController::_autoCreateEmailTag():inputCcEmail: $inputCcEmail'); + log('ComposerController::_autoCreateEmailTag():inputBccEmail: $inputBccEmail'); + + if (inputToEmail.isNotEmpty) { + _autoCreateToEmailTag(inputToEmail); + } + if (inputCcEmail.isNotEmpty) { + _autoCreateCcEmailTag(inputCcEmail); + } + if (inputBccEmail.isNotEmpty) { + _autoCreateBccEmailTag(inputBccEmail); + } + } + + bool _isDuplicatedRecipient(String inputEmail, List listEmailAddress) { + return listEmailAddress + .map((emailAddress) => emailAddress.email) + .whereNotNull() + .contains(inputEmail); + } + + void _autoCreateToEmailTag(String inputEmail) { + if (!_isDuplicatedRecipient(inputEmail, listToEmailAddress)) { + final emailAddress = EmailAddress(null, inputEmail); + listToEmailAddress.add(emailAddress); + isInitialRecipient.value = true; + isInitialRecipient.refresh(); + _updateStatusEmailSendButton(); + } + keyToEmailTagEditor.currentState?.resetTextField(); + Future.delayed(const Duration(milliseconds: 300), () { + keyToEmailTagEditor.currentState?.closeSuggestionBox(); + }); + } + + void _autoCreateCcEmailTag(String inputEmail) { + if (!_isDuplicatedRecipient(inputEmail, listCcEmailAddress)) { + final emailAddress = EmailAddress(null, inputEmail); + listCcEmailAddress.add(emailAddress); + isInitialRecipient.value = true; + isInitialRecipient.refresh(); + _updateStatusEmailSendButton(); + } + keyCcEmailTagEditor.currentState?.resetTextField(); + Future.delayed(const Duration(milliseconds: 300), () { + keyCcEmailTagEditor.currentState?.closeSuggestionBox(); + }); + } + + void _autoCreateBccEmailTag(String inputEmail) { + if (!_isDuplicatedRecipient(inputEmail, listBccEmailAddress)) { + final emailAddress = EmailAddress(null, inputEmail); + listBccEmailAddress.add(emailAddress); + isInitialRecipient.value = true; + isInitialRecipient.refresh(); + _updateStatusEmailSendButton(); + } + keyBccEmailTagEditor.currentState?.resetTextField(); + Future.delayed(const Duration(milliseconds: 300), () { + keyBccEmailTagEditor.currentState?.closeSuggestionBox(); + }); + } + + void _closeSuggestionBox() { + if (toEmailAddressController.text.isEmpty) { + keyToEmailTagEditor.currentState?.closeSuggestionBox(); + } + if (ccEmailAddressController.text.isEmpty) { + keyCcEmailTagEditor.currentState?.closeSuggestionBox(); + } + if (bccEmailAddressController.text.isEmpty) { + keyBccEmailTagEditor.currentState?.closeSuggestionBox(); } } @@ -1194,6 +1284,7 @@ class ComposerController extends BaseController { default: break; } + _closeSuggestionBox(); } } diff --git a/lib/features/composer/presentation/composer_view_web.dart b/lib/features/composer/presentation/composer_view_web.dart index 82e0932e8..802e08e70 100644 --- a/lib/features/composer/presentation/composer_view_web.dart +++ b/lib/features/composer/presentation/composer_view_web.dart @@ -475,7 +475,9 @@ class ComposerView extends GetWidget controller: controller.toEmailAddressController, focusNode: controller.toAddressFocusNode, autoDisposeFocusNode: false, - isInitial: controller.isInitialRecipient.value) + isInitial: controller.isInitialRecipient.value, + keyTagEditor: controller.keyToEmailTagEditor + ) ..addOnFocusEmailAddressChangeAction((prefixEmailAddress, focus) => controller.onEmailAddressFocusChange(prefixEmailAddress, focus)) ..addOnShowFullListEmailAddressAction((prefixEmailAddress) => controller.showFullEmailAddress(prefixEmailAddress)) ..addOnAddEmailAddressTypeAction((prefixEmailAddress) => controller.addEmailAddressType(prefixEmailAddress)) @@ -495,7 +497,9 @@ class ComposerView extends GetWidget controller.listEmailAddressType, expandMode: controller.ccAddressExpandMode.value, controller: controller.ccEmailAddressController, - isInitial: controller.isInitialRecipient.value,) + isInitial: controller.isInitialRecipient.value, + keyTagEditor: controller.keyCcEmailTagEditor + ) ..addOnFocusEmailAddressChangeAction((prefixEmailAddress, focus) => controller.onEmailAddressFocusChange(prefixEmailAddress, focus)) ..addOnShowFullListEmailAddressAction((prefixEmailAddress) => controller.showFullEmailAddress(prefixEmailAddress)) ..addOnDeleteEmailAddressTypeAction((prefixEmailAddress) => controller.deleteEmailAddressType(prefixEmailAddress)) @@ -516,7 +520,9 @@ class ComposerView extends GetWidget controller.listEmailAddressType, expandMode: controller.bccAddressExpandMode.value, controller: controller.bccEmailAddressController, - isInitial: controller.isInitialRecipient.value,) + isInitial: controller.isInitialRecipient.value, + keyTagEditor: controller.keyBccEmailTagEditor + ) ..addOnFocusEmailAddressChangeAction((prefixEmailAddress, focus) => controller.onEmailAddressFocusChange(prefixEmailAddress, focus)) ..addOnShowFullListEmailAddressAction((prefixEmailAddress) => controller.showFullEmailAddress(prefixEmailAddress)) ..addOnDeleteEmailAddressTypeAction((prefixEmailAddress) => controller.deleteEmailAddressType(prefixEmailAddress)) diff --git a/lib/features/composer/presentation/widgets/email_address_input_builder.dart b/lib/features/composer/presentation/widgets/email_address_input_builder.dart index 37db07c21..758686947 100644 --- a/lib/features/composer/presentation/widgets/email_address_input_builder.dart +++ b/lib/features/composer/presentation/widgets/email_address_input_builder.dart @@ -33,6 +33,7 @@ class EmailAddressInputBuilder { final bool? isInitial; final FocusNode? focusNode; final bool autoDisposeFocusNode; + final GlobalKey? keyTagEditor; List listEmailAddress = []; @@ -81,6 +82,7 @@ class EmailAddressInputBuilder { this.focusNode, this.autoDisposeFocusNode = true, this.expandMode = ExpandMode.EXPAND, + this.keyTagEditor, } ); @@ -129,6 +131,7 @@ class EmailAddressInputBuilder { return FocusScope(child: Focus( onFocusChange: (focus) => _onFocusEmailAddressChangeAction?.call(_prefixEmailAddress, focus), child: TagEditor( + key: keyTagEditor, length: newListEmailAddress.length, controller: controller, focusNode: focusNode,