From 0fc14a6c760679ebb044037662b68e8eb5802f1b Mon Sep 17 00:00:00 2001 From: dab246 Date: Fri, 13 May 2022 09:25:29 +0700 Subject: [PATCH] TF-548 Create abstract AutoCompleteDataSource common to all --- contact/lib/contact/model/tmail_contact.dart | 12 +++++++++++ contact/lib/contact_module.dart | 14 ++++++++----- .../datasource/auto_complete_datasource.dart | 6 +++--- .../tmail_contact_datasource_impl.dart | 8 ++++--- contact/lib/data/network/contact_api.dart | 8 ++++--- contact/pubspec.yaml | 6 +++++- .../tmail_contact_datasource_impl_test.dart | 13 +++++++----- ...il_contact_datasource_impl_test.mocks.dart | 7 +++---- .../datasource/autocomplete_datasource.dart | 6 ------ .../data/datasource/contact_datasource.dart | 1 - .../autocomplete_datasource_impl.dart | 13 ------------ .../contact_datasource_impl.dart | 5 ++--- .../local_autocomplete_datasource_impl.dart | 12 +++++------ .../auto_complete_repository_impl.dart | 4 ++-- .../repository/contact_repository_impl.dart | 1 - .../domain/model/auto_complete_pattern.dart | 21 ------------------- .../repository/auto_complete_repository.dart | 2 +- .../domain/repository/contact_repository.dart | 1 - .../usecases/get_autocomplete_interactor.dart | 2 +- ...mplete_with_device_contact_interactor.dart | 1 - ...device_contact_suggestions_interactor.dart | 2 +- .../presentation/composer_bindings.dart | 5 +---- .../presentation/composer_controller.dart | 8 +++---- .../composer/presentation/composer_view.dart | 6 +++--- .../presentation/composer_view_web.dart | 6 +++--- .../autocomplete/auto_complete_pattern.dart | 20 ++++++++++++++++++ model/lib/model.dart | 5 ++++- pubspec.yaml | 3 +++ 28 files changed, 100 insertions(+), 98 deletions(-) delete mode 100644 lib/features/composer/data/datasource/autocomplete_datasource.dart delete mode 100644 lib/features/composer/data/datasource_impl/autocomplete_datasource_impl.dart delete mode 100644 lib/features/composer/domain/model/auto_complete_pattern.dart create mode 100644 model/lib/autocomplete/auto_complete_pattern.dart diff --git a/contact/lib/contact/model/tmail_contact.dart b/contact/lib/contact/model/tmail_contact.dart index 697a15241..cd0863f4c 100644 --- a/contact/lib/contact/model/tmail_contact.dart +++ b/contact/lib/contact/model/tmail_contact.dart @@ -1,5 +1,6 @@ import 'package:contact/contact/model/contact.dart'; +import 'package:jmap_dart_client/jmap/mail/email/email_address.dart'; import 'package:json_annotation/json_annotation.dart'; part 'tmail_contact.g.dart'; @@ -33,4 +34,15 @@ class TMailContact extends Contact { firstname, surname, emailAddress]; +} + +extension TMailContactExtension on TMailContact { + + String get fullName { + return '${firstname ?? ''} ${surname ?? ''}'.trim(); + } + + EmailAddress toEmailAddress() { + return EmailAddress(fullName, emailAddress); + } } \ No newline at end of file diff --git a/contact/lib/contact_module.dart b/contact/lib/contact_module.dart index bf83882c6..162ae1045 100644 --- a/contact/lib/contact_module.dart +++ b/contact/lib/contact_module.dart @@ -1,8 +1,12 @@ library contact_module; -export 'package:contact/contact/model/contact.dart'; -export 'package:contact/contact/model/contact_filter.dart'; -export 'package:contact/contact/model/tmail_contact.dart'; +export 'contact/model/contact.dart'; +export 'contact/model/contact_filter.dart'; +export 'contact/model/tmail_contact.dart'; -export 'package:contact/contact/autocomplete/autocomplete_tmail_contact_method.dart'; -export 'package:contact/contact/autocomplete/autocomplete_tmail_contact_response.dart'; \ No newline at end of file +export 'data/network/contact_api.dart'; +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 diff --git a/contact/lib/data/datasource/auto_complete_datasource.dart b/contact/lib/data/datasource/auto_complete_datasource.dart index d4eb1639c..7d71868cd 100644 --- a/contact/lib/data/datasource/auto_complete_datasource.dart +++ b/contact/lib/data/datasource/auto_complete_datasource.dart @@ -1,7 +1,7 @@ -import 'package:contact/contact/model/tmail_contact.dart'; -import 'package:jmap_dart_client/jmap/account_id.dart'; +import 'package:jmap_dart_client/jmap/mail/email/email_address.dart'; +import 'package:model/model.dart'; abstract class AutoCompleteDataSource { - Future> getAutoComplete(AccountId accountId, String word, {int? limit}); + Future> getAutoComplete(AutoCompletePattern autoCompletePattern); } \ No newline at end of file diff --git a/contact/lib/data/datasource_impl/tmail_contact_datasource_impl.dart b/contact/lib/data/datasource_impl/tmail_contact_datasource_impl.dart index 9679b5807..3d68792fa 100644 --- a/contact/lib/data/datasource_impl/tmail_contact_datasource_impl.dart +++ b/contact/lib/data/datasource_impl/tmail_contact_datasource_impl.dart @@ -2,7 +2,8 @@ import 'package:contact/contact/model/tmail_contact.dart'; import 'package:contact/data/datasource/auto_complete_datasource.dart'; import 'package:contact/data/network/contact_api.dart'; -import 'package:jmap_dart_client/jmap/account_id.dart'; +import 'package:jmap_dart_client/jmap/mail/email/email_address.dart'; +import 'package:model/autocomplete/auto_complete_pattern.dart'; class TMailContactDataSourceImpl extends AutoCompleteDataSource { @@ -11,9 +12,10 @@ class TMailContactDataSourceImpl extends AutoCompleteDataSource { TMailContactDataSourceImpl(this._contactAPI); @override - Future> getAutoComplete(AccountId accountId, String word, {int? limit}) { + Future> getAutoComplete(AutoCompletePattern autoCompletePattern) { return Future.sync(() async { - return _contactAPI.getAutoComplete(accountId, word, limit: limit); + final listContacts = await _contactAPI.getAutoComplete(autoCompletePattern); + return listContacts.map((contact) => contact.toEmailAddress()).toList(); }).catchError((error) { throw error; }); diff --git a/contact/lib/data/network/contact_api.dart b/contact/lib/data/network/contact_api.dart index 4619bccc9..6294eff21 100644 --- a/contact/lib/data/network/contact_api.dart +++ b/contact/lib/data/network/contact_api.dart @@ -4,8 +4,8 @@ import 'package:contact/contact/autocomplete/autocomplete_tmail_contact_response import 'package:contact/contact/model/contact_filter.dart'; import 'package:contact/contact/model/tmail_contact.dart'; import 'package:jmap_dart_client/http/http_client.dart'; -import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/jmap_request.dart'; +import 'package:model/autocomplete/auto_complete_pattern.dart'; class ContactAPI { @@ -13,11 +13,13 @@ class ContactAPI { ContactAPI(this._httpClient); - Future> getAutoComplete(AccountId accountId, String word, {int? limit}) async { + Future> getAutoComplete(AutoCompletePattern autoCompletePattern) async { final processingInvocation = ProcessingInvocation(); final requestBuilder = JmapRequestBuilder(_httpClient, processingInvocation); - final autoCompleteMethod = AutoCompleteTMailContactMethod(accountId, ContactFilter(word)); + final autoCompleteMethod = AutoCompleteTMailContactMethod( + autoCompletePattern.accountId!, + ContactFilter(autoCompletePattern.word)); final autoCompleteInvocation = requestBuilder.invocation(autoCompleteMethod); final response = await (requestBuilder diff --git a/contact/pubspec.yaml b/contact/pubspec.yaml index 8e96ae28a..1e8538689 100644 --- a/contact/pubspec.yaml +++ b/contact/pubspec.yaml @@ -1,5 +1,5 @@ name: contact -description: A module implement request +description: Contact Module publish_to: 'none' version: 0.0.1 @@ -11,6 +11,9 @@ dependencies: flutter: sdk: flutter + model: + path: ../model + equatable: 2.0.3 json_annotation: 4.4.0 @@ -38,6 +41,7 @@ dev_dependencies: # The following section is specific to Flutter. flutter: + uses-material-design: true # To add assets to your package, add an assets section, like this: # assets: # - images/a_dot_burr.jpeg diff --git a/contact/test/datasource/tmail_contact_datasource_impl_test.dart b/contact/test/datasource/tmail_contact_datasource_impl_test.dart index 385dd29b1..582b4a384 100644 --- a/contact/test/datasource/tmail_contact_datasource_impl_test.dart +++ b/contact/test/datasource/tmail_contact_datasource_impl_test.dart @@ -7,6 +7,7 @@ import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/core/id.dart'; import 'package:mockito/mockito.dart'; import 'package:mockito/annotations.dart'; +import 'package:model/autocomplete/auto_complete_pattern.dart'; import 'tmail_contact_datasource_impl_test.mocks.dart'; @@ -37,15 +38,17 @@ void main() { test('getAutoComplete should return success with valid data', () async { when(_contactAPI.getAutoComplete( - AccountId(Id('29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6')), - 'marie' + AutoCompletePattern( + word: 'marie', + accountId: AccountId(Id('29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6'))) )).thenAnswer((_) async => [contact1, contact2]); final result = await _tmailContactDataSourceImpl.getAutoComplete( - AccountId(Id('29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6')), - 'marie' + AutoCompletePattern( + word: 'marie', + accountId: AccountId(Id('29883977c13473ae7cb7678ef767cbfbaffc8a44a6e463d971d23a65c1dc4af6'))) ); - expect(result, [contact1, contact2]); + expect(result, [contact1.toEmailAddress(), contact2.toEmailAddress()]); }); }); } \ No newline at end of file diff --git a/contact/test/datasource/tmail_contact_datasource_impl_test.mocks.dart b/contact/test/datasource/tmail_contact_datasource_impl_test.mocks.dart index 34df35489..23dd3fcc5 100644 --- a/contact/test/datasource/tmail_contact_datasource_impl_test.mocks.dart +++ b/contact/test/datasource/tmail_contact_datasource_impl_test.mocks.dart @@ -6,8 +6,8 @@ import 'dart:async' as _i3; import 'package:contact/contact/model/tmail_contact.dart' as _i4; import 'package:contact/data/network/contact_api.dart' as _i2; -import 'package:jmap_dart_client/jmap/account_id.dart' as _i5; import 'package:mockito/mockito.dart' as _i1; +import 'package:model/autocomplete/auto_complete_pattern.dart' as _i5; // ignore_for_file: avoid_redundant_argument_values // ignore_for_file: avoid_setters_without_getters @@ -28,10 +28,9 @@ class MockContactAPI extends _i1.Mock implements _i2.ContactAPI { @override _i3.Future> getAutoComplete( - _i5.AccountId? accountId, String? word, {int? limit}) => + _i5.AutoCompletePattern? autoCompletePattern) => (super.noSuchMethod( - Invocation.method( - #getAutoComplete, [accountId, word], {#limit: limit}), + Invocation.method(#getAutoComplete, [autoCompletePattern]), returnValue: Future>.value(<_i4.TMailContact>[])) as _i3.Future>); diff --git a/lib/features/composer/data/datasource/autocomplete_datasource.dart b/lib/features/composer/data/datasource/autocomplete_datasource.dart deleted file mode 100644 index 2722d578d..000000000 --- a/lib/features/composer/data/datasource/autocomplete_datasource.dart +++ /dev/null @@ -1,6 +0,0 @@ -import 'package:jmap_dart_client/jmap/mail/email/email_address.dart'; -import 'package:tmail_ui_user/features/composer/domain/model/auto_complete_pattern.dart'; - -abstract class AutoCompleteDataSource { - Future> getAutoComplete(AutoCompletePattern autoCompletePattern); -} \ No newline at end of file diff --git a/lib/features/composer/data/datasource/contact_datasource.dart b/lib/features/composer/data/datasource/contact_datasource.dart index b8f9cf517..1601e0977 100644 --- a/lib/features/composer/data/datasource/contact_datasource.dart +++ b/lib/features/composer/data/datasource/contact_datasource.dart @@ -1,6 +1,5 @@ import 'package:model/model.dart'; -import 'package:tmail_ui_user/features/composer/domain/model/auto_complete_pattern.dart'; abstract class ContactDataSource { Future> getContactSuggestions(AutoCompletePattern autoCompletePattern); diff --git a/lib/features/composer/data/datasource_impl/autocomplete_datasource_impl.dart b/lib/features/composer/data/datasource_impl/autocomplete_datasource_impl.dart deleted file mode 100644 index eab1c1c98..000000000 --- a/lib/features/composer/data/datasource_impl/autocomplete_datasource_impl.dart +++ /dev/null @@ -1,13 +0,0 @@ -import 'package:jmap_dart_client/jmap/mail/email/email_address.dart'; -import 'package:tmail_ui_user/features/composer/data/datasource/autocomplete_datasource.dart'; -import 'package:tmail_ui_user/features/composer/domain/model/auto_complete_pattern.dart'; - -class AutoCompleteDataSourceImpl extends AutoCompleteDataSource { - - AutoCompleteDataSourceImpl(); - - @override - Future> getAutoComplete(AutoCompletePattern autoCompletePattern) { - throw UnimplementedError(); - } -} \ No newline at end of file diff --git a/lib/features/composer/data/datasource_impl/contact_datasource_impl.dart b/lib/features/composer/data/datasource_impl/contact_datasource_impl.dart index 6219aa199..d878d3f30 100644 --- a/lib/features/composer/data/datasource_impl/contact_datasource_impl.dart +++ b/lib/features/composer/data/datasource_impl/contact_datasource_impl.dart @@ -3,17 +3,16 @@ import 'package:contacts_service/contacts_service.dart' as contact_service; import 'package:get/get.dart'; import 'package:model/model.dart'; import 'package:tmail_ui_user/features/composer/data/datasource/contact_datasource.dart'; -import 'package:tmail_ui_user/features/composer/domain/model/auto_complete_pattern.dart'; class ContactDataSourceImpl extends ContactDataSource { @override Future> getContactSuggestions(AutoCompletePattern autoCompletePattern) async { - if (autoCompletePattern.isAll == true) { + if (autoCompletePattern.word.isEmpty) { return []; } else { final suggestedList = await contact_service.ContactsService - .getContactsByEmailOrName(autoCompletePattern.word ?? ''); + .getContactsByEmailOrName(autoCompletePattern.word); if (suggestedList.isNotEmpty) { return suggestedList.expand((contact) => _toDeviceContact(contact)).toList(); } diff --git a/lib/features/composer/data/datasource_impl/local_autocomplete_datasource_impl.dart b/lib/features/composer/data/datasource_impl/local_autocomplete_datasource_impl.dart index 84eb82ab6..5bbe0986a 100644 --- a/lib/features/composer/data/datasource_impl/local_autocomplete_datasource_impl.dart +++ b/lib/features/composer/data/datasource_impl/local_autocomplete_datasource_impl.dart @@ -1,8 +1,8 @@ +import 'package:contact/data/datasource/auto_complete_datasource.dart'; import 'package:core/core.dart'; import 'package:jmap_dart_client/jmap/mail/email/email_address.dart'; -import 'package:tmail_ui_user/features/composer/data/datasource/autocomplete_datasource.dart'; +import 'package:model/autocomplete/auto_complete_pattern.dart'; import 'package:tmail_ui_user/features/composer/data/local/email_address_database_manager.dart'; -import 'package:tmail_ui_user/features/composer/domain/model/auto_complete_pattern.dart'; class LocalAutoCompleteDataSourceImpl extends AutoCompleteDataSource { @@ -13,18 +13,16 @@ class LocalAutoCompleteDataSourceImpl extends AutoCompleteDataSource { @override Future> getAutoComplete(AutoCompletePattern autoCompletePattern) { return Future.sync(() async { - if (autoCompletePattern.isAll == true) { + if (autoCompletePattern.word.isEmpty) { return await emailAddressDatabaseManager.getListData( word: autoCompletePattern.word, - limit: autoCompletePattern.limit, - orderBy: autoCompletePattern.orderBy); + limit: autoCompletePattern.limit); } else { final condition = '${EmailAddressTable.NAME} LIKE \'%?${autoCompletePattern.word}\' OR ${EmailAddressTable.EMAIL} LIKE \'%${autoCompletePattern.word}%\''; return await emailAddressDatabaseManager.getListDataWithCondition( condition, word: autoCompletePattern.word, - limit: autoCompletePattern.limit, - orderBy: autoCompletePattern.orderBy); + limit: autoCompletePattern.limit); } }).catchError((error) { throw error; 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 e97824a09..5fb6830b4 100644 --- a/lib/features/composer/data/repository/auto_complete_repository_impl.dart +++ b/lib/features/composer/data/repository/auto_complete_repository_impl.dart @@ -1,8 +1,8 @@ +import 'package:contact/data/datasource/auto_complete_datasource.dart'; import 'package:core/core.dart'; import 'package:jmap_dart_client/jmap/mail/email/email_address.dart'; -import 'package:tmail_ui_user/features/composer/data/datasource/autocomplete_datasource.dart'; -import 'package:tmail_ui_user/features/composer/domain/model/auto_complete_pattern.dart'; +import 'package:model/autocomplete/auto_complete_pattern.dart'; import 'package:tmail_ui_user/features/composer/domain/repository/auto_complete_repository.dart'; class AutoCompleteRepositoryImpl extends AutoCompleteRepository { diff --git a/lib/features/composer/data/repository/contact_repository_impl.dart b/lib/features/composer/data/repository/contact_repository_impl.dart index 631c1338e..24bb9e281 100644 --- a/lib/features/composer/data/repository/contact_repository_impl.dart +++ b/lib/features/composer/data/repository/contact_repository_impl.dart @@ -2,7 +2,6 @@ import 'package:model/model.dart'; import 'package:tmail_ui_user/features/composer/data/datasource/contact_datasource.dart'; -import 'package:tmail_ui_user/features/composer/domain/model/auto_complete_pattern.dart'; import 'package:tmail_ui_user/features/composer/domain/repository/contact_repository.dart'; class ContactRepositoryImpl implements ContactRepository { diff --git a/lib/features/composer/domain/model/auto_complete_pattern.dart b/lib/features/composer/domain/model/auto_complete_pattern.dart deleted file mode 100644 index ce4c591a2..000000000 --- a/lib/features/composer/domain/model/auto_complete_pattern.dart +++ /dev/null @@ -1,21 +0,0 @@ - -import 'package:equatable/equatable.dart'; - -class AutoCompletePattern with EquatableMixin { - - final String? word; - final int? limit; - final String? orderBy; - final bool? isAll; - - AutoCompletePattern({ - this.word, - this.limit, - this.orderBy, - this.isAll, - }); - - @override - List get props => [word, limit, orderBy, isAll]; - -} \ No newline at end of file diff --git a/lib/features/composer/domain/repository/auto_complete_repository.dart b/lib/features/composer/domain/repository/auto_complete_repository.dart index 494f678f3..e4231327c 100644 --- a/lib/features/composer/domain/repository/auto_complete_repository.dart +++ b/lib/features/composer/domain/repository/auto_complete_repository.dart @@ -1,6 +1,6 @@ import 'package:jmap_dart_client/jmap/mail/email/email_address.dart'; -import 'package:tmail_ui_user/features/composer/domain/model/auto_complete_pattern.dart'; +import 'package:model/autocomplete/auto_complete_pattern.dart'; abstract class AutoCompleteRepository { Future> getAutoComplete(AutoCompletePattern autoCompletePattern); diff --git a/lib/features/composer/domain/repository/contact_repository.dart b/lib/features/composer/domain/repository/contact_repository.dart index eb4b7be64..a8cae8a0a 100644 --- a/lib/features/composer/domain/repository/contact_repository.dart +++ b/lib/features/composer/domain/repository/contact_repository.dart @@ -1,6 +1,5 @@ import 'package:model/model.dart'; -import 'package:tmail_ui_user/features/composer/domain/model/auto_complete_pattern.dart'; abstract class ContactRepository { Future> getContactSuggestions(AutoCompletePattern autoCompletePattern); diff --git a/lib/features/composer/domain/usecases/get_autocomplete_interactor.dart b/lib/features/composer/domain/usecases/get_autocomplete_interactor.dart index c8c8c74c6..b39ae2924 100644 --- a/lib/features/composer/domain/usecases/get_autocomplete_interactor.dart +++ b/lib/features/composer/domain/usecases/get_autocomplete_interactor.dart @@ -1,6 +1,6 @@ import 'package:core/core.dart'; import 'package:dartz/dartz.dart'; -import 'package:tmail_ui_user/features/composer/domain/model/auto_complete_pattern.dart'; +import 'package:model/autocomplete/auto_complete_pattern.dart'; import 'package:tmail_ui_user/features/composer/domain/repository/auto_complete_repository.dart'; import 'package:tmail_ui_user/features/composer/domain/state/get_autocomplete_state.dart'; 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 0cf17e25b..7b842923b 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 @@ -3,7 +3,6 @@ import 'package:core/core.dart'; import 'package:dartz/dartz.dart'; import 'package:jmap_dart_client/jmap/mail/email/email_address.dart'; import 'package:model/model.dart'; -import 'package:tmail_ui_user/features/composer/domain/model/auto_complete_pattern.dart'; import 'package:tmail_ui_user/features/composer/domain/state/get_autocomplete_state.dart'; import 'package:tmail_ui_user/features/composer/domain/state/get_device_contact_suggestions_state.dart'; import 'package:tmail_ui_user/features/composer/domain/usecases/get_autocomplete_interactor.dart'; diff --git a/lib/features/composer/domain/usecases/get_device_contact_suggestions_interactor.dart b/lib/features/composer/domain/usecases/get_device_contact_suggestions_interactor.dart index 706b45bb4..1d0a3523c 100644 --- a/lib/features/composer/domain/usecases/get_device_contact_suggestions_interactor.dart +++ b/lib/features/composer/domain/usecases/get_device_contact_suggestions_interactor.dart @@ -1,7 +1,7 @@ import 'package:core/core.dart'; import 'package:dartz/dartz.dart'; -import 'package:tmail_ui_user/features/composer/domain/model/auto_complete_pattern.dart'; +import 'package:model/autocomplete/auto_complete_pattern.dart'; import 'package:tmail_ui_user/features/composer/domain/repository/contact_repository.dart'; import 'package:tmail_ui_user/features/composer/domain/state/get_device_contact_suggestions_state.dart'; diff --git a/lib/features/composer/presentation/composer_bindings.dart b/lib/features/composer/presentation/composer_bindings.dart index c96a952f0..81053fe5f 100644 --- a/lib/features/composer/presentation/composer_bindings.dart +++ b/lib/features/composer/presentation/composer_bindings.dart @@ -1,11 +1,10 @@ +import 'package:contact/data/datasource/auto_complete_datasource.dart'; import 'package:core/core.dart'; import 'package:device_info_plus/device_info_plus.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/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'; @@ -64,7 +63,6 @@ class ComposerBindings extends BaseBindings { void bindingsDataSourceImpl() { Get.lazyPut(() => ComposerDataSourceImpl(Get.find())); Get.lazyPut(() => LocalComposerDataSourceImpl(Get.find())); - Get.lazyPut(() => AutoCompleteDataSourceImpl()); Get.lazyPut(() => LocalAutoCompleteDataSourceImpl(Get.find())); Get.lazyPut(() => ContactDataSourceImpl()); Get.lazyPut(() => EmailDataSourceImpl(Get.find())); @@ -78,7 +76,6 @@ class ComposerBindings extends BaseBindings { @override void bindingsDataSource() { Get.lazyPut(() => Get.find()); - Get.lazyPut(() => Get.find()); Get.lazyPut(() => Get.find()); Get.lazyPut(() => Get.find()); Get.lazyPut(() => Get.find()); diff --git a/lib/features/composer/presentation/composer_controller.dart b/lib/features/composer/presentation/composer_controller.dart index fe7a78d50..aa936d6f4 100644 --- a/lib/features/composer/presentation/composer_controller.dart +++ b/lib/features/composer/presentation/composer_controller.dart @@ -26,7 +26,6 @@ import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.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/get_autocomplete_state.dart'; @@ -586,15 +585,16 @@ class ComposerController extends BaseController { } } - Future> getAutoCompleteSuggestion({String? word, bool? isAll}) async { + Future> getAutoCompleteSuggestion( + {required String word}) async { if (_contactSuggestionSource == ContactSuggestionSource.all) { return await _getAutoCompleteWithDeviceContactInteractor - .execute(AutoCompletePattern(word: word, isAll: isAll)) + .execute(AutoCompletePattern(word: word)) .then((value) => value.fold( (failure) => [], (success) => success is GetAutoCompleteSuccess ? success.listEmailAddress : [])); } - return await _getAutoCompleteInteractor.execute(AutoCompletePattern(word: word, isAll: isAll)) + return await _getAutoCompleteInteractor.execute(AutoCompletePattern(word: word)) .then((value) => value.fold( (failure) => [], (success) => success is GetAutoCompleteSuccess ? success.listEmailAddress : [])); diff --git a/lib/features/composer/presentation/composer_view.dart b/lib/features/composer/presentation/composer_view.dart index 4639dbe73..cac5d8064 100644 --- a/lib/features/composer/presentation/composer_view.dart +++ b/lib/features/composer/presentation/composer_view.dart @@ -295,7 +295,7 @@ class ComposerView extends GetWidget { ..addOnShowFullListEmailAddressAction((prefixEmailAddress) => controller.showFullEmailAddress(prefixEmailAddress)) ..addOnAddEmailAddressTypeAction((prefixEmailAddress) => controller.addEmailAddressType(prefixEmailAddress)) ..addOnUpdateListEmailAddressAction((prefixEmailAddress, listEmailAddress) => controller.updateListEmailAddress(prefixEmailAddress, listEmailAddress)) - ..addOnOpenSuggestionBoxEmailAddress(() => controller.getAutoCompleteSuggestion(isAll: true)) + ..addOnOpenSuggestionBoxEmailAddress(() => controller.getAutoCompleteSuggestion(word: '')) ..addOnSuggestionEmailAddress((word) => controller.getAutoCompleteSuggestion(word: word))) .build() )), @@ -316,7 +316,7 @@ class ComposerView extends GetWidget { ..addOnShowFullListEmailAddressAction((prefixEmailAddress) => controller.showFullEmailAddress(prefixEmailAddress)) ..addOnDeleteEmailAddressTypeAction((prefixEmailAddress) => controller.deleteEmailAddressType(prefixEmailAddress)) ..addOnUpdateListEmailAddressAction((prefixEmailAddress, listEmailAddress) => controller.updateListEmailAddress(prefixEmailAddress, listEmailAddress)) - ..addOnOpenSuggestionBoxEmailAddress(() => controller.getAutoCompleteSuggestion(isAll: true)) + ..addOnOpenSuggestionBoxEmailAddress(() => controller.getAutoCompleteSuggestion(word: '')) ..addOnSuggestionEmailAddress((word) => controller.getAutoCompleteSuggestion(word: word))) .build()) : const SizedBox.shrink() @@ -338,7 +338,7 @@ class ComposerView extends GetWidget { ..addOnShowFullListEmailAddressAction((prefixEmailAddress) => controller.showFullEmailAddress(prefixEmailAddress)) ..addOnDeleteEmailAddressTypeAction((prefixEmailAddress) => controller.deleteEmailAddressType(prefixEmailAddress)) ..addOnUpdateListEmailAddressAction((prefixEmailAddress, listEmailAddress) => controller.updateListEmailAddress(prefixEmailAddress, listEmailAddress)) - ..addOnOpenSuggestionBoxEmailAddress(() => controller.getAutoCompleteSuggestion(isAll: true)) + ..addOnOpenSuggestionBoxEmailAddress(() => controller.getAutoCompleteSuggestion(word: '')) ..addOnSuggestionEmailAddress((word) => controller.getAutoCompleteSuggestion(word: word))) .build()) : const SizedBox.shrink() diff --git a/lib/features/composer/presentation/composer_view_web.dart b/lib/features/composer/presentation/composer_view_web.dart index d4002264c..4d2da6fbd 100644 --- a/lib/features/composer/presentation/composer_view_web.dart +++ b/lib/features/composer/presentation/composer_view_web.dart @@ -404,7 +404,7 @@ class ComposerView extends GetWidget { ..addOnShowFullListEmailAddressAction((prefixEmailAddress) => controller.showFullEmailAddress(prefixEmailAddress)) ..addOnAddEmailAddressTypeAction((prefixEmailAddress) => controller.addEmailAddressType(prefixEmailAddress)) ..addOnUpdateListEmailAddressAction((prefixEmailAddress, listEmailAddress) => controller.updateListEmailAddress(prefixEmailAddress, listEmailAddress)) - ..addOnOpenSuggestionBoxEmailAddress(() => controller.getAutoCompleteSuggestion(isAll: true)) + ..addOnOpenSuggestionBoxEmailAddress(() => controller.getAutoCompleteSuggestion(word: '')) ..addOnSuggestionEmailAddress((word) => controller.getAutoCompleteSuggestion(word: word))) .build() )), @@ -425,7 +425,7 @@ class ComposerView extends GetWidget { ..addOnShowFullListEmailAddressAction((prefixEmailAddress) => controller.showFullEmailAddress(prefixEmailAddress)) ..addOnDeleteEmailAddressTypeAction((prefixEmailAddress) => controller.deleteEmailAddressType(prefixEmailAddress)) ..addOnUpdateListEmailAddressAction((prefixEmailAddress, listEmailAddress) => controller.updateListEmailAddress(prefixEmailAddress, listEmailAddress)) - ..addOnOpenSuggestionBoxEmailAddress(() => controller.getAutoCompleteSuggestion(isAll: true)) + ..addOnOpenSuggestionBoxEmailAddress(() => controller.getAutoCompleteSuggestion(word: '')) ..addOnSuggestionEmailAddress((word) => controller.getAutoCompleteSuggestion(word: word))) .build()) : const SizedBox.shrink() @@ -447,7 +447,7 @@ class ComposerView extends GetWidget { ..addOnShowFullListEmailAddressAction((prefixEmailAddress) => controller.showFullEmailAddress(prefixEmailAddress)) ..addOnDeleteEmailAddressTypeAction((prefixEmailAddress) => controller.deleteEmailAddressType(prefixEmailAddress)) ..addOnUpdateListEmailAddressAction((prefixEmailAddress, listEmailAddress) => controller.updateListEmailAddress(prefixEmailAddress, listEmailAddress)) - ..addOnOpenSuggestionBoxEmailAddress(() => controller.getAutoCompleteSuggestion(isAll: true)) + ..addOnOpenSuggestionBoxEmailAddress(() => controller.getAutoCompleteSuggestion(word: '')) ..addOnSuggestionEmailAddress((word) => controller.getAutoCompleteSuggestion(word: word))) .build()) : const SizedBox.shrink() diff --git a/model/lib/autocomplete/auto_complete_pattern.dart b/model/lib/autocomplete/auto_complete_pattern.dart new file mode 100644 index 000000000..5f3449a7e --- /dev/null +++ b/model/lib/autocomplete/auto_complete_pattern.dart @@ -0,0 +1,20 @@ + +import 'package:equatable/equatable.dart'; +import 'package:jmap_dart_client/jmap/account_id.dart'; + +class AutoCompletePattern with EquatableMixin { + + final String word; + final int? limit; + final AccountId? accountId; + + AutoCompletePattern({ + required this.word, + this.limit, + this.accountId, + }); + + @override + List get props => [word, limit, accountId]; + +} \ No newline at end of file diff --git a/model/lib/model.dart b/model/lib/model.dart index a50139992..2d40d27ae 100644 --- a/model/lib/model.dart +++ b/model/lib/model.dart @@ -67,4 +67,7 @@ export 'contact/device_contact.dart'; // Upload export 'upload/file_info.dart'; export 'upload/upload_request.dart'; -export 'upload/upload_response.dart'; \ No newline at end of file +export 'upload/upload_response.dart'; + +// AutoComplete +export 'autocomplete/auto_complete_pattern.dart'; \ No newline at end of file diff --git a/pubspec.yaml b/pubspec.yaml index 2693685b1..18709dcde 100644 --- a/pubspec.yaml +++ b/pubspec.yaml @@ -33,6 +33,9 @@ dependencies: model: path: model + contact: + path: contact + # The following adds the Cupertino Icons font to your application. # Use with the CupertinoIcons class for iOS style icons. cupertino_icons: ^1.0.2