TF-48 Implement compose and send email with simple text
This commit is contained in:
+22
-12
@@ -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(),
|
||||
|
||||
Reference in New Issue
Block a user