diff --git a/lib/features/composer/presentation/composer_bindings.dart b/lib/features/composer/presentation/composer_bindings.dart index b00c91ecc..bca0d1dba 100644 --- a/lib/features/composer/presentation/composer_bindings.dart +++ b/lib/features/composer/presentation/composer_bindings.dart @@ -5,17 +5,23 @@ import 'package:get/get.dart'; import 'package:html_editor_enhanced/html_editor.dart'; import 'package:tmail_ui_user/features/composer/data/datasource/autocomplete_datasource.dart'; import 'package:tmail_ui_user/features/composer/data/datasource/composer_datasource.dart'; +import 'package:tmail_ui_user/features/composer/data/datasource/contact_datasource.dart'; import 'package:tmail_ui_user/features/composer/data/datasource_impl/autocomplete_datasource_impl.dart'; import 'package:tmail_ui_user/features/composer/data/datasource_impl/composer_datasource_impl.dart'; +import 'package:tmail_ui_user/features/composer/data/datasource_impl/contact_datasource_impl.dart'; import 'package:tmail_ui_user/features/composer/data/datasource_impl/local_autocomplete_datasource_impl.dart'; import 'package:tmail_ui_user/features/composer/data/datasource_impl/local_composer_datasource_impl.dart'; import 'package:tmail_ui_user/features/composer/data/local/email_address_database_manager.dart'; import 'package:tmail_ui_user/features/composer/data/repository/auto_complete_repository_impl.dart'; import 'package:tmail_ui_user/features/composer/data/repository/composer_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/composer_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_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/composer/domain/usecases/save_email_addresses_interactor.dart'; -import 'package:tmail_ui_user/features/composer/domain/usecases/search_email_address_interactor.dart'; +import 'package:tmail_ui_user/features/composer/domain/usecases/get_autocomplete_interactor.dart'; import 'package:tmail_ui_user/features/composer/domain/usecases/send_email_interactor.dart'; import 'package:tmail_ui_user/features/composer/presentation/composer_controller.dart'; import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart'; @@ -43,14 +49,23 @@ class ComposerBindings extends Bindings { DataSourceType.local: Get.find(), })); Get.lazyPut(() => Get.find()); - Get.lazyPut(() => SearchEmailAddressInteractor(Get.find())); + Get.lazyPut(() => GetAutoCompleteInteractor(Get.find())); Get.lazyPut(() => Uuid()); Get.lazyPut(() => HtmlEditorController()); Get.lazyPut(() => TextEditingController()); + Get.lazyPut(() => ContactDataSourceImpl()); + Get.lazyPut(() => Get.find()); + Get.lazyPut(() => ContactRepositoryImpl(Get.find())); + Get.lazyPut(() => Get.find()); + Get.lazyPut(() => GetDeviceContactSuggestionsInteractor(Get.find())); + Get.lazyPut(() => GetAutoCompleteWithDeviceContactInteractor( + Get.find(), + Get.find())); Get.lazyPut(() => ComposerController( Get.find(), Get.find(), - Get.find(), + Get.find(), + Get.find(), Get.find(), Get.find(), Get.find(), diff --git a/lib/features/composer/presentation/composer_controller.dart b/lib/features/composer/presentation/composer_controller.dart index 1f0b49f18..93fa86ca4 100644 --- a/lib/features/composer/presentation/composer_controller.dart +++ b/lib/features/composer/presentation/composer_controller.dart @@ -15,12 +15,15 @@ import 'package:jmap_dart_client/jmap/mail/email/email_address.dart'; import 'package:jmap_dart_client/jmap/mail/email/email_body_part.dart'; import 'package:jmap_dart_client/jmap/mail/email/email_body_value.dart'; import 'package:model/model.dart'; +import 'package:permission_handler/permission_handler.dart'; import 'package:tmail_ui_user/features/base/base_controller.dart'; import 'package:tmail_ui_user/features/composer/domain/model/auto_complete_pattern.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/state/search_email_address_state.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/composer/domain/usecases/save_email_addresses_interactor.dart'; -import 'package:tmail_ui_user/features/composer/domain/usecases/search_email_address_interactor.dart'; import 'package:tmail_ui_user/features/composer/domain/usecases/send_email_interactor.dart'; import 'package:tmail_ui_user/features/composer/presentation/extensions/email_action_type_extension.dart'; import 'package:tmail_ui_user/features/email/presentation/constants/email_constants.dart'; @@ -39,7 +42,8 @@ class ComposerController extends BaseController { final SendEmailInteractor _sendEmailInteractor; final SaveEmailAddressesInteractor _saveEmailAddressInteractor; - final SearchEmailAddressInteractor _searchEmailAddressInteractor; + final GetAutoCompleteInteractor _getAutoCompleteInteractor; + final GetAutoCompleteWithDeviceContactInteractor _getAutoCompleteWithDeviceContactInteractor; final AppToast _appToast; final Uuid _uuid; final HtmlEditorController composerEditorController; @@ -50,13 +54,15 @@ class ComposerController extends BaseController { List listCcEmailAddress = []; List listBccEmailAddress = []; String? _subjectEmail; + ContactSuggestionSource _contactSuggestionSource = ContactSuggestionSource.localContact; void setSubjectEmail(String subject) => _subjectEmail = subject; ComposerController( this._sendEmailInteractor, this._saveEmailAddressInteractor, - this._searchEmailAddressInteractor, + this._getAutoCompleteInteractor, + this._getAutoCompleteWithDeviceContactInteractor, this._appToast, this._uuid, this.composerEditorController, @@ -68,7 +74,8 @@ class ComposerController extends BaseController { void onReady() async { super.onReady(); _getSelectedEmail(); - await searchEmailAddressSuggestion(''); + + Future.delayed(Duration(milliseconds: 500), () => _checkContactPermission()); } @override @@ -274,11 +281,29 @@ class ComposerController extends BaseController { _saveEmailAddressInteractor.execute(listEmailAddressCanSave.toList()); } - Future> searchEmailAddressSuggestion(String word) async { - return await _searchEmailAddressInteractor.execute(AutoCompletePattern(word: word)) + 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> getAutoCompleteSuggestion(String word) async { + if (_contactSuggestionSource == ContactSuggestionSource.all) { + return await _getAutoCompleteWithDeviceContactInteractor.execute(AutoCompletePattern(word: word)) + .then((value) => value.fold( + (failure) => [], + (success) => success is GetAutoCompleteSuccess ? success.listEmailAddress : [])); + } + return await _getAutoCompleteInteractor.execute(AutoCompletePattern(word: word)) .then((value) => value.fold( - (failure) => [], - (success) => success is SearchEmailAddressSuccess ? success.listEmailAddress : [])); + (failure) => [], + (success) => success is GetAutoCompleteSuccess ? success.listEmailAddress : [])); } void backToEmailViewAction() { diff --git a/lib/features/composer/presentation/composer_view.dart b/lib/features/composer/presentation/composer_view.dart index c011f0d60..11ecf5ecf 100644 --- a/lib/features/composer/presentation/composer_view.dart +++ b/lib/features/composer/presentation/composer_view.dart @@ -84,7 +84,7 @@ class ComposerView extends GetWidget { controller.composerArguments.value?.userProfile) ..addExpandAddressActionClick(() => controller.expandEmailAddressAction()) ..addOnUpdateListEmailAddressAction((prefixEmailAddress, listEmailAddress) => controller.updateListEmailAddress(prefixEmailAddress, listEmailAddress)) - ..addOnSuggestionEmailAddress((word) => controller.searchEmailAddressSuggestion(word))) + ..addOnSuggestionEmailAddress((word) => controller.getAutoCompleteSuggestion(word))) .build() ); }