TF-3834 Implement remember user sort order after search

Signed-off-by: dab246 <tdvu@linagora.com>
This commit is contained in:
dab246
2025-07-29 16:06:59 +07:00
committed by Dat H. Pham
parent ec4b618a32
commit 1293c1a997
25 changed files with 312 additions and 23 deletions
@@ -2,6 +2,7 @@
import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/core/user_name.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/model/recent_search.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/email_sort_order_type.dart';
abstract class SearchRepository {
Future<void> saveRecentSearch(
@@ -18,4 +19,8 @@ abstract class SearchRepository {
String? pattern,
}
);
Future<void> storeEmailSortOrder(EmailSortOrderType sortOrderType);
Future<EmailSortOrderType> getStoredEmailSortOrder();
}
@@ -0,0 +1,19 @@
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/email_sort_order_type.dart';
class GettingStoredEmailSortOrder extends LoadingState {}
class GetStoredEmailSortOrderSuccess extends UIState {
final EmailSortOrderType emailSortOrderType;
GetStoredEmailSortOrderSuccess(this.emailSortOrderType);
@override
List<Object?> get props => [emailSortOrderType];
}
class GetStoredEmailSortOrderFailure extends FeatureFailure {
GetStoredEmailSortOrderFailure(dynamic exception) : super(exception: exception);
}
@@ -0,0 +1,11 @@
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
class StoringEmailSortOrder extends LoadingState {}
class StoreEmailSortOrderSuccess extends UIState {}
class StoreEmailSortOrderFailure extends FeatureFailure {
StoreEmailSortOrderFailure(dynamic exception) : super(exception: exception);
}
@@ -0,0 +1,21 @@
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:dartz/dartz.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/repository/search_repository.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/get_stored_email_sort_order_state.dart';
class GetStoredEmailSortOrderInteractor {
final SearchRepository _searchRepository;
const GetStoredEmailSortOrderInteractor(this._searchRepository);
Stream<Either<Failure, Success>> execute() async* {
try {
yield Right(GettingStoredEmailSortOrder());
final emailSortOrderType = await _searchRepository.getStoredEmailSortOrder();
yield Right(GetStoredEmailSortOrderSuccess(emailSortOrderType));
} catch (exception) {
yield Left(GetStoredEmailSortOrderFailure(exception));
}
}
}
@@ -0,0 +1,24 @@
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:dartz/dartz.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/repository/search_repository.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/store_email_sort_order_state.dart';
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/email_sort_order_type.dart';
class StoreEmailSortOrderInteractor {
final SearchRepository _searchRepository;
const StoreEmailSortOrderInteractor(this._searchRepository);
Stream<Either<Failure, Success>> execute(
EmailSortOrderType sortOrderType,
) async* {
try {
yield Right(StoringEmailSortOrder());
await _searchRepository.storeEmailSortOrder(sortOrderType);
yield Right(StoreEmailSortOrderSuccess());
} catch (exception) {
yield Left(StoreEmailSortOrderFailure(exception));
}
}
}