TF-48 Implement compose and send email with simple text

This commit is contained in:
dab246
2021-09-08 15:14:19 +07:00
committed by Dat H. Pham
parent db4d262a8c
commit 0cd7552ad2
40 changed files with 466 additions and 114 deletions
@@ -1,16 +1,19 @@
import 'dart:async';
import 'package:core/core.dart';
import 'package:flutter/material.dart';
import 'package:flutter/widgets.dart';
import 'package:flutter_chips_input/flutter_chips_input.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:get/get.dart';
import 'package:jmap_dart_client/jmap/mail/email/email_address.dart';
import 'package:model/model.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/features/composer/presentation/extensions/prefix_email_address_extension.dart';
typedef OnOpenExpandAddressActionClick = void Function();
typedef OnSuggestionEmailAddress = Future<List<EmailAddress>> Function(String word);
typedef OnUpdateListEmailAddressAction = void Function(
PrefixEmailAddress prefixEmailAddress,
List<EmailAddress> listEmailAddress
@@ -21,7 +24,6 @@ class EmailAddressComposerWidgetBuilder {
final ImagePaths _imagePaths;
final BuildContext _context;
final ExpandMode _expandMode;
final List<EmailAddress> _listEmailAddressSuggestion;
final List<EmailAddress> _listToEmailAddress;
final List<EmailAddress> _listCcEmailAddress;
final List<EmailAddress> _listBccEmailAddress;
@@ -31,12 +33,12 @@ class EmailAddressComposerWidgetBuilder {
OnOpenExpandAddressActionClick? _onOpenExpandAddressActionClick;
OnUpdateListEmailAddressAction? _onUpdateListEmailAddressAction;
OnSuggestionEmailAddress? _onSuggestionEmailAddress;
EmailAddressComposerWidgetBuilder(
this._context,
this._imagePaths,
this._expandMode,
this._listEmailAddressSuggestion,
this._listToEmailAddress,
this._listCcEmailAddress,
this._listBccEmailAddress,
@@ -51,6 +53,10 @@ class EmailAddressComposerWidgetBuilder {
_onUpdateListEmailAddressAction = onUpdateListEmailAddressAction;
}
void addOnSuggestionEmailAddress(OnSuggestionEmailAddress onSuggestionEmailAddress) {
_onSuggestionEmailAddress = onSuggestionEmailAddress;
}
Widget build() {
keyToEmailAddress.currentState?.selectSuggestion(_listToEmailAddress);
@@ -115,29 +121,33 @@ class EmailAddressComposerWidgetBuilder {
: Key('${prefixEmailAddress.toString()}_email_address_input'),
initialValue: _getListEmailAddressCurrent(prefixEmailAddress),
textStyle: TextStyle(color: AppColor.nameUserColor, fontSize: 14, fontWeight: FontWeight.w500),
cursorColor: AppColor.primaryColor,
decoration: InputDecoration(
border: InputBorder.none,
hintText: AppLocalizations.of(_context).hint_text_email_address,
hintMaxLines: 1,
hintStyle: TextStyle(color: AppColor.baseTextColor, fontSize: 14, fontWeight: FontWeight.w500)),
initialSuggestions: _listEmailAddressSuggestion,
findSuggestions: (query) {
if (query.isNotEmpty) {
final lowercaseQuery = query.toLowerCase();
return _listEmailAddressSuggestion
.where((emailAddress) => emailAddress.getName().toLowerCase().contains(query.toLowerCase())
|| emailAddress.getEmail().toLowerCase().contains(query.toLowerCase()))
.toList(growable: false)
..sort((email1, email2) => email1.asString().toLowerCase().indexOf(lowercaseQuery).compareTo(email2.asString().toLowerCase().indexOf(lowercaseQuery)));
if (query.isNotEmpty && _onSuggestionEmailAddress != null) {
return _onSuggestionEmailAddress!(query);
}
return [];
},
onChanged: (data) {
print('data: $data');
if (_onUpdateListEmailAddressAction != null) {
_onUpdateListEmailAddressAction!(prefixEmailAddress, data);
}
},
onChipInputActionDone: (state, value) {
if (GetUtils.isEmail(value)) {
state.selectSuggestion(EmailAddress(value, value));
}
},
onChipInputChangeFocusAction: (state, value) {
if (GetUtils.isEmail(value)) {
state.selectSuggestion(EmailAddress(value, value));
}
},
chipBuilder: (context, state, emailAddress) {
return InputChip(
key: ObjectKey(emailAddress),
@@ -11,9 +11,9 @@ class TopBarComposerWidgetBuilder {
OnSendEmailActionClick? _onSendEmailActionClick;
final ImagePaths _imagePaths;
bool isEnableEmailSendButton;
final bool _isEnableEmailSendButton;
TopBarComposerWidgetBuilder(this._imagePaths, this.isEnableEmailSendButton);
TopBarComposerWidgetBuilder(this._imagePaths, this._isEnableEmailSendButton);
void addBackActionClick(OnBackActionClick onBackActionClick) {
_onBackActionClick = onBackActionClick;
@@ -68,12 +68,11 @@ class TopBarComposerWidgetBuilder {
SizedBox(width: 10),
ButtonBuilder(_imagePaths.icComposerSend)
.key(Key('button_send_email'))
.color(isEnableEmailSendButton ? AppColor.enableSendEmailButtonColor : AppColor.disableSendEmailButtonColor)
.color(_isEnableEmailSendButton ? AppColor.enableSendEmailButtonColor : AppColor.disableSendEmailButtonColor)
.onPressActionClick(() {
if (_onSendEmailActionClick != null && isEnableEmailSendButton) {
if (_onSendEmailActionClick != null && _isEnableEmailSendButton) {
_onSendEmailActionClick!();
}
})
}})
.build(),
SizedBox(width: 10),
ButtonBuilder(_imagePaths.icComposerMenu).key(Key('button_menu_composer')).build(),