TF-1354 Support inputted email will be automatic enter
This commit is contained in:
@@ -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,
|
||||
|
||||
Reference in New Issue
Block a user