TF-1354 Support inputted email will be automatic enter

This commit is contained in:
dab246
2023-01-10 16:19:08 +07:00
committed by Dat H. Pham
parent 79e5a4197c
commit 76de848467
3 changed files with 103 additions and 3 deletions
@@ -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<TagsEditorState> keyToEmailTagEditor = GlobalKey<TagsEditorState>();
final GlobalKey<TagsEditorState> keyCcEmailTagEditor = GlobalKey<TagsEditorState>();
final GlobalKey<TagsEditorState> keyBccEmailTagEditor = GlobalKey<TagsEditorState>();
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<EmailAddress> 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();
}
}
@@ -475,7 +475,9 @@ class ComposerView extends GetWidget<ComposerController>
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<ComposerController>
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<ComposerController>
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))
@@ -33,6 +33,7 @@ class EmailAddressInputBuilder {
final bool? isInitial;
final FocusNode? focusNode;
final bool autoDisposeFocusNode;
final GlobalKey? keyTagEditor;
List<EmailAddress> listEmailAddress = <EmailAddress>[];
@@ -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<SuggestionEmailAddress>(
key: keyTagEditor,
length: newListEmailAddress.length,
controller: controller,
focusNode: focusNode,