From 71ae7089396d3ad07b639a8cca80c9ccbe4b936f Mon Sep 17 00:00:00 2001 From: dab246 Date: Fri, 19 Jul 2024 16:04:44 +0700 Subject: [PATCH] TF-2925 Fix change mailbox very quick when refreshing after any mail action make the message list is not showed correctly --- .../presentation/mailbox_controller.dart | 2 +- .../mailbox_dashboard_controller.dart | 9 ++--- .../domain/state/get_all_email_state.dart | 14 ++++++-- .../refresh_changes_all_email_state.dart | 14 ++++++-- .../get_emails_in_mailbox_interactor.dart | 14 ++++++-- ..._changes_emails_in_mailbox_interactor.dart | 14 ++++++-- .../presentation/thread_controller.dart | 34 ++++++++++++------- ...get_emails_in_mailbox_interactor_test.dart | 6 ++-- ...ges_emails_in_mailbox_interactor_test.dart | 3 +- 9 files changed, 76 insertions(+), 34 deletions(-) diff --git a/lib/features/mailbox/presentation/mailbox_controller.dart b/lib/features/mailbox/presentation/mailbox_controller.dart index 8438d6254..f65fe3918 100644 --- a/lib/features/mailbox/presentation/mailbox_controller.dart +++ b/lib/features/mailbox/presentation/mailbox_controller.dart @@ -553,7 +553,7 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM BuildContext context, PresentationMailbox presentationMailboxSelected ) { - log('MailboxController::_handleOpenMailbox():MailboxName: ${presentationMailboxSelected.name}'); + log('MailboxController::_handleOpenMailbox():MAILBOX_ID = ${presentationMailboxSelected.id.asString} | MAILBOX_NAME: ${presentationMailboxSelected.name?.name}'); KeyboardUtils.hideKeyboard(context); mailboxDashBoardController.clearSelectedEmail(); if (presentationMailboxSelected.id != mailboxDashBoardController.selectedMailbox.value?.id) { diff --git a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart index a1272447e..1d098932d 100644 --- a/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart +++ b/lib/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart @@ -586,13 +586,8 @@ class MailboxDashBoardController extends ReloadableController { } void setSelectedMailbox(PresentationMailbox? newPresentationMailbox) { - final previousMailbox = selectedMailbox.value; - if (previousMailbox == newPresentationMailbox) { - selectedMailbox.value = newPresentationMailbox; - selectedMailbox.refresh(); - } else { - selectedMailbox.value = newPresentationMailbox; - } + log('MailboxDashBoardController::setSelectedMailbox: SELECTED_MAILBOX_ID = ${newPresentationMailbox?.id.asString} | SELECTED_MAILBOX_NAME = ${newPresentationMailbox?.name?.name} | '); + selectedMailbox.value = newPresentationMailbox; } void setSelectedEmail(PresentationEmail? newPresentationEmail) { diff --git a/lib/features/thread/domain/state/get_all_email_state.dart b/lib/features/thread/domain/state/get_all_email_state.dart index dcd722b4b..7c302c2bb 100644 --- a/lib/features/thread/domain/state/get_all_email_state.dart +++ b/lib/features/thread/domain/state/get_all_email_state.dart @@ -1,6 +1,7 @@ import 'package:core/presentation/state/failure.dart'; 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'; class RefreshAllEmailLoading extends LoadingState {} @@ -10,11 +11,20 @@ class GetAllEmailLoading extends LoadingState {} class GetAllEmailSuccess extends UIState { final List emailList; final State? currentEmailState; + final MailboxId? currentMailboxId; - GetAllEmailSuccess({required this.emailList, this.currentEmailState}); + GetAllEmailSuccess({ + required this.emailList, + this.currentEmailState, + this.currentMailboxId, + }); @override - List get props => [emailList, currentEmailState]; + List get props => [ + emailList, + currentEmailState, + currentMailboxId, + ]; } class GetAllEmailFailure extends FeatureFailure { diff --git a/lib/features/thread/domain/state/refresh_changes_all_email_state.dart b/lib/features/thread/domain/state/refresh_changes_all_email_state.dart index ca5d9f3f3..f281d436e 100644 --- a/lib/features/thread/domain/state/refresh_changes_all_email_state.dart +++ b/lib/features/thread/domain/state/refresh_changes_all_email_state.dart @@ -1,6 +1,7 @@ import 'package:core/presentation/state/failure.dart'; 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'; class RefreshChangesAllEmailLoading extends LoadingState {} @@ -8,11 +9,20 @@ class RefreshChangesAllEmailLoading extends LoadingState {} class RefreshChangesAllEmailSuccess extends UIState { final List emailList; final State? currentEmailState; + final MailboxId? currentMailboxId; - RefreshChangesAllEmailSuccess({required this.emailList, this.currentEmailState}); + RefreshChangesAllEmailSuccess({ + required this.emailList, + this.currentEmailState, + this.currentMailboxId + }); @override - List get props => [emailList, currentEmailState]; + List get props => [ + emailList, + currentEmailState, + currentMailboxId + ]; } class RefreshChangesAllEmailFailure extends FeatureFailure { diff --git a/lib/features/thread/domain/usecases/get_emails_in_mailbox_interactor.dart b/lib/features/thread/domain/usecases/get_emails_in_mailbox_interactor.dart index 497f98299..7bb5fa1e7 100644 --- a/lib/features/thread/domain/usecases/get_emails_in_mailbox_interactor.dart +++ b/lib/features/thread/domain/usecases/get_emails_in_mailbox_interactor.dart @@ -5,6 +5,7 @@ import 'package:jmap_dart_client/jmap/core/properties/properties.dart'; import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:jmap_dart_client/jmap/core/sort/comparator.dart'; import 'package:jmap_dart_client/jmap/core/unsigned_int.dart'; +import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; import 'package:tmail_ui_user/features/thread/domain/model/email_filter.dart'; import 'package:tmail_ui_user/features/thread/domain/model/email_response.dart'; import 'package:tmail_ui_user/features/thread/domain/repository/thread_repository.dart'; @@ -39,18 +40,25 @@ class GetEmailsInMailboxInteractor { emailFilter: emailFilter, propertiesCreated: propertiesCreated, propertiesUpdated: propertiesUpdated) - .map(_toGetEmailState); + .map((emailResponse) => _toGetEmailState( + emailResponse: emailResponse, + currentMailboxId: emailFilter?.mailboxId + )); } catch (e) { yield Left(GetAllEmailFailure(e)); } } - Either _toGetEmailState(EmailsResponse emailResponse) { + Either _toGetEmailState({ + required EmailsResponse emailResponse, + MailboxId? currentMailboxId, + }) { final presentationEmailList = emailResponse.emailList ?.map((email) => email.toPresentationEmail()).toList() ?? List.empty(); return Right(GetAllEmailSuccess( emailList: presentationEmailList, - currentEmailState: emailResponse.state)); + currentEmailState: emailResponse.state, + currentMailboxId: currentMailboxId)); } } \ No newline at end of file diff --git a/lib/features/thread/domain/usecases/refresh_changes_emails_in_mailbox_interactor.dart b/lib/features/thread/domain/usecases/refresh_changes_emails_in_mailbox_interactor.dart index 96623df70..032c56280 100644 --- a/lib/features/thread/domain/usecases/refresh_changes_emails_in_mailbox_interactor.dart +++ b/lib/features/thread/domain/usecases/refresh_changes_emails_in_mailbox_interactor.dart @@ -4,6 +4,7 @@ import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/core/properties/properties.dart'; import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:jmap_dart_client/jmap/core/sort/comparator.dart'; +import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; import 'package:tmail_ui_user/features/thread/domain/model/email_filter.dart'; import 'package:tmail_ui_user/features/thread/domain/model/email_response.dart'; import 'package:tmail_ui_user/features/thread/domain/repository/thread_repository.dart'; @@ -39,18 +40,25 @@ class RefreshChangesEmailsInMailboxInteractor { propertiesCreated: propertiesCreated, propertiesUpdated: propertiesUpdated, emailFilter: emailFilter) - .map(_toGetEmailState); + .map((emailResponse) => _toGetEmailState( + emailResponse: emailResponse, + currentMailboxId: emailFilter?.mailboxId + )); } catch (e) { yield Left(RefreshChangesAllEmailFailure(e)); } } - Either _toGetEmailState(EmailsResponse emailResponse) { + Either _toGetEmailState({ + required EmailsResponse emailResponse, + MailboxId? currentMailboxId + }) { final presentationEmailList = emailResponse.emailList ?.map((email) => email.toPresentationEmail()).toList() ?? List.empty(); return Right(RefreshChangesAllEmailSuccess( emailList: presentationEmailList, - currentEmailState: emailResponse.state)); + currentEmailState: emailResponse.state, + currentMailboxId: currentMailboxId)); } } \ No newline at end of file diff --git a/lib/features/thread/presentation/thread_controller.dart b/lib/features/thread/presentation/thread_controller.dart index 37e74ead8..ba22218fb 100644 --- a/lib/features/thread/presentation/thread_controller.dart +++ b/lib/features/thread/presentation/thread_controller.dart @@ -104,7 +104,6 @@ class ThreadController extends BaseController with EmailActionController { bool canLoadMore = false; bool canSearchMore = false; - MailboxId? _currentMailboxId; jmap.State? _currentEmailState; final ScrollController listEmailController = ScrollController(); final FocusNode focusNodeKeyBoard = FocusNode(); @@ -116,6 +115,8 @@ class ThreadController extends BaseController with EmailActionController { PresentationMailbox? get currentMailbox => mailboxDashBoardController.selectedMailbox.value; + MailboxId? get _currentMailboxId => currentMailbox?.mailboxId; + search.SearchController get searchController => mailboxDashBoardController.searchController; SearchEmailFilter get _searchEmailFilter => searchController.searchEmailFilter.value; @@ -142,7 +143,7 @@ class ThreadController extends BaseController with EmailActionController { @override void onReady() { - dispatchState(Right(LoadingState())); + consumeState(Stream.value(Right(GetAllEmailLoading()))); super.onReady(); } @@ -234,15 +235,10 @@ class ThreadController extends BaseController with EmailActionController { void _registerObxStreamListener() { ever(mailboxDashBoardController.selectedMailbox, (mailbox) { - if (mailbox is PresentationMailbox) { - if (_currentMailboxId != mailbox.id) { - _currentMailboxId = mailbox.id; - _resetToOriginalValue(); - _getAllEmailAction(); - } - } else if (mailbox == null) { // disable current mailbox when search active - _currentMailboxId = null; - _resetToOriginalValue(); + log('ThreadController::_registerObxStreamListener:ever: SELECTED_MAILBOX_ID = ${mailbox?.id.asString} | SELECTED_MAILBOX_NAME = ${mailbox?.name?.name}'); + _resetToOriginalValue(); + if (mailbox != null) { + _getAllEmailAction(); } }); @@ -425,14 +421,21 @@ class ThreadController extends BaseController with EmailActionController { } void _resetToOriginalValue() { - dispatchState(Right(LoadingState())); + log('ThreadController::_resetToOriginalValue:'); + consumeState(Stream.value(Right(GetAllEmailLoading()))); mailboxDashBoardController.emailsInCurrentMailbox.clear(); + mailboxDashBoardController.listEmailSelected.clear(); + mailboxDashBoardController.currentSelectMode.value = SelectMode.INACTIVE; canLoadMore = false; loadingMoreStatus.value = LoadingMoreStatus.idle; - cancelSelectEmail(); } void _getAllEmailSuccess(GetAllEmailSuccess success) { + if (success.currentMailboxId != currentMailbox?.mailboxId) { + log('ThreadController::_getAllEmailSuccess: SELECTED_MAILBOX_ID = ${success.currentMailboxId?.asString} | CURRENT_MAILBOX_ID = ${currentMailbox?.mailboxId?.asString} | CURRENT_MAILBOX_NAME = ${currentMailbox?.name?.name}'); + return; + } + mailboxDashBoardController.refreshingMailboxState.value = Right(success); _currentEmailState = success.currentEmailState; log('ThreadController::_getAllEmailSuccess():COUNT = ${success.emailList.length} | EMAIL_STATE = $_currentEmailState'); @@ -460,6 +463,11 @@ class ThreadController extends BaseController with EmailActionController { } void _refreshChangesAllEmailSuccess(RefreshChangesAllEmailSuccess success) { + if (success.currentMailboxId != currentMailbox?.mailboxId) { + log('ThreadController::_refreshChangesAllEmailSuccess: SELECTED_MAILBOX_ID = ${success.currentMailboxId?.asString} | CURRENT_MAILBOX_ID = ${currentMailbox?.mailboxId?.asString} | CURRENT_MAILBOX_NAME = ${currentMailbox?.name?.name}'); + return; + } + _currentEmailState = success.currentEmailState; log('ThreadController::_refreshChangesAllEmailSuccess: COUNT = ${success.emailList.length}'); final emailsBeforeChanges = mailboxDashBoardController.emailsInCurrentMailbox; diff --git a/test/features/thread/domain/usecases/get_emails_in_mailbox_interactor_test.dart b/test/features/thread/domain/usecases/get_emails_in_mailbox_interactor_test.dart index 72f78d0c5..041a98873 100644 --- a/test/features/thread/domain/usecases/get_emails_in_mailbox_interactor_test.dart +++ b/test/features/thread/domain/usecases/get_emails_in_mailbox_interactor_test.dart @@ -87,7 +87,8 @@ void main() { EmailFixtures.email1.toPresentationEmail(), EmailFixtures.email2.toPresentationEmail() }.toList(), - currentEmailState: jmap.State('s1')) + currentEmailState: jmap.State('s1'), + currentMailboxId: MailboxFixtures.inboxMailbox.id) ), Right(GetAllEmailSuccess( emailList: { @@ -97,7 +98,8 @@ void main() { EmailFixtures.email4.toPresentationEmail(), EmailFixtures.email5.toPresentationEmail(), }.toList(), - currentEmailState: jmap.State('s1')) + currentEmailState: jmap.State('s1'), + currentMailboxId: MailboxFixtures.inboxMailbox.id) ) })); }); diff --git a/test/features/thread/domain/usecases/refresh_changes_emails_in_mailbox_interactor_test.dart b/test/features/thread/domain/usecases/refresh_changes_emails_in_mailbox_interactor_test.dart index fd9c54d72..46e123728 100644 --- a/test/features/thread/domain/usecases/refresh_changes_emails_in_mailbox_interactor_test.dart +++ b/test/features/thread/domain/usecases/refresh_changes_emails_in_mailbox_interactor_test.dart @@ -80,7 +80,8 @@ void main() { EmailFixtures.email4.toPresentationEmail(), EmailFixtures.email5.toPresentationEmail(), }.toList(), - currentEmailState: jmap.State('s1')) + currentEmailState: jmap.State('s1'), + currentMailboxId: MailboxFixtures.inboxMailbox.id) ) })); });