diff --git a/lib/features/mailbox/presentation/mailbox_controller.dart b/lib/features/mailbox/presentation/mailbox_controller.dart index 21192e457..afbe42319 100644 --- a/lib/features/mailbox/presentation/mailbox_controller.dart +++ b/lib/features/mailbox/presentation/mailbox_controller.dart @@ -563,10 +563,10 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM mailboxDashBoardController.clearFilterMessageOption(); } _disableAllSearchEmail(); - _replaceBrowserHistory(); mailboxDashBoardController.closeMailboxMenuDrawer(); mailboxDashBoardController.setSelectedMailbox(presentationMailboxSelected); mailboxDashBoardController.dispatchRoute(DashboardRoutes.thread); + _replaceBrowserHistory(); } void _disableAllSearchEmail() { diff --git a/lib/features/thread/presentation/thread_controller.dart b/lib/features/thread/presentation/thread_controller.dart index 4d37da953..13648a772 100644 --- a/lib/features/thread/presentation/thread_controller.dart +++ b/lib/features/thread/presentation/thread_controller.dart @@ -20,7 +20,6 @@ import 'package:tmail_ui_user/features/base/base_controller.dart'; import 'package:tmail_ui_user/features/composer/domain/state/save_email_as_drafts_state.dart'; import 'package:tmail_ui_user/features/composer/domain/state/send_email_state.dart'; import 'package:tmail_ui_user/features/composer/domain/state/update_email_drafts_state.dart'; -import 'package:tmail_ui_user/features/email/domain/exceptions/email_exceptions.dart'; import 'package:tmail_ui_user/features/email/domain/model/mark_read_action.dart'; import 'package:tmail_ui_user/features/email/domain/state/delete_email_permanently_state.dart'; import 'package:tmail_ui_user/features/email/domain/state/delete_multiple_emails_permanently_state.dart'; @@ -31,6 +30,7 @@ import 'package:tmail_ui_user/features/email/domain/state/store_event_attendance import 'package:tmail_ui_user/features/email/domain/state/unsubscribe_email_state.dart'; import 'package:tmail_ui_user/features/email/presentation/action/email_ui_action.dart'; import 'package:tmail_ui_user/features/email/presentation/utils/email_utils.dart'; +import 'package:tmail_ui_user/features/home/data/exceptions/session_exceptions.dart'; import 'package:tmail_ui_user/features/mailbox/domain/state/mark_as_mailbox_read_state.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/remove_email_drafts_state.dart'; import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/action/dashboard_action.dart'; @@ -104,6 +104,7 @@ class ThreadController extends BaseController with EmailActionController { bool canLoadMore = false; bool canSearchMore = false; + MailboxId? _currentMemoryMailboxId; jmap.State? _currentEmailState; final ScrollController listEmailController = ScrollController(); final FocusNode focusNodeKeyBoard = FocusNode(); @@ -113,9 +114,9 @@ class ThreadController extends BaseController with EmailActionController { Session? get _session => mailboxDashBoardController.sessionCurrent; - PresentationMailbox? get currentMailbox => mailboxDashBoardController.selectedMailbox.value; + PresentationMailbox? get selectedMailbox => mailboxDashBoardController.selectedMailbox.value; - MailboxId? get _currentMailboxId => currentMailbox?.mailboxId; + MailboxId? get selectedMailboxId => selectedMailbox?.id; search.SearchController get searchController => mailboxDashBoardController.searchController; @@ -149,6 +150,8 @@ class ThreadController extends BaseController with EmailActionController { @override void onClose() { + _currentMemoryMailboxId = null; + _currentEmailState = null; listEmailController.dispose(); focusNodeKeyBoard.dispose(); super.onClose(); @@ -235,10 +238,16 @@ class ThreadController extends BaseController with EmailActionController { void _registerObxStreamListener() { ever(mailboxDashBoardController.selectedMailbox, (mailbox) { - log('ThreadController::_registerObxStreamListener:ever: SELECTED_MAILBOX_ID = ${mailbox?.id.asString} | SELECTED_MAILBOX_NAME = ${mailbox?.name?.name}'); - _resetToOriginalValue(); - if (mailbox != null) { + log('ThreadController::_registerObxStreamListener:TEST: SelectedMailbox: ${mailbox?.id} - ${mailbox?.name} | CurrentMemoryMailboxId: $_currentMemoryMailboxId'); + if (mailbox is PresentationMailbox + && mailbox.mailboxId != _currentMemoryMailboxId) { + _currentMemoryMailboxId = mailbox.id; + consumeState(Stream.value(Right(GetAllEmailLoading()))); + _resetToOriginalValue(); _getAllEmailAction(); + } else if (mailbox == null) { // disable current mailbox when search active + _currentMemoryMailboxId = null; + _resetToOriginalValue(); } }); @@ -421,8 +430,7 @@ class ThreadController extends BaseController with EmailActionController { } void _resetToOriginalValue() { - log('ThreadController::_resetToOriginalValue:'); - consumeState(Stream.value(Right(GetAllEmailLoading()))); + log('ThreadController::_resetToOriginalValue'); mailboxDashBoardController.emailsInCurrentMailbox.clear(); mailboxDashBoardController.listEmailSelected.clear(); mailboxDashBoardController.currentSelectMode.value = SelectMode.INACTIVE; @@ -431,8 +439,8 @@ class ThreadController extends BaseController with EmailActionController { } 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}'); + if (success.currentMailboxId != selectedMailboxId) { + log('ThreadController::_getAllEmailSuccess: GetAllForMailboxEd = ${success.currentMailboxId?.asString} | SELECTED_MAILBOX_ID = ${selectedMailboxId?.asString} | SELECTED_MAILBOX_NAME = ${selectedMailbox?.name?.name}'); return; } @@ -441,7 +449,7 @@ class ThreadController extends BaseController with EmailActionController { log('ThreadController::_getAllEmailSuccess():COUNT = ${success.emailList.length} | EMAIL_STATE = $_currentEmailState'); final newListEmail = success.emailList.syncPresentationEmail( mapMailboxById: mailboxDashBoardController.mapMailboxById, - selectedMailbox: currentMailbox, + selectedMailbox: selectedMailbox, searchQuery: searchController.searchQuery, isSearchEmailRunning: searchController.isSearchEmailRunning ); @@ -463,8 +471,8 @@ 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}'); + if (success.currentMailboxId != selectedMailboxId) { + log('ThreadController::_refreshChangesAllEmailSuccess: RefreshedMailboxId = ${success.currentMailboxId?.asString} | SELECTED_MAILBOX_ID = ${selectedMailboxId?.asString} | SELECTED_MAILBOX_NAME = ${selectedMailbox?.name?.name}'); return; } @@ -475,7 +483,7 @@ class ThreadController extends BaseController with EmailActionController { final newListEmail = emailsAfterChanges.combine(emailsBeforeChanges); final emailListSynced = newListEmail.syncPresentationEmail( mapMailboxById: mailboxDashBoardController.mapMailboxById, - selectedMailbox: currentMailbox, + selectedMailbox: selectedMailbox, searchQuery: searchController.searchQuery, isSearchEmailRunning: searchController.isSearchEmailRunning ); @@ -498,13 +506,15 @@ class ThreadController extends BaseController with EmailActionController { limit: ThreadConstants.defaultLimit, sort: searchController.sortOrderFiltered.value.getSortOrder().toNullable(), emailFilter: EmailFilter( - filter: _getFilterCondition(mailboxIdSelected: _currentMailboxId), + filter: _getFilterCondition(mailboxIdSelected: selectedMailboxId), filterOption: mailboxDashBoardController.filterMessageOption.value, - mailboxId: _currentMailboxId + mailboxId: selectedMailboxId ), propertiesCreated: EmailUtils.getPropertiesForEmailGetMethod(_session!, _accountId!), propertiesUpdated: ThreadConstants.propertiesUpdatedDefault, )); + } else { + consumeState(Stream.value(Left(GetAllEmailFailure(NotFoundSessionException())))); } } @@ -537,7 +547,12 @@ class ThreadController extends BaseController with EmailActionController { } void refreshAllEmail() { - dispatchState(Right(LoadingState())); + if (searchController.isSearchEmailRunning) { + consumeState(Stream.value(Right(SearchingState()))); + } else { + consumeState(Stream.value(Right(GetAllEmailLoading()))); + } + canLoadMore = false; loadingMoreStatus.value == LoadingMoreStatus.idle; cancelSelectEmail(); @@ -573,9 +588,9 @@ class ThreadController extends BaseController with EmailActionController { propertiesCreated: EmailUtils.getPropertiesForEmailGetMethod(_session!, _accountId!), propertiesUpdated: ThreadConstants.propertiesUpdatedDefault, emailFilter: EmailFilter( - filter: _getFilterCondition(mailboxIdSelected: _currentMailboxId), + filter: _getFilterCondition(mailboxIdSelected: selectedMailboxId), filterOption: mailboxDashBoardController.filterMessageOption.value, - mailboxId: _currentMailboxId + mailboxId: selectedMailboxId ) )); } @@ -596,7 +611,7 @@ class ThreadController extends BaseController with EmailActionController { position: _searchEmailFilter.position, sort: searchController.sortOrderFiltered.value.getSortOrder().toNullable(), filterOption: mailboxDashBoardController.filterMessageOption.value, - filter: _getFilterCondition(oldestEmail: oldestEmail, mailboxIdSelected: _currentMailboxId), + filter: _getFilterCondition(oldestEmail: oldestEmail, mailboxIdSelected: selectedMailboxId), properties: EmailUtils.getPropertiesForEmailGetMethod(_session!, _accountId!), lastEmailId: oldestEmail?.id ) @@ -605,7 +620,7 @@ class ThreadController extends BaseController with EmailActionController { } bool _belongToCurrentMailboxId(PresentationEmail email) { - return (email.mailboxIds != null && email.mailboxIds!.keys.contains(currentMailbox?.id)); + return (email.mailboxIds != null && email.mailboxIds!.keys.contains(selectedMailboxId)); } bool _notDuplicatedInCurrentList(PresentationEmail email) { @@ -623,7 +638,7 @@ class ThreadController extends BaseController with EmailActionController { .toList() .syncPresentationEmail( mapMailboxById: mailboxDashBoardController.mapMailboxById, - selectedMailbox: currentMailbox, + selectedMailbox: selectedMailbox, searchQuery: searchController.searchQuery, isSearchEmailRunning: searchController.isSearchEmailRunning ); @@ -814,7 +829,7 @@ class ThreadController extends BaseController with EmailActionController { properties: EmailUtils.getPropertiesForEmailGetMethod(_session!, _accountId!), )); } else { - dispatchState(Left(SearchEmailFailure(NotFoundEmailException()))); + consumeState(Stream.value(Left(SearchEmailFailure(NotFoundSessionException())))); } } @@ -846,7 +861,7 @@ class ThreadController extends BaseController with EmailActionController { final newListEmailSearch = emailsSearchAfterChanges.combine(emailsSearchBeforeChanges); final newEmailListSynced = newListEmailSearch.syncPresentationEmail( mapMailboxById: mailboxDashBoardController.mapMailboxById, - selectedMailbox: currentMailbox, + selectedMailbox: selectedMailbox, searchQuery: searchController.searchQuery, isSearchEmailRunning: searchController.isSearchEmailRunning ); @@ -904,7 +919,7 @@ class ThreadController extends BaseController with EmailActionController { .toList() .syncPresentationEmail( mapMailboxById: mailboxDashBoardController.mapMailboxById, - selectedMailbox: currentMailbox, + selectedMailbox: selectedMailbox, searchQuery: searchController.searchQuery, isSearchEmailRunning: searchController.isSearchEmailRunning ); @@ -942,7 +957,7 @@ class ThreadController extends BaseController with EmailActionController { cancelSelectEmail(); final mailboxContainCurrent = searchController.isSearchEmailRunning ? selectionEmail.getCurrentMailboxContain(mailboxDashBoardController.mapMailboxById) - : currentMailbox; + : selectedMailbox; if (mailboxContainCurrent != null) { moveSelectedMultipleEmailToMailbox(context, selectionEmail, mailboxContainCurrent); } @@ -951,7 +966,7 @@ class ThreadController extends BaseController with EmailActionController { cancelSelectEmail(); final mailboxContainCurrent = searchController.isSearchEmailRunning ? selectionEmail.getCurrentMailboxContain(mailboxDashBoardController.mapMailboxById) - : currentMailbox; + : selectedMailbox; if (mailboxContainCurrent != null) { moveSelectedMultipleEmailToTrash(selectionEmail, mailboxContainCurrent); } @@ -959,7 +974,7 @@ class ThreadController extends BaseController with EmailActionController { case EmailActionType.deletePermanently: final mailboxContainCurrent = searchController.isSearchEmailRunning ? selectionEmail.getCurrentMailboxContain(mailboxDashBoardController.mapMailboxById) - : currentMailbox; + : selectedMailbox; if (mailboxContainCurrent != null) { deleteSelectionEmailsPermanently( context, @@ -973,7 +988,7 @@ class ThreadController extends BaseController with EmailActionController { cancelSelectEmail(); final mailboxContainCurrent = searchController.isSearchEmailRunning ? selectionEmail.getCurrentMailboxContain(mailboxDashBoardController.mapMailboxById) - : currentMailbox; + : selectedMailbox; if (mailboxContainCurrent != null) { moveSelectedMultipleEmailToSpam(selectionEmail, mailboxContainCurrent); } @@ -1043,7 +1058,7 @@ class ThreadController extends BaseController with EmailActionController { } } - bool get isMailboxTrash => mailboxDashBoardController.selectedMailbox.value?.isTrash == true; + bool get isMailboxTrash => selectedMailbox?.isTrash == true; void openMailboxLeftMenu() { mailboxDashBoardController.openMailboxMenuDrawer(); @@ -1089,7 +1104,7 @@ class ThreadController extends BaseController with EmailActionController { emailId: currentEmail.id, mailboxId: searchController.isSearchEmailRunning ? currentEmail.mailboxContain?.mailboxId - : currentMailbox?.id, + : selectedMailboxId, searchQuery: searchController.isSearchEmailRunning ? searchQuery : null, @@ -1204,21 +1219,19 @@ class ThreadController extends BaseController with EmailActionController { } bool get isNewFolderCreated { - final currentMailbox = mailboxDashBoardController.selectedMailbox.value; - return currentMailbox != null && - currentMailbox.isPersonal && - !currentMailbox.isDefault; + return selectedMailbox != null && + selectedMailbox!.isPersonal && + !selectedMailbox!.isDefault; } void goToCreateEmailRuleView() async { final accountId = mailboxDashBoardController.accountId.value; final session = mailboxDashBoardController.sessionCurrent; - final currentMailbox = mailboxDashBoardController.selectedMailbox.value; if (accountId != null && session != null) { final arguments = RulesFilterCreatorArguments( accountId, session, - mailboxDestination: currentMailbox + mailboxDestination: selectedMailbox ); final newRuleFilterRequest = PlatformInfo.isWeb diff --git a/lib/features/thread/presentation/thread_view.dart b/lib/features/thread/presentation/thread_view.dart index 59bc6deac..f2c6b5190 100644 --- a/lib/features/thread/presentation/thread_view.dart +++ b/lib/features/thread/presentation/thread_view.dart @@ -18,6 +18,7 @@ import 'package:tmail_ui_user/features/manage_account/presentation/vacation/widg import 'package:tmail_ui_user/features/network_connection/presentation/network_connection_banner_widget.dart'; import 'package:tmail_ui_user/features/quotas/presentation/widget/quotas_banner_widget.dart'; import 'package:tmail_ui_user/features/thread/domain/model/filter_message_option.dart'; +import 'package:tmail_ui_user/features/thread/domain/state/get_all_email_state.dart'; import 'package:tmail_ui_user/features/thread/domain/state/search_email_state.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'; @@ -68,7 +69,7 @@ class ThreadView extends GetWidget ... [ Obx(() { return AppBarThreadWidget( - mailboxSelected: controller.currentMailbox, + mailboxSelected: controller.selectedMailbox, listEmailSelected: controller.mailboxDashBoardController.emailsInCurrentMailbox.listEmailSelected, selectMode: controller.mailboxDashBoardController.currentSelectMode.value, filterOption: controller.mailboxDashBoardController.filterMessageOption.value, @@ -654,17 +655,26 @@ class ThreadView extends GetWidget Widget _buildEmptyEmail(BuildContext context) { return Obx(() => controller.viewState.value.fold( (failure) => const SizedBox.shrink(), - (success) => success is! LoadingState && success is! SearchingState - ? EmptyEmailsWidget( - key: const Key('empty_thread_view'), - title: _getMessageEmptyEmail(context), - iconSVG: controller.imagePaths.icEmptyEmail, - subTitle: _getSubMessageEmptyEmail(context), - onCreateFiltersActionCallback: controller.isNewFolderCreated - ? controller.goToCreateEmailRuleView - : null, - ) - : const SizedBox.shrink()) + (success) { + if (success is! GetAllEmailLoading && success is! SearchingState) { + if (success is GetAllEmailSuccess + && success.currentMailboxId != controller.selectedMailboxId) { + return const SizedBox.shrink(); + } else { + return EmptyEmailsWidget( + key: const Key('empty_thread_view'), + title: _getMessageEmptyEmail(context), + iconSVG: controller.imagePaths.icEmptyEmail, + subTitle: _getSubMessageEmptyEmail(context), + onCreateFiltersActionCallback: controller.isNewFolderCreated + ? controller.goToCreateEmailRuleView + : null, + ); + } + } else { + return const SizedBox.shrink(); + } + }) ); }