TF-3698 Thread Detail Real time update

TF-3698 Thread Detail update reset RefreshThreadDetailAction position

TF-3698 Thread Detail refactor initializeThreadDetailEmails

TF-3698 Thread Detail refactor handleRefreshThreadDetailAction

TF-3698 Thread Detail create listThreadIds in ListEmailExtension
This commit is contained in:
DatDang
2025-05-27 11:03:28 +07:00
committed by Dat H. Pham
parent 1bc45e35f3
commit d210a892f2
28 changed files with 647 additions and 83 deletions
@@ -273,7 +273,7 @@ class ThreadRepositoryImpl extends ThreadRepository {
}
) async* {
log('ThreadRepositoryImpl::refreshChanges(): $currentState');
await _synchronizeCacheWithChanges(
final emailChangeResponse = await _synchronizeCacheWithChanges(
session,
accountId,
currentState,
@@ -305,9 +305,9 @@ class ThreadRepositoryImpl extends ThreadRepository {
propertiesCreated: propertiesCreated,
);
yield networkEmailResponse;
yield networkEmailResponse.copyWith(emailChangeResponse: emailChangeResponse);
} else {
yield newEmailResponse;
yield newEmailResponse.copyWith(emailChangeResponse: emailChangeResponse);
}
}
@@ -396,7 +396,7 @@ class ThreadRepositoryImpl extends ThreadRepository {
return listEmailIdDeleted;
}
Future<void> _synchronizeCacheWithChanges(
Future<EmailChangeResponse?> _synchronizeCacheWithChanges(
Session session,
AccountId accountId,
jmap.State currentState,
@@ -452,6 +452,8 @@ class ThreadRepositoryImpl extends ThreadRepository {
await _updateState(accountId, session.username, emailChangeResponse.newStateEmail!);
}
}
return emailChangeResponse;
}
@override
@@ -2,16 +2,19 @@
import 'package:equatable/equatable.dart';
import 'package:jmap_dart_client/jmap/core/state.dart';
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:tmail_ui_user/features/thread/data/model/email_change_response.dart';
class EmailsResponse with EquatableMixin {
final List<Email>? emailList;
final List<EmailId>? notFoundEmailIds;
final State? state;
final EmailChangeResponse? emailChangeResponse;
const EmailsResponse({
this.emailList,
this.notFoundEmailIds,
this.state
this.state,
this.emailChangeResponse,
});
bool hasEmails() => emailList != null && emailList!.isNotEmpty;
@@ -21,5 +24,24 @@ class EmailsResponse with EquatableMixin {
bool get existNotFoundEmails => notFoundEmailIds?.isNotEmpty == true;
@override
List<Object?> get props => [emailList, notFoundEmailIds, state];
List<Object?> get props => [
emailList,
notFoundEmailIds,
state,
emailChangeResponse,
];
EmailsResponse copyWith({
List<Email>? emailList,
List<EmailId>? notFoundEmailIds,
State? state,
EmailChangeResponse? emailChangeResponse,
}) {
return EmailsResponse(
emailList: emailList ?? this.emailList,
notFoundEmailIds: notFoundEmailIds ?? this.notFoundEmailIds,
state: state ?? this.state,
emailChangeResponse: emailChangeResponse ?? this.emailChangeResponse,
);
}
}
@@ -3,6 +3,7 @@ import 'package:core/presentation/state/success.dart';
import 'package:jmap_dart_client/jmap/core/state.dart';
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
import 'package:model/email/presentation_email.dart';
import 'package:tmail_ui_user/features/thread/data/model/email_change_response.dart';
class RefreshChangesAllEmailLoading extends LoadingState {}
@@ -10,18 +11,21 @@ class RefreshChangesAllEmailSuccess extends UIState {
final List<PresentationEmail> emailList;
final State? currentEmailState;
final MailboxId? currentMailboxId;
final EmailChangeResponse? emailChangeResponse;
RefreshChangesAllEmailSuccess({
required this.emailList,
this.currentEmailState,
this.currentMailboxId
this.currentMailboxId,
this.emailChangeResponse,
});
@override
List<Object?> get props => [
emailList,
currentEmailState,
currentMailboxId
currentMailboxId,
emailChangeResponse,
];
}
@@ -59,6 +59,8 @@ class RefreshChangesEmailsInMailboxInteractor {
return Right<Failure, Success>(RefreshChangesAllEmailSuccess(
emailList: presentationEmailList,
currentEmailState: emailResponse.state,
currentMailboxId: currentMailboxId));
currentMailboxId: currentMailboxId,
emailChangeResponse: emailResponse.emailChangeResponse,
));
}
}
@@ -0,0 +1,12 @@
import 'package:tmail_ui_user/features/email/presentation/action/email_ui_action.dart';
import 'package:tmail_ui_user/features/thread/data/model/email_change_response.dart';
import 'package:tmail_ui_user/features/thread/presentation/thread_controller.dart';
extension RefreshThreadDetailExtension on ThreadController {
void refreshThreadDetail(EmailChangeResponse? emailChangeResponse) {
if (emailChangeResponse == null) return;
mailboxDashBoardController
.dispatchEmailUIAction(RefreshThreadDetailAction(emailChangeResponse));
}
}
@@ -61,6 +61,7 @@ import 'package:tmail_ui_user/features/thread/domain/usecases/refresh_changes_em
import 'package:tmail_ui_user/features/thread/domain/usecases/search_email_interactor.dart';
import 'package:tmail_ui_user/features/thread/domain/usecases/search_more_email_interactor.dart';
import 'package:tmail_ui_user/features/thread/presentation/extensions/list_presentation_email_extensions.dart';
import 'package:tmail_ui_user/features/thread/presentation/extensions/refresh_thread_detail_extension.dart';
import 'package:tmail_ui_user/features/thread/presentation/mixin/email_action_controller.dart';
import 'package:tmail_ui_user/features/thread/presentation/model/delete_action_type.dart';
import 'package:tmail_ui_user/features/thread/presentation/model/loading_more_status.dart';
@@ -697,7 +698,7 @@ class ThreadController extends BaseController with EmailActionController {
}
Future<Either<Failure, Success>> _refreshChangeListEmailCache() async {
return _refreshChangesEmailsInMailboxInteractor.execute(
final refreshState = await _refreshChangesEmailsInMailboxInteractor.execute(
_session!,
_accountId!,
mailboxDashBoardController.currentEmailState!,
@@ -716,6 +717,17 @@ class ThreadController extends BaseController with EmailActionController {
mailboxId: selectedMailboxId,
),
).last;
refreshState.fold(
(failure) {},
(success) {
if (success is RefreshChangesAllEmailSuccess) {
refreshThreadDetail(success.emailChangeResponse);
}
},
);
return refreshState;
}
Future<void> _refreshChangeListEmail() async {