TF-831: create email_forward_creator view

This commit is contained in:
ManhNTX
2022-08-20 17:34:31 +07:00
committed by Dat H. Pham
parent 27a1400dd4
commit 04b530a4b9
13 changed files with 606 additions and 94 deletions
+1 -1
View File
@@ -1,3 +1,3 @@
SERVER_URL=http://localhost
SERVER_URL=https://gateway.upn.integration-open-paas.org
DOMAIN_REDIRECT_URL=http://localhost:3000
WEB_OIDC_CLIENT_ID=teammail-web
@@ -0,0 +1,63 @@
import 'package:contact/data/datasource/auto_complete_datasource.dart';
import 'package:contact/data/datasource_impl/tmail_contact_datasource_impl.dart';
import 'package:contact/data/network/contact_api.dart';
import 'package:get/get.dart';
import 'package:tmail_ui_user/features/base/base_bindings.dart';
import 'package:tmail_ui_user/features/composer/data/datasource/contact_datasource.dart';
import 'package:tmail_ui_user/features/composer/data/datasource_impl/contact_datasource_impl.dart';
import 'package:tmail_ui_user/features/composer/data/repository/auto_complete_repository_impl.dart';
import 'package:tmail_ui_user/features/composer/data/repository/contact_repository_impl.dart';
import 'package:tmail_ui_user/features/composer/domain/repository/auto_complete_repository.dart';
import 'package:tmail_ui_user/features/composer/domain/repository/contact_repository.dart';
import 'package:tmail_ui_user/features/composer/domain/usecases/get_autocomplete_interactor.dart';
import 'package:tmail_ui_user/features/composer/domain/usecases/get_autocomplete_with_device_contact_interactor.dart';
import 'package:tmail_ui_user/features/composer/domain/usecases/get_device_contact_suggestions_interactor.dart';
import 'package:tmail_ui_user/features/mails_forward_creator/presentation/emails_forward_creator_controller.dart';
class EmailsForwardCreatorBindings extends BaseBindings {
final Set<AutoCompleteDataSource> _dataSources = {};
@override
void bindingsController() {
Get.lazyPut(() => EmailsForwardCreatorController(
Get.find<GetAutoCompleteWithDeviceContactInteractor>(),
Get.find<GetAutoCompleteInteractor>(),
));
}
@override
void bindingsDataSource() {
Get.lazyPut<ContactDataSource>(() => Get.find<ContactDataSourceImpl>());
}
@override
void bindingsDataSourceImpl() {
_dataSources.clear();
Get.lazyPut(() => ContactDataSourceImpl());
Get.lazyPut(() => TMailContactDataSourceImpl(Get.find<ContactAPI>()));
_dataSources.add(Get.find<TMailContactDataSourceImpl>());
}
@override
void bindingsInteractor() {
Get.lazyPut(() => GetDeviceContactSuggestionsInteractor(Get.find<ContactRepository>()));
Get.lazyPut(() => GetAutoCompleteInteractor(Get.find<AutoCompleteRepository>()));
Get.lazyPut(() => GetAutoCompleteWithDeviceContactInteractor(
Get.find<GetAutoCompleteInteractor>(),
Get.find<GetDeviceContactSuggestionsInteractor>()
));
}
@override
void bindingsRepository() {
Get.lazyPut<ContactRepository>(() => Get.find<ContactRepositoryImpl>());
Get.lazyPut<AutoCompleteRepository>(() => Get.find<AutoCompleteRepositoryImpl>());
}
@override
void bindingsRepositoryImpl() {
Get.lazyPut(() => ContactRepositoryImpl(Get.find<ContactDataSource>()));
Get.lazyPut(() => AutoCompleteRepositoryImpl(_dataSources));
}
}
@@ -3,6 +3,7 @@ import 'package:core/utils/app_logger.dart';
import 'package:flutter/cupertino.dart';
import 'package:get/get.dart';
import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/core/session/session.dart';
import 'package:jmap_dart_client/jmap/mail/email/email_address.dart';
import 'package:model/model.dart';
import 'package:tmail_ui_user/features/base/base_controller.dart';
@@ -12,19 +13,21 @@ import 'package:tmail_ui_user/features/composer/domain/usecases/get_autocomplete
import 'package:tmail_ui_user/features/composer/domain/usecases/get_autocomplete_with_device_contact_interactor.dart';
import 'package:tmail_ui_user/features/mails_forward_creator/presentation/model/mails_forward_creator_arguments.dart';
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
import 'package:tmail_ui_user/features/composer/presentation/extensions/session_extension.dart';
class RulesFilterCreatorController extends BaseController {
class EmailsForwardCreatorController extends BaseController {
final inputEmailForwardController = TextEditingController();
final ContactSuggestionSource _contactSuggestionSource = ContactSuggestionSource.tMailContact;
late AccountId _accountId;
late Session? _session;
late GetAutoCompleteWithDeviceContactInteractor _getAutoCompleteWithDeviceContactInteractor;
late GetAutoCompleteInteractor _getAutoCompleteInteractor;
final listEmailForwards = <String>[].obs;
final listEmailForwards = <EmailAddress>[].obs;
RulesFilterCreatorController(
EmailsForwardCreatorController(
this._getAutoCompleteWithDeviceContactInteractor,
this._getAutoCompleteInteractor,
);
@@ -51,12 +54,15 @@ class RulesFilterCreatorController extends BaseController {
final arguments = Get.arguments;
if (arguments is MailsForwardCreatorArguments) {
_accountId = arguments.accountId;
_session = arguments.session;
}
}
Future<List<EmailAddress>> getAutoCompleteSuggestion(
{required String word}) async {
log('ComposerController::getAutoCompleteSuggestion(): $word | $_contactSuggestionSource');
log('EmailsForwardCreatorController::getAutoCompleteSuggestion(): $word | $_contactSuggestionSource');
if(_session?.hasSupportAutoComplete != true) return <EmailAddress>[];
_getAutoCompleteWithDeviceContactInteractor = Get.find<GetAutoCompleteWithDeviceContactInteractor>();
_getAutoCompleteInteractor = Get.find<GetAutoCompleteInteractor>();
@@ -75,7 +81,13 @@ class RulesFilterCreatorController extends BaseController {
(success) => success is GetAutoCompleteSuccess ? success.listEmailAddress : <EmailAddress>[]));
}
void _clearAll() {
void addToListEmailForwards(EmailAddress emailAddress) {
if(emailAddress.email !=null && emailAddress.email!.isNotEmpty) {
listEmailForwards.add(emailAddress);
}
}
void clearAll() {
inputEmailForwardController.clear();
}
@@ -83,4 +95,10 @@ class RulesFilterCreatorController extends BaseController {
FocusScope.of(context).unfocus();
popBack();
}
void addEmailForwards(BuildContext context) {
inputEmailForwardController.clear();
FocusScope.of(context).unfocus();
popBack(result: listEmailForwards.toList());
}
}
@@ -0,0 +1,313 @@
import 'package:core/core.dart';
import 'package:flutter/material.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/features/mails_forward_creator/presentation/emails_forward_creator_controller.dart';
import 'package:tmail_ui_user/features/mails_forward_creator/presentation/widgets/email_forward_creator_item_widget.dart';
import 'package:tmail_ui_user/features/mails_forward_creator/presentation/widgets/emails_forward_input_with_drop_list_field_builder.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
class EmailsForwardCreatorView extends GetWidget<EmailsForwardCreatorController> {
final _imagePaths = Get.find<ImagePaths>();
final _responsiveUtils = Get.find<ResponsiveUtils>();
EmailsForwardCreatorView({Key? key}) : super(key: key);
@override
Widget build(BuildContext context) {
return ResponsiveWidget(
responsiveUtils: _responsiveUtils,
mobile: Scaffold(
backgroundColor: Colors.black38,
body: GestureDetector(
onTap: () => FocusScope.of(context).unfocus(),
child: SafeArea(
child: Align(
alignment: Alignment.bottomCenter,
child: Card(
color: Colors.transparent,
shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.only(
topLeft: Radius.circular(16),
topRight: Radius.circular(16),
)),
child: Container(
decoration: const BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.only(
topLeft: Radius.circular(16),
topRight: Radius.circular(16),
)),
width: double.infinity,
height: _responsiveUtils.getSizeScreenHeight(context) - 70,
child: ClipRRect(
borderRadius: const BorderRadius.only(
topLeft: Radius.circular(16),
topRight: Radius.circular(16)),
child: _buildRulesFilterFormOnMobile(context)
)
)
)
),
),
)
),
tablet: Scaffold(
backgroundColor: Colors.black38,
body: GestureDetector(
onTap: () => FocusScope.of(context).unfocus(),
child: Align(alignment: Alignment.bottomCenter, child: Card(
color: Colors.transparent,
shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.only(
topLeft: Radius.circular(16),
topRight: Radius.circular(16),
)),
child: Container(
decoration: const BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.only(
topLeft: Radius.circular(16),
topRight: Radius.circular(16),
)),
width: double.infinity,
height: _responsiveUtils.getSizeScreenHeight(context) * 0.7,
child: ClipRRect(
borderRadius: const BorderRadius.only(
topLeft: Radius.circular(16),
topRight: Radius.circular(16)),
child: _buildRulesFilterFormOnTablet(context)
)
)
)),
)
),
desktop: Scaffold(
backgroundColor: Colors.black38,
body: GestureDetector(
onTap: () => FocusScope.of(context).unfocus(),
child: Align(alignment: Alignment.center, child: Card(
color: Colors.transparent,
shape: const RoundedRectangleBorder(
borderRadius: BorderRadius.all(Radius.circular(16))),
child: Container(
decoration: const BoxDecoration(
color: Colors.white,
borderRadius: BorderRadius.all(Radius.circular(16))),
width: _responsiveUtils.getSizeScreenWidth(context) * 0.6,
height: _responsiveUtils.getSizeScreenHeight(context) * 0.7,
child: ClipRRect(
borderRadius: const BorderRadius.all(Radius.circular(16)),
child: _buildRulesFilterFormOnDesktop(context)
)
)
)
),
)
)
);
}
Widget _buildRulesFilterFormOnDesktop(BuildContext context) {
return Column(crossAxisAlignment: CrossAxisAlignment.start, children: [
Align(
alignment: Alignment.centerRight,
child: buildIconWeb(
icon: SvgPicture.asset(
_imagePaths.icCloseMailbox,
fit: BoxFit.fill),
tooltip: AppLocalizations.of(context).close,
onTap: () => controller.closeView(context)),
),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 8.0),
child: (EmailsForwardInputWithDropListFieldBuilder(
AppLocalizations.of(context).emailForwardLabel,
controller.inputEmailForwardController)
..addOnSelectedSuggestionAction((newEmailAddress) {
controller.addToListEmailForwards(newEmailAddress);
controller.clearAll();
})
..addOnSummitedCallbackAction((pattern) {
if (pattern != null && pattern.trim().isNotEmpty) {
controller.addToListEmailForwards(EmailAddress(null, pattern.trim()));
controller.clearAll();
}
})
..addOnSuggestionCallbackAction((pattern) {
if (pattern != null) {
controller.getAutoCompleteSuggestion(word: pattern.trim());
}
}))
.build(),
),
Expanded(
child: Obx(() => ListView.builder(
itemCount: controller.listEmailForwards.length,
itemBuilder: (BuildContext context, int index) {
final item = controller.listEmailForwards[index];
return EmailForwardCreatorItemWidget(
emailForward: item.emailAddress,
onDelete: () {
controller.listEmailForwards.removeAt(index);
}
);
},
)),
),
]);
}
Widget _buildRulesFilterFormOnTablet(BuildContext context) {
return Column(crossAxisAlignment: CrossAxisAlignment.start, children: [
Align(
alignment: Alignment.centerRight,
child: buildIconWeb(
icon: SvgPicture.asset(
_imagePaths.icCloseMailbox,
fit: BoxFit.fill),
tooltip: AppLocalizations.of(context).close,
onTap: () => controller.closeView(context)),
),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 8.0),
child: (EmailsForwardInputWithDropListFieldBuilder(
AppLocalizations.of(context).emailForwardLabel,
controller.inputEmailForwardController)
..addOnSelectedSuggestionAction((newEmailAddress) {
controller.addToListEmailForwards(newEmailAddress);
controller.clearAll();
})
..addOnSummitedCallbackAction((pattern) {
if (pattern != null && pattern.trim().isNotEmpty) {
controller.addToListEmailForwards(EmailAddress(null, pattern.trim()));
controller.clearAll();
}
})
..addOnSuggestionCallbackAction((pattern) {
if (pattern != null) {
controller.getAutoCompleteSuggestion(word: pattern.trim());
}
}))
.build(),
),
Expanded(
child: Obx(() => ListView.builder(
itemCount: controller.listEmailForwards.length,
itemBuilder: (BuildContext context, int index) {
final item = controller.listEmailForwards[index];
return EmailForwardCreatorItemWidget(
emailForward: item.emailAddress,
onDelete: () {
controller.listEmailForwards.removeAt(index);
}
);
},
)),
),
]);
}
Widget _buildRulesFilterFormOnMobile(BuildContext context) {
return Column(crossAxisAlignment: CrossAxisAlignment.start, children: [
Align(
alignment: Alignment.centerRight,
child: buildIconWeb(
icon: SvgPicture.asset(
_imagePaths.icCloseMailbox,
fit: BoxFit.fill),
tooltip: AppLocalizations.of(context).close,
onTap: () => controller.closeView(context)),
),
Padding(
padding: const EdgeInsets.symmetric(horizontal: 8.0),
child: (EmailsForwardInputWithDropListFieldBuilder(
AppLocalizations.of(context).emailForwardLabel,
controller.inputEmailForwardController)
..addOnSelectedSuggestionAction((newEmailAddress) {
controller.addToListEmailForwards(newEmailAddress);
controller.clearAll();
})
..addOnSummitedCallbackAction((pattern) {
if (pattern != null && pattern.trim().isNotEmpty) {
controller.addToListEmailForwards(EmailAddress(null, pattern.trim()));
controller.clearAll();
}
})
..addOnSuggestionCallbackAction((pattern) {
if (pattern != null) {
controller.getAutoCompleteSuggestion(word: pattern.trim());
}
}))
.build(),
),
Expanded(
child: Obx(() => ListView.builder(
itemCount: controller.listEmailForwards.length,
itemBuilder: (BuildContext context, int index) {
final item = controller.listEmailForwards[index];
return EmailForwardCreatorItemWidget(
emailForward: item.emailAddress,
onDelete: () {
controller.listEmailForwards.removeAt(index);
}
);
},
)),
),
]);
}
Widget _buildButtonAddNewEmailsForward(BuildContext context) {
if (!_responsiveUtils.isMobile(context)) {
return (ButtonBuilder(_imagePaths.icAddEmailForward)
..key(const Key('button_add_emails_forward_creator'))
..decoration(BoxDecoration(
borderRadius: BorderRadius.circular(10),
color: AppColor.colorTextButton))
..paddingIcon(const EdgeInsets.only(right: 8))
..iconColor(Colors.white)
..maxWidth(130)
..size(20)
..radiusSplash(10)
..padding(const EdgeInsets.symmetric(vertical: 12))
..textStyle(const TextStyle(
fontSize: 17,
color: Colors.white,
fontWeight: FontWeight.w500,
))
..onPressActionClick(() => controller.addEmailForwards(context))
..text(
AppLocalizations.of(context).addEmailForward,
isVertical: false,
))
.build();
} else {
return (ButtonBuilder(_imagePaths.icAddEmailForward)
..key(const Key('button_add_emails_forward_creator'))
..decoration(BoxDecoration(
borderRadius: BorderRadius.circular(10),
color: AppColor.colorTextButton))
..paddingIcon(const EdgeInsets.only(right: 8))
..iconColor(Colors.white)
..size(20)
..radiusSplash(10)
..padding(const EdgeInsets.symmetric(vertical: 12))
..textStyle(const TextStyle(
fontSize: 17,
color: Colors.white,
fontWeight: FontWeight.w500,
))
..onPressActionClick(() => controller.addEmailForwards(context))
..text(
AppLocalizations.of(context).addEmailForward,
isVertical: false,
))
.build();
}
}
}
@@ -1,72 +0,0 @@
import 'package:contact/data/datasource/auto_complete_datasource.dart';
import 'package:contact/data/datasource_impl/tmail_contact_datasource_impl.dart';
import 'package:contact/data/network/contact_api.dart';
import 'package:core/data/model/source_type/data_source_type.dart';
import 'package:get/get.dart';
import 'package:tmail_ui_user/features/base/base_bindings.dart';
import 'package:tmail_ui_user/features/mailbox/data/datasource/mailbox_datasource.dart';
import 'package:tmail_ui_user/features/mailbox/data/datasource/state_datasource.dart';
import 'package:tmail_ui_user/features/mailbox/data/datasource_impl/mailbox_cache_datasource_impl.dart';
import 'package:tmail_ui_user/features/mailbox/data/datasource_impl/state_datasource_impl.dart';
import 'package:tmail_ui_user/features/mailbox/data/repository/mailbox_repository_impl.dart';
import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart';
import 'package:tmail_ui_user/features/mailbox/domain/usecases/get_all_mailbox_interactor.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_tree_builder.dart';
import 'package:tmail_ui_user/features/mailbox_creator/domain/usecases/verify_name_interactor.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/bindings/autocomplete_bindings.dart';
import 'package:tmail_ui_user/features/rules_filter_creator/presentation/rules_filter_creator_controller.dart';
class MailsForwardCreatorBindings extends BaseBindings {
@override
void dependencies() {
_bindingsUtils();
super.dependencies();
}
void _bindingsUtils() {
Get.lazyPut(() => AutoCompleteBindings());
}
@override
void bindingsController() {
Get.lazyPut(() => RulesFilterCreatorController(
Get.find<VerifyNameInteractor>(),
Get.find<GetAllMailboxInteractor>(),
Get.find<TreeBuilder>()
));
}
@override
void bindingsDataSource() {
Get.lazyPut<AutoCompleteDataSource>(() => Get.find<TMailContactDataSourceImpl>());
Get.lazyPut<StateDataSource>(() => Get.find<StateDataSourceImpl>());
}
@override
void bindingsDataSourceImpl() {
Get.lazyPut(() => TMailContactDataSourceImpl(Get.find<ContactAPI>()));
}
@override
void bindingsInteractor() {
Get.lazyPut(() => VerifyNameInteractor());
Get.lazyPut(() => GetAllMailboxInteractor(Get.find<MailboxRepository>()));
}
@override
void bindingsRepository() {
Get.lazyPut<MailboxRepository>(() => Get.find<MailboxRepositoryImpl>());
}
@override
void bindingsRepositoryImpl() {
Get.lazyPut(() => MailboxRepositoryImpl(
{
DataSourceType.network: Get.find<MailboxDataSource>(),
DataSourceType.local: Get.find<MailboxCacheDataSourceImpl>()
},
Get.find<StateDataSource>(),
));
}
}
@@ -1,12 +1,13 @@
import 'package:equatable/equatable.dart';
import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/core/session/session.dart';
class MailsForwardCreatorArguments with EquatableMixin {
final AccountId accountId;
MailsForwardCreatorArguments(this.accountId);
final Session? session;
MailsForwardCreatorArguments(this.accountId, this.session);
@override
List<Object?> get props => [accountId];
List<Object?> get props => [accountId, session];
}
@@ -0,0 +1,43 @@
import 'package:core/core.dart';
import 'package:flutter/material.dart';
import 'package:flutter_svg/flutter_svg.dart';
import 'package:get/get.dart';
class EmailForwardCreatorItemWidget extends StatelessWidget {
final _responsiveUtils = Get.find<ResponsiveUtils>();
final _imagePaths = Get.find<ImagePaths>();
final VoidCallback onDelete;
final String emailForward;
EmailForwardCreatorItemWidget({
Key? key,
required this.emailForward,
required this.onDelete,
}) : super(key: key);
@override
Widget build(BuildContext context) {
return Container(
padding: EdgeInsets.only(
top: 15,
bottom: 15,
left: _responsiveUtils.isMobile(context) ? 16 : 24,
right: _responsiveUtils.isMobile(context) ? 0 : 24),
color: Colors.white,
child: Row(crossAxisAlignment: CrossAxisAlignment.center, children: [
Text(emailForward,
style: const TextStyle(
fontSize: 16,
fontWeight: FontWeight.w400,
color: Colors.black)),
const Spacer(),
buildIconWeb(
icon: SvgPicture.asset(
_imagePaths.icDeleteEmailAddress,
fit: BoxFit.fill,
),
onTap: onDelete),
]),
);
}
}
@@ -0,0 +1,37 @@
import 'package:core/core.dart';
import 'package:flutter/material.dart';
class EmailsForwardInputDecorationBuilder extends InputDecorationBuilder {
@override
InputDecoration build() {
return InputDecoration(
enabledBorder: enabledBorder ?? const OutlineInputBorder(
borderRadius: BorderRadius.all(Radius.circular(10)),
borderSide: BorderSide(width: 1, color: AppColor.colorInputBorderCreateMailbox)),
focusedBorder: enabledBorder ?? const OutlineInputBorder(
borderRadius: BorderRadius.all(Radius.circular(10)),
borderSide: BorderSide(width: 1, color: AppColor.colorTextButton)),
errorBorder: errorBorder ?? const OutlineInputBorder(
borderRadius: BorderRadius.all(Radius.circular(10)),
borderSide: BorderSide(width: 1, color: AppColor.colorInputBorderErrorVerifyName)),
focusedErrorBorder: errorBorder ?? const OutlineInputBorder(
borderRadius: BorderRadius.all(Radius.circular(10)),
borderSide: BorderSide(width: 1, color: AppColor.colorInputBorderErrorVerifyName)),
prefixText: prefixText,
labelText: labelText,
floatingLabelBehavior: FloatingLabelBehavior.never,
labelStyle: labelStyle ?? const TextStyle(color: Colors.black, fontSize: 16),
hintText: hintText,
isDense: true,
hintStyle: hintStyle ?? const TextStyle(color: AppColor.colorHintInputCreateMailbox, fontSize: 16),
contentPadding: contentPadding ?? const EdgeInsets.symmetric(horizontal: 12, vertical: 12),
errorText: errorText,
errorStyle: errorTextStyle ?? const TextStyle(color: AppColor.colorInputBorderErrorVerifyName, fontSize: 13),
filled: true,
fillColor: errorText?.isNotEmpty == true
? AppColor.colorInputBackgroundErrorVerifyName
: AppColor.colorInputBackgroundCreateMailbox);
}
}
@@ -0,0 +1,91 @@
import 'package:core/core.dart';
import 'package:flutter/material.dart';
import 'package:flutter_typeahead/flutter_typeahead.dart';
import 'package:jmap_dart_client/jmap/mail/email/email_address.dart';
import 'package:tmail_ui_user/features/mails_forward_creator/presentation/widgets/emails_forward_input_decoration_builder.dart';
typedef OnSelectedSuggestionAction = Function(EmailAddress emailAddress);
typedef OnSuggestionCallbackAction = Function(String? pattern);
typedef OnSummitedCallbackAction = Function(String? pattern);
class EmailsForwardInputWithDropListFieldBuilder {
final String hintText;
final TextEditingController editingController;
OnSelectedSuggestionAction? _onSelectedSuggestionAction;
OnSuggestionCallbackAction? _onSuggestionCallbackAction;
OnSummitedCallbackAction? _onSummitedCallbackAction;
EmailsForwardInputWithDropListFieldBuilder(
this.hintText,
this.editingController,
);
void addOnSelectedSuggestionAction(OnSelectedSuggestionAction action) {
_onSelectedSuggestionAction = action;
}
void addOnSuggestionCallbackAction(OnSuggestionCallbackAction action) {
_onSuggestionCallbackAction = action;
}
void addOnSummitedCallbackAction(OnSummitedCallbackAction action) {
_onSummitedCallbackAction = action;
}
Widget build() {
return Column(crossAxisAlignment: CrossAxisAlignment.start, children: [
const SizedBox(height: 8),
TypeAheadFormField<EmailAddress>(
textFieldConfiguration: TextFieldConfiguration(
controller: editingController,
onSubmitted: (pattern) {
if (_onSummitedCallbackAction != null) {
_onSummitedCallbackAction!(pattern);
}
},
textInputAction: TextInputAction.done,
decoration: (EmailsForwardInputDecorationBuilder()
..setContentPadding(const EdgeInsets.symmetric(
vertical: BuildUtils.isWeb ? 16 : 12,
horizontal: 12))
..setHintText(hintText))
.build()
),
debounceDuration: const Duration(milliseconds: 500),
suggestionsCallback: (pattern) async {
if (_onSuggestionCallbackAction != null) {
return _onSuggestionCallbackAction!(pattern);
} else {
return [];
}
},
itemBuilder: (BuildContext context, emailAddress) {
return Padding(
padding: const EdgeInsets.symmetric(horizontal: 16, vertical: 14),
child: Text(emailAddress.email ?? '',
style: const TextStyle(
fontSize: 14,
fontWeight: FontWeight.normal,
color: Colors.black)),
);
},
onSuggestionSelected: (emailSelected) {
if (_onSelectedSuggestionAction != null) {
_onSelectedSuggestionAction!(emailSelected);
}
},
suggestionsBoxDecoration: SuggestionsBoxDecoration(
borderRadius: BorderRadius.circular(14)
),
noItemsFoundBuilder: (context) => const SizedBox(),
hideOnEmpty: true,
hideOnError: true,
hideOnLoading: true,
)
]);
}
}
@@ -13,6 +13,9 @@ import 'package:pointer_interceptor/pointer_interceptor.dart';
import 'package:tmail_ui_user/features/base/base_controller.dart';
import 'package:tmail_ui_user/features/manage_account/domain/model/delete_recipient_in_forwarding_request.dart';
import 'package:tmail_ui_user/features/manage_account/domain/state/delete_recipient_in_forwarding_state.dart';
import 'package:jmap_dart_client/jmap/mail/email/email_address.dart';
import 'package:tmail_ui_user/features/base/base_controller.dart';
import 'package:tmail_ui_user/features/mails_forward_creator/presentation/model/mails_forward_creator_arguments.dart';
import 'package:tmail_ui_user/features/manage_account/domain/state/get_forward_state.dart';
import 'package:tmail_ui_user/features/manage_account/domain/usecases/delete_recipient_in_forwarding_interactor.dart';
import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_forward_interactor.dart';
@@ -216,18 +219,17 @@ class ForwardController extends BaseController {
void goToAddEmailsForward() async {
final accountId = _accountDashBoardController.accountId.value;
if (accountId != null) {
// final newEmailRuleFilter = await push(
// AppRoutes.EMAILS_FORWARD_CREATOR,
// arguments: RulesFilterCreatorArguments(accountId));
//
// if (newEmailRuleFilter is TMailRule) {
// _createNewRuleFilterAction(
// accountId,
// CreateNewEmailRuleFilterRequest(
// listEmailRule,
// newEmailRuleFilter)
// );
// }
final listEmail = await push(
AppRoutes.EMAILS_FORWARD_CREATOR,
arguments: MailsForwardCreatorArguments(accountId, _accountDashBoardController.sessionCurrent.value));
if (listEmail is List<EmailAddress>) {
_addEmailsForward(listEmail);
}
}
}
void _addEmailsForward(List<EmailAddress> listEmailAddress) {
}
}
@@ -2140,4 +2140,11 @@ class AppLocalizations {
name: 'addEmailForward',
);
}
String get emailForwardLabel {
return Intl.message(
'Name or Email address',
name: 'emailForwardLabel',
);
}
}
+10 -1
View File
@@ -9,6 +9,8 @@ import 'package:tmail_ui_user/features/home/presentation/home_bindings.dart';
import 'package:tmail_ui_user/features/home/presentation/home_view.dart';
import 'package:tmail_ui_user/features/identity_creator/presentation/identity_creator_bindings.dart';
import 'package:tmail_ui_user/features/identity_creator/presentation/identity_creator_view.dart' deferred as identity_creator;
import 'package:tmail_ui_user/features/mails_forward_creator/presentation/emails_forward_creator_binding.dart';
import 'package:tmail_ui_user/features/mails_forward_creator/presentation/emails_forward_creator_view.dart' deferred as emails_forward_creator;
import 'package:tmail_ui_user/features/rules_filter_creator/presentation/rules_filter_creator_bindings.dart';
import 'package:tmail_ui_user/features/rules_filter_creator/presentation/rules_filter_creator_view.dart' deferred as rules_filter_creator;
import 'package:tmail_ui_user/features/login/presentation/login_bindings.dart';
@@ -80,5 +82,12 @@ class AppPages {
rules_filter_creator.loadLibrary,
() => rules_filter_creator.RuleFilterCreatorView()),
binding: RulesFilterCreatorBindings()),
];
GetPage(
name: AppRoutes.EMAILS_FORWARD_CREATOR,
opaque: false,
page: () => DeferredWidget(
emails_forward_creator.loadLibrary,
() => emails_forward_creator.EmailsForwardCreatorView()),
binding: EmailsForwardCreatorBindings()),
];
}