TF-548 Inject TmailContactDataSource in composer of TMail

This commit is contained in:
dab246
2022-05-13 10:48:38 +07:00
committed by Dat H. Pham
parent 7e2786089d
commit 909db3c5df
12 changed files with 54 additions and 26 deletions
@@ -1,3 +1,4 @@
import 'package:contact/contact/model/capability_contact.dart';
import 'package:contact/contact/model/contact_filter.dart'; import 'package:contact/contact/model/contact_filter.dart';
import 'package:contact/core/method/request/autocomplete_method.dart'; import 'package:contact/core/method/request/autocomplete_method.dart';
import 'package:jmap_dart_client/http/converter/account_id_converter.dart'; import 'package:jmap_dart_client/http/converter/account_id_converter.dart';
@@ -19,7 +20,7 @@ class AutoCompleteTMailContactMethod extends AutoCompleteMethod {
@override @override
Set<CapabilityIdentifier> get requiredCapabilities => { Set<CapabilityIdentifier> get requiredCapabilities => {
CapabilityIdentifier.jmapCore, CapabilityIdentifier.jmapCore,
CapabilityIdentifier(Uri.parse('com:linagora:params:jmap:contact:autocomplete')) capabilityContact
}; };
factory AutoCompleteTMailContactMethod.fromJson(Map<String, dynamic> json) { factory AutoCompleteTMailContactMethod.fromJson(Map<String, dynamic> json) {
@@ -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'));
+3 -1
View File
@@ -9,4 +9,6 @@ export 'data/datasource/auto_complete_datasource.dart';
export 'data/datasource_impl/tmail_contact_datasource_impl.dart'; export 'data/datasource_impl/tmail_contact_datasource_impl.dart';
export 'contact/autocomplete/autocomplete_tmail_contact_method.dart'; export 'contact/autocomplete/autocomplete_tmail_contact_method.dart';
export 'contact/autocomplete/autocomplete_tmail_contact_response.dart'; export 'contact/autocomplete/autocomplete_tmail_contact_response.dart';
export 'contact/model/capability_contact.dart';
+3 -3
View File
@@ -1,11 +1,11 @@
name: contact name: contact
description: Contact Module description: Contact Module
publish_to: 'none' publish_to: 'none'
version: 0.0.1
version: 1.0.0+1
environment: environment:
sdk: ">=2.16.1 <3.0.0" sdk: ">=2.14.0 <3.0.0"
flutter: ">=1.17.0"
dependencies: dependencies:
flutter: flutter:
@@ -1,4 +1,3 @@
import 'package:jmap_dart_client/jmap/mail/email/email_address.dart';
import 'package:model/model.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/datasource/composer_datasource.dart';
import 'package:tmail_ui_user/features/composer/data/network/composer_api.dart'; import 'package:tmail_ui_user/features/composer/data/network/composer_api.dart';
@@ -9,11 +8,6 @@ class ComposerDataSourceImpl extends ComposerDataSource {
ComposerDataSourceImpl(this._composerAPI); ComposerDataSourceImpl(this._composerAPI);
@override
Future<bool> saveEmailAddresses(List<EmailAddress> listEmailAddress) {
throw UnimplementedError();
}
@override @override
Future<Attachment> uploadAttachment(UploadRequest uploadRequest) { Future<Attachment> uploadAttachment(UploadRequest uploadRequest) {
return Future.sync(() async { return Future.sync(() async {
@@ -16,9 +16,9 @@ class AutoCompleteRepositoryImpl extends AutoCompleteRepository {
await Future.wait(autoCompleteDataSources.map( await Future.wait(autoCompleteDataSources.map(
(datasource) => datasource.getAutoComplete(autoCompletePattern))) (datasource) => datasource.getAutoComplete(autoCompletePattern)))
.then((newListEmails) { .then((newListResult) {
for (var emailAddress in newListEmails) { for (var listEmails in newListResult) {
listEmailAddress.addAll(emailAddress); listEmailAddress.addAll(listEmails);
} }
}); });
@@ -1,4 +1,4 @@
enum ContactSuggestionSource { enum ContactSuggestionSource {
all, localContact, deviceContact all, tMailContact, deviceContact
} }
@@ -12,7 +12,9 @@ class GetAutoCompleteWithDeviceContactInteractor {
final GetAutoCompleteInteractor _getAutoCompleteInteractor; final GetAutoCompleteInteractor _getAutoCompleteInteractor;
final GetDeviceContactSuggestionsInteractor _getDeviceContactSuggestionsInteractor; final GetDeviceContactSuggestionsInteractor _getDeviceContactSuggestionsInteractor;
GetAutoCompleteWithDeviceContactInteractor(this._getAutoCompleteInteractor, this._getDeviceContactSuggestionsInteractor); GetAutoCompleteWithDeviceContactInteractor(
this._getAutoCompleteInteractor,
this._getDeviceContactSuggestionsInteractor);
Future<Either<Failure, Success>> execute(AutoCompletePattern autoCompletePattern) async { Future<Either<Failure, Success>> execute(AutoCompletePattern autoCompletePattern) async {
try { try {
@@ -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:core/core.dart';
import 'package:device_info_plus/device_info_plus.dart'; import 'package:device_info_plus/device_info_plus.dart';
import 'package:get/get.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/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/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/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/email_datasource.dart';
import 'package:tmail_ui_user/features/email/data/datasource/html_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'; 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/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/repository/email_repository.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/get_email_content_interactor.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/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/datasource_impl/manage_account_datasource_impl.dart';
import 'package:tmail_ui_user/features/manage_account/data/network/manage_account_api.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; import 'package:jmap_dart_client/http/http_client.dart' as jmap_http_client;
class ComposerBindings extends BaseBindings { class ComposerBindings extends BaseBindings {
final mailboxDashBoardController = Get.find<MailboxDashBoardController>();
final Set<AutoCompleteDataSource> dataSources = {};
@override @override
void dependencies() { void dependencies() {
_bindingsUtils(); _bindingsUtils();
@@ -56,6 +62,12 @@ class ComposerBindings extends BaseBindings {
@override @override
void bindingsDataSourceImpl() { void bindingsDataSourceImpl() {
if (mailboxDashBoardController.sessionCurrent?.hasSupportAutoComplete == true) {
Get.lazyPut(() => ContactAPI(Get.find<jmap_http_client.HttpClient>()));
Get.lazyPut(() => TMailContactDataSourceImpl(Get.find<ContactAPI>()));
dataSources.add(Get.find<TMailContactDataSourceImpl>());
}
Get.lazyPut(() => ComposerDataSourceImpl(Get.find<ComposerAPI>())); Get.lazyPut(() => ComposerDataSourceImpl(Get.find<ComposerAPI>()));
Get.lazyPut(() => ContactDataSourceImpl()); Get.lazyPut(() => ContactDataSourceImpl());
Get.lazyPut(() => EmailDataSourceImpl(Get.find<EmailAPI>())); Get.lazyPut(() => EmailDataSourceImpl(Get.find<EmailAPI>()));
@@ -78,9 +90,7 @@ class ComposerBindings extends BaseBindings {
@override @override
void bindingsRepositoryImpl() { void bindingsRepositoryImpl() {
Get.lazyPut(() => ComposerRepositoryImpl(Get.find<ComposerDataSource>())); Get.lazyPut(() => ComposerRepositoryImpl(Get.find<ComposerDataSource>()));
Get.lazyPut(() => AutoCompleteRepositoryImpl({ Get.lazyPut(() => AutoCompleteRepositoryImpl(dataSources));
Get.find<AutoCompleteDataSource>(),
}));
Get.lazyPut(() => ContactRepositoryImpl(Get.find<ContactDataSource>())); Get.lazyPut(() => ContactRepositoryImpl(Get.find<ContactDataSource>()));
Get.lazyPut(() => EmailRepositoryImpl( Get.lazyPut(() => EmailRepositoryImpl(
Get.find<EmailDataSource>(), Get.find<EmailDataSource>(),
@@ -88,7 +88,7 @@ class ComposerController extends BaseController {
List<EmailAddress> listToEmailAddress = <EmailAddress>[]; List<EmailAddress> listToEmailAddress = <EmailAddress>[];
List<EmailAddress> listCcEmailAddress = <EmailAddress>[]; List<EmailAddress> listCcEmailAddress = <EmailAddress>[];
List<EmailAddress> listBccEmailAddress = <EmailAddress>[]; List<EmailAddress> listBccEmailAddress = <EmailAddress>[];
ContactSuggestionSource _contactSuggestionSource = ContactSuggestionSource.localContact; ContactSuggestionSource _contactSuggestionSource = ContactSuggestionSource.tMailContact;
HtmlEditorApi? htmlEditorApi; HtmlEditorApi? htmlEditorApi;
final html_editor_browser.HtmlEditorController htmlControllerBrowser = final html_editor_browser.HtmlEditorController htmlControllerBrowser =
html_editor_browser.HtmlEditorController(processNewLineAsBr: true); html_editor_browser.HtmlEditorController(processNewLineAsBr: true);
@@ -152,7 +152,10 @@ class ComposerController extends BaseController {
void onReady() async { void onReady() async {
_initEmail(); _initEmail();
_getAllIdentities(); _getAllIdentities();
Future.delayed(const Duration(milliseconds: 500), () => _checkContactPermission()); if (!BuildUtils.isWeb) {
Future.delayed(const Duration(milliseconds: 500), () =>
_checkContactPermission());
}
super.onReady(); super.onReady();
} }
@@ -579,12 +582,13 @@ class ComposerController extends BaseController {
{required String word}) async { {required String word}) async {
if (_contactSuggestionSource == ContactSuggestionSource.all) { if (_contactSuggestionSource == ContactSuggestionSource.all) {
return await _getAutoCompleteWithDeviceContactInteractor return await _getAutoCompleteWithDeviceContactInteractor
.execute(AutoCompletePattern(word: word)) .execute(AutoCompletePattern(word: word, accountId: mailboxDashBoardController.accountId.value))
.then((value) => value.fold( .then((value) => value.fold(
(failure) => <EmailAddress>[], (failure) => <EmailAddress>[],
(success) => success is GetAutoCompleteSuccess ? success.listEmailAddress : <EmailAddress>[])); (success) => success is GetAutoCompleteSuccess ? success.listEmailAddress : <EmailAddress>[]));
} }
return await _getAutoCompleteInteractor.execute(AutoCompletePattern(word: word)) return await _getAutoCompleteInteractor
.execute(AutoCompletePattern(word: word, accountId: mailboxDashBoardController.accountId.value))
.then((value) => value.fold( .then((value) => value.fold(
(failure) => <EmailAddress>[], (failure) => <EmailAddress>[],
(success) => success is GetAutoCompleteSuccess ? success.listEmailAddress : <EmailAddress>[])); (success) => success is GetAutoCompleteSuccess ? success.listEmailAddress : <EmailAddress>[]));
@@ -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);
}
+4 -2
View File
@@ -48,8 +48,10 @@ class AppPages {
GetPage( GetPage(
name: AppRoutes.COMPOSER, name: AppRoutes.COMPOSER,
opaque: false, opaque: false,
page: () => DeferredWidget(composer.loadLibrary, () => composer.ComposerView()), page: () {
binding: ComposerBindings()), ComposerBindings().dependencies();
return DeferredWidget(composer.loadLibrary, () => composer.ComposerView());
}),
GetPage( GetPage(
name: AppRoutes.DESTINATION_PICKER, name: AppRoutes.DESTINATION_PICKER,
opaque: false, opaque: false,