create suggest box email

This commit is contained in:
ManhNTX
2022-06-29 01:39:07 +07:00
committed by Dat H. Pham
parent 7ca8b83822
commit 0c3391f76c
20 changed files with 633 additions and 90 deletions
@@ -2,10 +2,16 @@ import 'package:collection/collection.dart';
import 'package:core/core.dart';
import 'package:flutter/material.dart';
import 'package:get/get.dart';
import 'package:model/mailbox/presentation_mailbox.dart';
import 'package:tmail_ui_user/features/base/base_controller.dart';
import 'package:jmap_dart_client/jmap/mail/email/email_address.dart';
import 'package:model/model.dart';
import 'package:permission_handler/permission_handler.dart';
import 'package:tmail_ui_user/features/composer/domain/model/contact_suggestion_source.dart';
import 'package:tmail_ui_user/features/composer/domain/state/get_autocomplete_state.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/destination_picker/presentation/model/destination_picker_arguments.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/bindings/advanced_filter_bindings.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/search_controller.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/email_receive_time_type.dart';
@@ -13,33 +19,59 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/sear
import 'package:tmail_ui_user/main/routes/app_routes.dart';
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
class AdvancedFilterController extends BaseController {
class AdvancedFilterController extends GetxController {
late GetAutoCompleteWithDeviceContactInteractor
_getAutoCompleteWithDeviceContactInteractor;
late GetAutoCompleteInteractor _getAutoCompleteInteractor;
final dateFilterSelectedFormAdvancedSearch = EmailReceiveTimeType.allTime.obs;
final hasAttachment = false.obs;
final listEmailAddressInit = RxList<EmailAddress>();
final listTagFromSelected = RxList<String>();
final listTagToSelected = RxList<String>();
TextEditingController fromFilterInputController = TextEditingController();
TextEditingController toFilterInputController = TextEditingController();
TextEditingController subjectFilterInputController = TextEditingController();
TextEditingController hasKeyWordFilterInputController = TextEditingController();
TextEditingController notKeyWordFilterInputController = TextEditingController();
TextEditingController hasKeyWordFilterInputController =
TextEditingController();
TextEditingController notKeyWordFilterInputController =
TextEditingController();
TextEditingController dateFilterInputController = TextEditingController();
TextEditingController mailBoxFilterInputController = TextEditingController();
ContactSuggestionSource _contactSuggestionSource =
ContactSuggestionSource.tMailContact;
final SearchController _searchController = Get.find<SearchController>();
final MailboxDashBoardController _mailboxDashBoardController = Get.find<MailboxDashBoardController>();
final MailboxDashBoardController _mailboxDashBoardController =
Get.find<MailboxDashBoardController>();
SearchEmailFilter get _searchEmailFilter => _searchController.searchEmailFilter.value;
AdvancedFilterController() {
AdvancedFilterBindings().dependencies();
_getAutoCompleteWithDeviceContactInteractor =
Get.find<GetAutoCompleteWithDeviceContactInteractor>();
_getAutoCompleteInteractor = Get.find<GetAutoCompleteInteractor>();
}
selectOpenAdvanceSearch() {
SearchEmailFilter get searchEmailFilter =>
_searchController.searchEmailFilter.value;
@override
void onReady() async {
if (!BuildUtils.isWeb) {
Future.delayed(
const Duration(milliseconds: 500), () => _checkContactPermission());
}
super.onReady();
}
void selectOpenAdvanceSearch() {
_searchController.isAdvancedSearchViewOpen.toggle();
}
cleanSearchFilter(BuildContext context) {
void cleanSearchFilter(BuildContext context) {
_searchController.cleanSearchFilter();
dateFilterSelectedFormAdvancedSearch.value = EmailReceiveTimeType.allTime;
fromFilterInputController.text = '';
toFilterInputController.text = '';
listTagFromSelected.clear();
listTagToSelected.clear();
subjectFilterInputController.text = '';
hasKeyWordFilterInputController.text = '';
notKeyWordFilterInputController.text = '';
@@ -47,56 +79,102 @@ class AdvancedFilterController extends BaseController {
hasAttachment.value = false;
_searchController.isAdvancedSearchHasApply.value = false;
_searchController.isAdvancedSearchViewOpen.toggle();
_mailboxDashBoardController.searchEmail(context, StringConvert.writeNullToEmpty(_searchEmailFilter.text?.value));
_mailboxDashBoardController.searchEmail(
context, StringConvert.writeNullToEmpty(searchEmailFilter.text?.value));
}
void _updateFilterEmailFromAdvancedSearchView() {
if (fromFilterInputController.text.isNotEmpty) {
_searchController.updateFilterEmail(from: fromFilterInputController.text.split(',').toSet());
if (listTagFromSelected.isNotEmpty) {
_searchController.updateFilterEmail(
from: listTagFromSelected.toSet());
} else {
_searchController.updateFilterEmail(from: {});
}
if (toFilterInputController.text.isNotEmpty) {
_searchController.updateFilterEmail(to: toFilterInputController.text.split(',').toSet());
if (listTagToSelected.isNotEmpty) {
_searchController.updateFilterEmail(
to: listTagToSelected.toSet());
} else {
_searchController.updateFilterEmail(to: {});
}
if (hasKeyWordFilterInputController.text.isNotEmpty) {
_searchController.updateFilterEmail(hasKeyword: hasKeyWordFilterInputController.text.split(',').toSet());
_searchController.updateFilterEmail(
hasKeyword: hasKeyWordFilterInputController.text.split(',').toSet());
} else {
_searchController.updateFilterEmail(hasKeyword: {});
}
if (notKeyWordFilterInputController.text.isNotEmpty) {
_searchController.updateFilterEmail(notKeyword: notKeyWordFilterInputController.text.split(',').toSet());
_searchController.updateFilterEmail(
notKeyword: notKeyWordFilterInputController.text.split(',').toSet());
} else {
_searchController.updateFilterEmail(notKeyword: {});
}
_searchController.updateFilterEmail(
subject: StringConvert.writeEmptyToNull(subjectFilterInputController.text),
subject:
StringConvert.writeEmptyToNull(subjectFilterInputController.text),
emailReceiveTimeType: dateFilterSelectedFormAdvancedSearch.value,
hasAttachment: hasAttachment.value,
);
}
Future<void> selectedMailBox() async{
final PresentationMailbox destinationMailbox = await push(
AppRoutes.DESTINATION_PICKER,
arguments: DestinationPickerArguments(_mailboxDashBoardController.accountId.value!, MailboxActions.moveEmail));
_searchController.updateFilterEmail(mailbox: destinationMailbox);
mailBoxFilterInputController.text = StringConvert.writeNullToEmpty(destinationMailbox.name?.name);
}
applyAdvancedSearchFilter(BuildContext context){
_updateFilterEmailFromAdvancedSearchView();
_mailboxDashBoardController.searchEmail(context, StringConvert.writeNullToEmpty(_searchEmailFilter.text?.value));
_searchController.isAdvancedSearchViewOpen.toggle();
_searchController.isAdvancedSearchHasApply.value = _checkAdvancedSearchHasApply();
Future<void> selectedMailBox() async {
final PresentationMailbox destinationMailbox = await push(
AppRoutes.DESTINATION_PICKER,
arguments: DestinationPickerArguments(
_mailboxDashBoardController.accountId.value!,
MailboxActions.moveEmail));
_searchController.updateFilterEmail(mailbox: destinationMailbox);
mailBoxFilterInputController.text =
StringConvert.writeNullToEmpty(destinationMailbox.name?.name);
}
bool _checkAdvancedSearchHasApply() {
return fromFilterInputController.text.isNotEmpty ||
toFilterInputController.text.isNotEmpty ||
void applyAdvancedSearchFilter(BuildContext context) {
_updateFilterEmailFromAdvancedSearchView();
_mailboxDashBoardController.searchEmail(
context, StringConvert.writeNullToEmpty(searchEmailFilter.text?.value));
_searchController.isAdvancedSearchViewOpen.toggle();
_searchController.isAdvancedSearchHasApply.value =
_checkAdvancedSearchHasApply();
}
void _checkContactPermission() async {
final permissionStatus = await Permission.contacts.status;
if (permissionStatus.isGranted) {
_contactSuggestionSource = ContactSuggestionSource.all;
} else if (!permissionStatus.isPermanentlyDenied) {
final requestedPermission = await Permission.contacts.request();
_contactSuggestionSource = requestedPermission == PermissionStatus.granted
? ContactSuggestionSource.all
: _contactSuggestionSource;
}
}
Future<List<EmailAddress>> getAutoCompleteSuggestion(
{required String word}) async {
if (_contactSuggestionSource == ContactSuggestionSource.all) {
return await _getAutoCompleteWithDeviceContactInteractor
.execute(AutoCompletePattern(
word: word,
accountId: _mailboxDashBoardController.accountId.value))
.then((value) => value.fold(
(failure) => <EmailAddress>[],
(success) => success is GetAutoCompleteSuccess
? success.listEmailAddress
: <EmailAddress>[]));
}
return await _getAutoCompleteInteractor
.execute(AutoCompletePattern(
word: word, accountId: _mailboxDashBoardController.accountId.value))
.then((value) => value.fold(
(failure) => <EmailAddress>[],
(success) => success is GetAutoCompleteSuccess
? success.listEmailAddress
: <EmailAddress>[]));
}
bool _checkAdvancedSearchHasApply() {
return listTagFromSelected.isNotEmpty ||
listTagToSelected.isNotEmpty ||
subjectFilterInputController.text.isNotEmpty ||
hasKeyWordFilterInputController.text.isNotEmpty ||
notKeyWordFilterInputController.text.isNotEmpty ||
@@ -105,32 +183,33 @@ class AdvancedFilterController extends BaseController {
hasAttachment.isTrue;
}
initSearchFilterField(BuildContext context) {
_searchController.updateFilterEmail(mailbox: _mailboxDashBoardController.selectedMailbox.value);
fromFilterInputController.text = StringConvert.writeNullToEmpty(_searchEmailFilter.from.firstOrNull);
toFilterInputController.text = StringConvert.writeNullToEmpty(_searchEmailFilter.to.firstOrNull);
subjectFilterInputController.text = StringConvert.writeNullToEmpty(_searchEmailFilter.subject);
hasKeyWordFilterInputController.text = StringConvert.writeNullToEmpty(_searchEmailFilter.hasKeyword.firstOrNull);
notKeyWordFilterInputController.text = StringConvert.writeNullToEmpty(_searchEmailFilter.notKeyword.firstOrNull);
dateFilterInputController.text = StringConvert.writeNullToEmpty(_searchEmailFilter.emailReceiveTimeType.getTitle(context));
mailBoxFilterInputController.text = StringConvert.writeNullToEmpty(_searchEmailFilter.mailbox?.name?.name);
dateFilterSelectedFormAdvancedSearch.value = _searchEmailFilter.emailReceiveTimeType;
hasAttachment.value = _searchEmailFilter.hasAttachment;
void initSearchFilterField(BuildContext context) {
_searchController.updateFilterEmail(
mailbox: _mailboxDashBoardController.selectedMailbox.value);
subjectFilterInputController.text =
StringConvert.writeNullToEmpty(searchEmailFilter.subject);
hasKeyWordFilterInputController.text = StringConvert.writeNullToEmpty(
searchEmailFilter.hasKeyword.firstOrNull);
notKeyWordFilterInputController.text = StringConvert.writeNullToEmpty(
searchEmailFilter.notKeyword.firstOrNull);
dateFilterInputController.text = StringConvert.writeNullToEmpty(
searchEmailFilter.emailReceiveTimeType.getTitle(context));
mailBoxFilterInputController.text =
StringConvert.writeNullToEmpty(searchEmailFilter.mailbox?.name?.name);
dateFilterSelectedFormAdvancedSearch.value =
searchEmailFilter.emailReceiveTimeType;
hasAttachment.value = searchEmailFilter.hasAttachment;
}
@override
void onDone() {
}
void onDone() {}
@override
void onError(error) {
}
void onError(error) {}
@override
void onClose() {
fromFilterInputController.dispose();
subjectFilterInputController.dispose();
toFilterInputController.dispose();
hasKeyWordFilterInputController.dispose();
notKeyWordFilterInputController.dispose();
mailBoxFilterInputController.dispose();
@@ -241,7 +241,6 @@ class MailboxDashBoardController extends ReloadableController {
void setNewFirstSelectedMailbox(PresentationMailbox? newPresentationMailbox) {
selectedMailbox.firstRebuild = true;
selectedMailbox.value = newPresentationMailbox;
}
void setSelectedEmail(PresentationEmail? newPresentationEmail) {
@@ -92,7 +92,7 @@ class SearchController extends BaseController {
return;
case QuickSearchFilter.fromMe:
quickSearchFilterSelected
? searchEmailFilter.value.from.remove(userProfile.email)
? searchEmailFilter.value.from.removeWhere((e) => e == userProfile.email)
: searchEmailFilter.value.from.add(userProfile.email);
updateFilterEmail(from: searchEmailFilter.value.from);
return;
@@ -195,7 +195,7 @@ class SearchController extends BaseController {
}
return searchEmailFilter.value.emailReceiveTimeType == EmailReceiveTimeType.last7Days;
case QuickSearchFilter.fromMe:
return searchEmailFilter.value.from.contains(userProfile.email) && searchEmailFilter.value.from.length == 1;
return searchEmailFilter.value.from.contains( userProfile.email) && searchEmailFilter.value.from.length == 1;
}
}