TF-1354 Support inputted email will be automatic enter
This commit is contained in:
@@ -2,6 +2,7 @@
|
|||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
import 'dart:io';
|
import 'dart:io';
|
||||||
|
|
||||||
|
import 'package:collection/collection.dart';
|
||||||
import 'package:core/core.dart';
|
import 'package:core/core.dart';
|
||||||
import 'package:dartz/dartz.dart';
|
import 'package:dartz/dartz.dart';
|
||||||
import 'package:device_info_plus/device_info_plus.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:permission_handler/permission_handler.dart';
|
||||||
import 'package:receive_sharing_intent/receive_sharing_intent.dart';
|
import 'package:receive_sharing_intent/receive_sharing_intent.dart';
|
||||||
import 'package:rich_text_composer/rich_text_composer.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/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/contact_suggestion_source.dart';
|
||||||
import 'package:tmail_ui_user/features/composer/domain/model/email_request.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 ccEmailAddressController = TextEditingController();
|
||||||
final bccEmailAddressController = 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? subjectEmailInputFocusNode;
|
||||||
FocusNode? toAddressFocusNode;
|
FocusNode? toAddressFocusNode;
|
||||||
|
|
||||||
@@ -1145,6 +1151,8 @@ class ComposerController extends BaseController {
|
|||||||
ccAddressExpandMode.value = ExpandMode.COLLAPSE;
|
ccAddressExpandMode.value = ExpandMode.COLLAPSE;
|
||||||
bccAddressExpandMode.value = ExpandMode.COLLAPSE;
|
bccAddressExpandMode.value = ExpandMode.COLLAPSE;
|
||||||
htmlEditorApi?.unfocus();
|
htmlEditorApi?.unfocus();
|
||||||
|
|
||||||
|
autoCreateEmailTag();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1154,6 +1162,88 @@ class ComposerController extends BaseController {
|
|||||||
toAddressExpandMode.value = ExpandMode.COLLAPSE;
|
toAddressExpandMode.value = ExpandMode.COLLAPSE;
|
||||||
ccAddressExpandMode.value = ExpandMode.COLLAPSE;
|
ccAddressExpandMode.value = ExpandMode.COLLAPSE;
|
||||||
bccAddressExpandMode.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:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
_closeSuggestionBox();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -475,7 +475,9 @@ class ComposerView extends GetWidget<ComposerController>
|
|||||||
controller: controller.toEmailAddressController,
|
controller: controller.toEmailAddressController,
|
||||||
focusNode: controller.toAddressFocusNode,
|
focusNode: controller.toAddressFocusNode,
|
||||||
autoDisposeFocusNode: false,
|
autoDisposeFocusNode: false,
|
||||||
isInitial: controller.isInitialRecipient.value)
|
isInitial: controller.isInitialRecipient.value,
|
||||||
|
keyTagEditor: controller.keyToEmailTagEditor
|
||||||
|
)
|
||||||
..addOnFocusEmailAddressChangeAction((prefixEmailAddress, focus) => controller.onEmailAddressFocusChange(prefixEmailAddress, focus))
|
..addOnFocusEmailAddressChangeAction((prefixEmailAddress, focus) => controller.onEmailAddressFocusChange(prefixEmailAddress, focus))
|
||||||
..addOnShowFullListEmailAddressAction((prefixEmailAddress) => controller.showFullEmailAddress(prefixEmailAddress))
|
..addOnShowFullListEmailAddressAction((prefixEmailAddress) => controller.showFullEmailAddress(prefixEmailAddress))
|
||||||
..addOnAddEmailAddressTypeAction((prefixEmailAddress) => controller.addEmailAddressType(prefixEmailAddress))
|
..addOnAddEmailAddressTypeAction((prefixEmailAddress) => controller.addEmailAddressType(prefixEmailAddress))
|
||||||
@@ -495,7 +497,9 @@ class ComposerView extends GetWidget<ComposerController>
|
|||||||
controller.listEmailAddressType,
|
controller.listEmailAddressType,
|
||||||
expandMode: controller.ccAddressExpandMode.value,
|
expandMode: controller.ccAddressExpandMode.value,
|
||||||
controller: controller.ccEmailAddressController,
|
controller: controller.ccEmailAddressController,
|
||||||
isInitial: controller.isInitialRecipient.value,)
|
isInitial: controller.isInitialRecipient.value,
|
||||||
|
keyTagEditor: controller.keyCcEmailTagEditor
|
||||||
|
)
|
||||||
..addOnFocusEmailAddressChangeAction((prefixEmailAddress, focus) => controller.onEmailAddressFocusChange(prefixEmailAddress, focus))
|
..addOnFocusEmailAddressChangeAction((prefixEmailAddress, focus) => controller.onEmailAddressFocusChange(prefixEmailAddress, focus))
|
||||||
..addOnShowFullListEmailAddressAction((prefixEmailAddress) => controller.showFullEmailAddress(prefixEmailAddress))
|
..addOnShowFullListEmailAddressAction((prefixEmailAddress) => controller.showFullEmailAddress(prefixEmailAddress))
|
||||||
..addOnDeleteEmailAddressTypeAction((prefixEmailAddress) => controller.deleteEmailAddressType(prefixEmailAddress))
|
..addOnDeleteEmailAddressTypeAction((prefixEmailAddress) => controller.deleteEmailAddressType(prefixEmailAddress))
|
||||||
@@ -516,7 +520,9 @@ class ComposerView extends GetWidget<ComposerController>
|
|||||||
controller.listEmailAddressType,
|
controller.listEmailAddressType,
|
||||||
expandMode: controller.bccAddressExpandMode.value,
|
expandMode: controller.bccAddressExpandMode.value,
|
||||||
controller: controller.bccEmailAddressController,
|
controller: controller.bccEmailAddressController,
|
||||||
isInitial: controller.isInitialRecipient.value,)
|
isInitial: controller.isInitialRecipient.value,
|
||||||
|
keyTagEditor: controller.keyBccEmailTagEditor
|
||||||
|
)
|
||||||
..addOnFocusEmailAddressChangeAction((prefixEmailAddress, focus) => controller.onEmailAddressFocusChange(prefixEmailAddress, focus))
|
..addOnFocusEmailAddressChangeAction((prefixEmailAddress, focus) => controller.onEmailAddressFocusChange(prefixEmailAddress, focus))
|
||||||
..addOnShowFullListEmailAddressAction((prefixEmailAddress) => controller.showFullEmailAddress(prefixEmailAddress))
|
..addOnShowFullListEmailAddressAction((prefixEmailAddress) => controller.showFullEmailAddress(prefixEmailAddress))
|
||||||
..addOnDeleteEmailAddressTypeAction((prefixEmailAddress) => controller.deleteEmailAddressType(prefixEmailAddress))
|
..addOnDeleteEmailAddressTypeAction((prefixEmailAddress) => controller.deleteEmailAddressType(prefixEmailAddress))
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ class EmailAddressInputBuilder {
|
|||||||
final bool? isInitial;
|
final bool? isInitial;
|
||||||
final FocusNode? focusNode;
|
final FocusNode? focusNode;
|
||||||
final bool autoDisposeFocusNode;
|
final bool autoDisposeFocusNode;
|
||||||
|
final GlobalKey? keyTagEditor;
|
||||||
|
|
||||||
List<EmailAddress> listEmailAddress = <EmailAddress>[];
|
List<EmailAddress> listEmailAddress = <EmailAddress>[];
|
||||||
|
|
||||||
@@ -81,6 +82,7 @@ class EmailAddressInputBuilder {
|
|||||||
this.focusNode,
|
this.focusNode,
|
||||||
this.autoDisposeFocusNode = true,
|
this.autoDisposeFocusNode = true,
|
||||||
this.expandMode = ExpandMode.EXPAND,
|
this.expandMode = ExpandMode.EXPAND,
|
||||||
|
this.keyTagEditor,
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -129,6 +131,7 @@ class EmailAddressInputBuilder {
|
|||||||
return FocusScope(child: Focus(
|
return FocusScope(child: Focus(
|
||||||
onFocusChange: (focus) => _onFocusEmailAddressChangeAction?.call(_prefixEmailAddress, focus),
|
onFocusChange: (focus) => _onFocusEmailAddressChangeAction?.call(_prefixEmailAddress, focus),
|
||||||
child: TagEditor<SuggestionEmailAddress>(
|
child: TagEditor<SuggestionEmailAddress>(
|
||||||
|
key: keyTagEditor,
|
||||||
length: newListEmailAddress.length,
|
length: newListEmailAddress.length,
|
||||||
controller: controller,
|
controller: controller,
|
||||||
focusNode: focusNode,
|
focusNode: focusNode,
|
||||||
|
|||||||
Reference in New Issue
Block a user