From 909db3c5df0bf19c61dfc92b336a6dc5ef2ae534 Mon Sep 17 00:00:00 2001 From: dab246 Date: Fri, 13 May 2022 10:48:38 +0700 Subject: [PATCH] TF-548 Inject TmailContactDataSource in composer of TMail --- .../autocomplete_tmail_contact_method.dart | 3 ++- .../lib/contact/model/capability_contact.dart | 4 ++++ contact/lib/contact_module.dart | 4 +++- contact/pubspec.yaml | 6 +++--- .../composer_datasource_impl.dart | 6 ------ .../auto_complete_repository_impl.dart | 6 +++--- .../model/contact_suggestion_source.dart | 2 +- ...omplete_with_device_contact_interactor.dart | 4 +++- .../presentation/composer_bindings.dart | 18 ++++++++++++++---- .../presentation/composer_controller.dart | 12 ++++++++---- .../extensions/session_extension.dart | 9 +++++++++ lib/main/pages/app_pages.dart | 6 ++++-- 12 files changed, 54 insertions(+), 26 deletions(-) create mode 100644 contact/lib/contact/model/capability_contact.dart create mode 100644 lib/features/composer/presentation/extensions/session_extension.dart diff --git a/contact/lib/contact/autocomplete/autocomplete_tmail_contact_method.dart b/contact/lib/contact/autocomplete/autocomplete_tmail_contact_method.dart index f37fd36d0..45b427fd3 100644 --- a/contact/lib/contact/autocomplete/autocomplete_tmail_contact_method.dart +++ b/contact/lib/contact/autocomplete/autocomplete_tmail_contact_method.dart @@ -1,3 +1,4 @@ +import 'package:contact/contact/model/capability_contact.dart'; import 'package:contact/contact/model/contact_filter.dart'; import 'package:contact/core/method/request/autocomplete_method.dart'; import 'package:jmap_dart_client/http/converter/account_id_converter.dart'; @@ -19,7 +20,7 @@ class AutoCompleteTMailContactMethod extends AutoCompleteMethod { @override Set get requiredCapabilities => { CapabilityIdentifier.jmapCore, - CapabilityIdentifier(Uri.parse('com:linagora:params:jmap:contact:autocomplete')) + capabilityContact }; factory AutoCompleteTMailContactMethod.fromJson(Map json) { diff --git a/contact/lib/contact/model/capability_contact.dart b/contact/lib/contact/model/capability_contact.dart new file mode 100644 index 000000000..36363c28f --- /dev/null +++ b/contact/lib/contact/model/capability_contact.dart @@ -0,0 +1,4 @@ + +import 'package:jmap_dart_client/jmap/core/capability/capability_identifier.dart'; + +final capabilityContact = CapabilityIdentifier(Uri.parse('com:linagora:params:jmap:contact:autocomplete')); \ No newline at end of file diff --git a/contact/lib/contact_module.dart b/contact/lib/contact_module.dart index 162ae1045..7b49234bb 100644 --- a/contact/lib/contact_module.dart +++ b/contact/lib/contact_module.dart @@ -9,4 +9,6 @@ export 'data/datasource/auto_complete_datasource.dart'; export 'data/datasource_impl/tmail_contact_datasource_impl.dart'; export 'contact/autocomplete/autocomplete_tmail_contact_method.dart'; -export 'contact/autocomplete/autocomplete_tmail_contact_response.dart'; \ No newline at end of file +export 'contact/autocomplete/autocomplete_tmail_contact_response.dart'; + +export 'contact/model/capability_contact.dart'; \ No newline at end of file diff --git a/contact/pubspec.yaml b/contact/pubspec.yaml index 1e8538689..d72b4133b 100644 --- a/contact/pubspec.yaml +++ b/contact/pubspec.yaml @@ -1,11 +1,11 @@ name: contact description: Contact Module publish_to: 'none' -version: 0.0.1 + +version: 1.0.0+1 environment: - sdk: ">=2.16.1 <3.0.0" - flutter: ">=1.17.0" + sdk: ">=2.14.0 <3.0.0" dependencies: flutter: diff --git a/lib/features/composer/data/datasource_impl/composer_datasource_impl.dart b/lib/features/composer/data/datasource_impl/composer_datasource_impl.dart index a4b972a1e..f2410d3e0 100644 --- a/lib/features/composer/data/datasource_impl/composer_datasource_impl.dart +++ b/lib/features/composer/data/datasource_impl/composer_datasource_impl.dart @@ -1,4 +1,3 @@ -import 'package:jmap_dart_client/jmap/mail/email/email_address.dart'; import 'package:model/model.dart'; import 'package:tmail_ui_user/features/composer/data/datasource/composer_datasource.dart'; import 'package:tmail_ui_user/features/composer/data/network/composer_api.dart'; @@ -9,11 +8,6 @@ class ComposerDataSourceImpl extends ComposerDataSource { ComposerDataSourceImpl(this._composerAPI); - @override - Future saveEmailAddresses(List listEmailAddress) { - throw UnimplementedError(); - } - @override Future uploadAttachment(UploadRequest uploadRequest) { return Future.sync(() async { diff --git a/lib/features/composer/data/repository/auto_complete_repository_impl.dart b/lib/features/composer/data/repository/auto_complete_repository_impl.dart index 73167a3da..cc852147a 100644 --- a/lib/features/composer/data/repository/auto_complete_repository_impl.dart +++ b/lib/features/composer/data/repository/auto_complete_repository_impl.dart @@ -16,9 +16,9 @@ class AutoCompleteRepositoryImpl extends AutoCompleteRepository { await Future.wait(autoCompleteDataSources.map( (datasource) => datasource.getAutoComplete(autoCompletePattern))) - .then((newListEmails) { - for (var emailAddress in newListEmails) { - listEmailAddress.addAll(emailAddress); + .then((newListResult) { + for (var listEmails in newListResult) { + listEmailAddress.addAll(listEmails); } }); diff --git a/lib/features/composer/domain/model/contact_suggestion_source.dart b/lib/features/composer/domain/model/contact_suggestion_source.dart index 7d047b8ea..63e9404ba 100644 --- a/lib/features/composer/domain/model/contact_suggestion_source.dart +++ b/lib/features/composer/domain/model/contact_suggestion_source.dart @@ -1,4 +1,4 @@ enum ContactSuggestionSource { - all, localContact, deviceContact + all, tMailContact, deviceContact } \ No newline at end of file diff --git a/lib/features/composer/domain/usecases/get_autocomplete_with_device_contact_interactor.dart b/lib/features/composer/domain/usecases/get_autocomplete_with_device_contact_interactor.dart index 7b842923b..1afb33f27 100644 --- a/lib/features/composer/domain/usecases/get_autocomplete_with_device_contact_interactor.dart +++ b/lib/features/composer/domain/usecases/get_autocomplete_with_device_contact_interactor.dart @@ -12,7 +12,9 @@ class GetAutoCompleteWithDeviceContactInteractor { final GetAutoCompleteInteractor _getAutoCompleteInteractor; final GetDeviceContactSuggestionsInteractor _getDeviceContactSuggestionsInteractor; - GetAutoCompleteWithDeviceContactInteractor(this._getAutoCompleteInteractor, this._getDeviceContactSuggestionsInteractor); + GetAutoCompleteWithDeviceContactInteractor( + this._getAutoCompleteInteractor, + this._getDeviceContactSuggestionsInteractor); Future> execute(AutoCompletePattern autoCompletePattern) async { try { diff --git a/lib/features/composer/presentation/composer_bindings.dart b/lib/features/composer/presentation/composer_bindings.dart index cabc99e6a..98bfdc668 100644 --- a/lib/features/composer/presentation/composer_bindings.dart +++ b/lib/features/composer/presentation/composer_bindings.dart @@ -1,4 +1,4 @@ -import 'package:contact/data/datasource/auto_complete_datasource.dart'; +import 'package:contact/contact_module.dart'; import 'package:core/core.dart'; import 'package:device_info_plus/device_info_plus.dart'; import 'package:get/get.dart'; @@ -23,6 +23,7 @@ import 'package:tmail_ui_user/features/composer/domain/usecases/get_autocomplete import 'package:tmail_ui_user/features/composer/domain/usecases/send_email_interactor.dart'; import 'package:tmail_ui_user/features/composer/domain/usecases/upload_mutiple_attachment_interactor.dart'; import 'package:tmail_ui_user/features/composer/presentation/composer_controller.dart'; +import 'package:tmail_ui_user/features/composer/presentation/extensions/session_extension.dart'; import 'package:tmail_ui_user/features/email/data/datasource/email_datasource.dart'; import 'package:tmail_ui_user/features/email/data/datasource/html_datasource.dart'; import 'package:tmail_ui_user/features/email/data/datasource_impl/email_datasource_impl.dart'; @@ -32,6 +33,7 @@ import 'package:tmail_ui_user/features/email/data/network/email_api.dart'; import 'package:tmail_ui_user/features/email/data/repository/email_repository_impl.dart'; import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart'; import 'package:tmail_ui_user/features/email/domain/usecases/get_email_content_interactor.dart'; +import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/mailbox_dashboard_controller.dart'; import 'package:tmail_ui_user/features/manage_account/data/datasource/manage_account_datasource.dart'; import 'package:tmail_ui_user/features/manage_account/data/datasource_impl/manage_account_datasource_impl.dart'; import 'package:tmail_ui_user/features/manage_account/data/network/manage_account_api.dart'; @@ -43,6 +45,10 @@ import 'package:uuid/uuid.dart'; import 'package:jmap_dart_client/http/http_client.dart' as jmap_http_client; class ComposerBindings extends BaseBindings { + + final mailboxDashBoardController = Get.find(); + final Set dataSources = {}; + @override void dependencies() { _bindingsUtils(); @@ -56,6 +62,12 @@ class ComposerBindings extends BaseBindings { @override void bindingsDataSourceImpl() { + if (mailboxDashBoardController.sessionCurrent?.hasSupportAutoComplete == true) { + Get.lazyPut(() => ContactAPI(Get.find())); + Get.lazyPut(() => TMailContactDataSourceImpl(Get.find())); + dataSources.add(Get.find()); + } + Get.lazyPut(() => ComposerDataSourceImpl(Get.find())); Get.lazyPut(() => ContactDataSourceImpl()); Get.lazyPut(() => EmailDataSourceImpl(Get.find())); @@ -78,9 +90,7 @@ class ComposerBindings extends BaseBindings { @override void bindingsRepositoryImpl() { Get.lazyPut(() => ComposerRepositoryImpl(Get.find())); - Get.lazyPut(() => AutoCompleteRepositoryImpl({ - Get.find(), - })); + Get.lazyPut(() => AutoCompleteRepositoryImpl(dataSources)); Get.lazyPut(() => ContactRepositoryImpl(Get.find())); Get.lazyPut(() => EmailRepositoryImpl( Get.find(), diff --git a/lib/features/composer/presentation/composer_controller.dart b/lib/features/composer/presentation/composer_controller.dart index 47767ece1..d1c3c9cd5 100644 --- a/lib/features/composer/presentation/composer_controller.dart +++ b/lib/features/composer/presentation/composer_controller.dart @@ -88,7 +88,7 @@ class ComposerController extends BaseController { List listToEmailAddress = []; List listCcEmailAddress = []; List listBccEmailAddress = []; - ContactSuggestionSource _contactSuggestionSource = ContactSuggestionSource.localContact; + ContactSuggestionSource _contactSuggestionSource = ContactSuggestionSource.tMailContact; HtmlEditorApi? htmlEditorApi; final html_editor_browser.HtmlEditorController htmlControllerBrowser = html_editor_browser.HtmlEditorController(processNewLineAsBr: true); @@ -152,7 +152,10 @@ class ComposerController extends BaseController { void onReady() async { _initEmail(); _getAllIdentities(); - Future.delayed(const Duration(milliseconds: 500), () => _checkContactPermission()); + if (!BuildUtils.isWeb) { + Future.delayed(const Duration(milliseconds: 500), () => + _checkContactPermission()); + } super.onReady(); } @@ -579,12 +582,13 @@ class ComposerController extends BaseController { {required String word}) async { if (_contactSuggestionSource == ContactSuggestionSource.all) { return await _getAutoCompleteWithDeviceContactInteractor - .execute(AutoCompletePattern(word: word)) + .execute(AutoCompletePattern(word: word, accountId: mailboxDashBoardController.accountId.value)) .then((value) => value.fold( (failure) => [], (success) => success is GetAutoCompleteSuccess ? success.listEmailAddress : [])); } - return await _getAutoCompleteInteractor.execute(AutoCompletePattern(word: word)) + return await _getAutoCompleteInteractor + .execute(AutoCompletePattern(word: word, accountId: mailboxDashBoardController.accountId.value)) .then((value) => value.fold( (failure) => [], (success) => success is GetAutoCompleteSuccess ? success.listEmailAddress : [])); diff --git a/lib/features/composer/presentation/extensions/session_extension.dart b/lib/features/composer/presentation/extensions/session_extension.dart new file mode 100644 index 000000000..23d473bcb --- /dev/null +++ b/lib/features/composer/presentation/extensions/session_extension.dart @@ -0,0 +1,9 @@ + +import 'package:contact/contact_module.dart' as contact; +import 'package:jmap_dart_client/jmap/core/session/session.dart'; + +extension SessionExtension on Session { + + bool get hasSupportAutoComplete => + capabilities.containsKey(contact.capabilityContact); +} \ No newline at end of file diff --git a/lib/main/pages/app_pages.dart b/lib/main/pages/app_pages.dart index 9e083cc49..0b228965d 100644 --- a/lib/main/pages/app_pages.dart +++ b/lib/main/pages/app_pages.dart @@ -48,8 +48,10 @@ class AppPages { GetPage( name: AppRoutes.COMPOSER, opaque: false, - page: () => DeferredWidget(composer.loadLibrary, () => composer.ComposerView()), - binding: ComposerBindings()), + page: () { + ComposerBindings().dependencies(); + return DeferredWidget(composer.loadLibrary, () => composer.ComposerView()); + }), GetPage( name: AppRoutes.DESTINATION_PICKER, opaque: false,