TF-474 Use Ever/Worker to listen Obx object

This commit is contained in:
dab246
2022-05-06 18:05:36 +07:00
committed by Dat H. Pham
parent 5cc5ff9761
commit 275fe6faf9
6 changed files with 165 additions and 128 deletions
@@ -68,6 +68,8 @@ class EmailController extends BaseController {
EmailId? _currentEmailId;
List<EmailContent>? initialEmailContents;
late Worker emailWorker;
PresentationMailbox? get currentMailbox => mailboxDashBoardController.selectedMailbox.value;
PresentationEmail? get currentEmail => mailboxDashBoardController.selectedEmail.value;
@@ -85,12 +87,22 @@ class EmailController extends BaseController {
@override
void onInit() {
mailboxDashBoardController.selectedEmail.listen((presentationEmail) {
log('EmailController::onReady(): selectedEmail: ${presentationEmail.toString()}');
if (_currentEmailId != presentationEmail?.id) {
_currentEmailId = presentationEmail?.id;
_resetToOriginalValue();
if (presentationEmail != null) {
_initWorker();
super.onInit();
}
@override
void onClose() {
_clearWorker();
super.onClose();
}
void _initWorker() {
emailWorker = ever( mailboxDashBoardController.selectedEmail, (presentationEmail) {
if (presentationEmail is PresentationEmail) {
if (_currentEmailId != presentationEmail.id) {
_currentEmailId = presentationEmail.id;
_resetToOriginalValue();
_getEmailContentAction(presentationEmail.id);
if (!presentationEmail.hasRead) {
markAsEmailRead(presentationEmail, ReadActions.markAsRead);
@@ -98,13 +110,10 @@ class EmailController extends BaseController {
}
}
});
super.onInit();
}
@override
void onClose() {
mailboxDashBoardController.selectedEmail.close();
super.onClose();
void _clearWorker() {
emailWorker.call();
}
void _getEmailContentAction(EmailId emailId) async {
@@ -92,6 +92,8 @@ class MailboxController extends BaseMailboxController {
jmap_state.State? currentMailboxState;
List<String> listMailboxNameAsStringExist = <String>[];
late Worker accountIdWorker, viewStateWorker;
MailboxController(
this._getAllMailboxInteractor,
this._refreshAllMailboxInteractor,
@@ -106,7 +108,7 @@ class MailboxController extends BaseMailboxController {
@override
void onInit() {
_onMailboxDashBoardListener();
_initWorker();
super.onInit();
}
@@ -122,10 +124,11 @@ class MailboxController extends BaseMailboxController {
@override
void onClose() {
mailboxDashBoardController.accountId.close();
mailboxDashBoardController.viewState.close();
searchInputController.dispose();
searchFocus.dispose();
_openMailboxEventController.close();
mailboxListScrollController.dispose();
_clearWorker();
super.onClose();
}
@@ -176,50 +179,55 @@ class MailboxController extends BaseMailboxController {
@override
void onError(error) {}
void _onMailboxDashBoardListener() {
mailboxDashBoardController.accountId.listen((accountId) {
log('MailboxController::_onMailboxDashBoardListener(): accountId: $accountId');
if (accountId != null) {
void _initWorker() {
accountIdWorker = ever(mailboxDashBoardController.accountId, (accountId) {
if (accountId is AccountId) {
getAllMailboxAction(accountId);
}
});
mailboxDashBoardController.viewState.listen((state) {
log('MailboxController::_onMailboxDashBoardListener(): viewState: $viewState');
state.fold((failure) {
if (failure is EmptyTrashFolderFailure) {
mailboxDashBoardController.clearState();
refreshMailboxChanges();
}
}, (success) {
if (success is MarkAsMultipleEmailReadAllSuccess ||
success is MarkAsMultipleEmailReadHasSomeEmailFailure) {
mailboxDashBoardController.clearState();
refreshMailboxChanges();
} else if (success is MoveMultipleEmailToMailboxAllSuccess ||
success is MoveMultipleEmailToMailboxHasSomeEmailFailure) {
mailboxDashBoardController.clearState();
refreshMailboxChanges();
} else if (success is DeleteMultipleEmailsPermanentlyAllSuccess ||
success is DeleteMultipleEmailsPermanentlyHasSomeEmailFailure) {
mailboxDashBoardController.clearState();
refreshMailboxChanges();
} else if (success is EmptyTrashFolderSuccess) {
mailboxDashBoardController.clearState();
refreshMailboxChanges();
} else if (success is MarkAsEmailReadSuccess ||
success is MoveToMailboxSuccess ||
success is DeleteEmailPermanentlySuccess ||
success is SaveEmailAsDraftsSuccess ||
success is RemoveEmailDraftsSuccess ||
success is SendEmailSuccess ||
success is UpdateEmailDraftsSuccess) {
refreshMailboxChanges();
}
});
viewStateWorker = ever(mailboxDashBoardController.viewState, (state) {
if (state is Either) {
state.fold((failure) {
if (failure is EmptyTrashFolderFailure) {
mailboxDashBoardController.clearState();
refreshMailboxChanges();
}
}, (success) {
if (success is MarkAsMultipleEmailReadAllSuccess ||
success is MarkAsMultipleEmailReadHasSomeEmailFailure) {
mailboxDashBoardController.clearState();
refreshMailboxChanges();
} else if (success is MoveMultipleEmailToMailboxAllSuccess ||
success is MoveMultipleEmailToMailboxHasSomeEmailFailure) {
mailboxDashBoardController.clearState();
refreshMailboxChanges();
} else if (success is DeleteMultipleEmailsPermanentlyAllSuccess ||
success is DeleteMultipleEmailsPermanentlyHasSomeEmailFailure) {
mailboxDashBoardController.clearState();
refreshMailboxChanges();
} else if (success is EmptyTrashFolderSuccess) {
mailboxDashBoardController.clearState();
refreshMailboxChanges();
} else if (success is MarkAsEmailReadSuccess ||
success is MoveToMailboxSuccess ||
success is DeleteEmailPermanentlySuccess ||
success is SaveEmailAsDraftsSuccess ||
success is RemoveEmailDraftsSuccess ||
success is SendEmailSuccess ||
success is UpdateEmailDraftsSuccess) {
refreshMailboxChanges();
}
});
}
});
}
void _clearWorker() {
accountIdWorker.call();
viewStateWorker.call();
}
void _initCollapseMailboxCategories() {
if (kIsWeb && currentContext != null
&& (_responsiveUtils.isMobile(currentContext!) || _responsiveUtils.isTablet(currentContext!))) {
@@ -680,10 +688,4 @@ class MailboxController extends BaseMailboxController {
_cancelSelectMailbox();
mailboxDashBoardController.closeMailboxMenuDrawer();
}
@override
void dispose() {
_openMailboxEventController.close();
super.dispose();
}
}
@@ -174,7 +174,10 @@ class MailboxDashBoardView extends GetWidget<MailboxDashBoardController> with Ne
..addOnTapAvatarActionWithPositionClick((position) =>
controller.openPopupMenuAction(context, position, popupMenuUserSettingActionTile(context,
controller.userProfile.value,
onLogoutAction: () => controller.logoutAction(),
onLogoutAction: () {
popBack();
controller.logoutAction();
},
onSettingAction: () {
popBack();
controller.goToSettings();
@@ -121,7 +121,10 @@ class ManageAccountDashBoardView extends GetWidget<ManageAccountDashBoardControl
..addOnTapAvatarActionWithPositionClick((position) =>
controller.openPopupMenuAction(context, position, popupMenuUserSettingActionTile(context,
controller.userProfile.value,
onLogoutAction: () => controller.logoutAction(),
onLogoutAction: () {
popBack();
controller.logoutAction();
},
onSettingAction: () {
popBack();
controller.goToSettings();
@@ -45,6 +45,8 @@ class IdentitiesController extends BaseController {
final idIdentityAll = IdentityId(Id('all'));
late Worker accountIdWorker;
IdentitiesController(
this._getAllIdentitiesInteractor,
this._deleteIdentityInteractor,
@@ -55,10 +57,16 @@ class IdentitiesController extends BaseController {
@override
void onInit() {
_onAccountDashBoardListener();
_initWorker();
super.onInit();
}
@override
void onClose() {
_clearWorker();
super.onClose();
}
@override
void onDone() {
viewState.value.fold(
@@ -91,15 +99,18 @@ class IdentitiesController extends BaseController {
void onError(error) {
}
void _onAccountDashBoardListener() {
_accountDashBoardController.accountId.listen((accountId) {
log('IdentitiesController::_onAccountDashBoardListener(): accountId: $accountId');
if (accountId != null) {
void _initWorker() {
accountIdWorker = ever(_accountDashBoardController.accountId, (accountId) {
if (accountId is AccountId) {
_getAllIdentities(accountId);
}
});
}
void _clearWorker() {
accountIdWorker.call();
}
void _getAllIdentities(AccountId accountId) {
consumeState(_getAllIdentitiesInteractor.execute(accountId));
}
@@ -61,6 +61,7 @@ import 'package:tmail_ui_user/features/thread/domain/usecases/search_email_inter
import 'package:tmail_ui_user/features/thread/domain/usecases/search_more_email_interactor.dart';
import 'package:tmail_ui_user/features/thread/presentation/extensions/filter_message_option_extension.dart';
import 'package:tmail_ui_user/features/thread/presentation/model/delete_action_type.dart';
import 'package:tmail_ui_user/features/thread/presentation/model/search_state.dart';
import 'package:tmail_ui_user/features/thread/presentation/model/search_status.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/routes/app_routes.dart';
@@ -97,6 +98,7 @@ class ThreadController extends BaseController {
MailboxId? _currentMailboxId;
jmap.State? _currentEmailState;
final ScrollController listEmailController = ScrollController();
late Worker mailboxWorker, searchWorker, dashboardActionWorker, viewStateWorker;
SearchQuery? get searchQuery => mailboxDashBoardController.searchQuery;
@@ -126,7 +128,7 @@ class ThreadController extends BaseController {
@override
void onInit() {
_onMailboxDashBoardListener();
_initWorker();
super.onInit();
}
@@ -138,11 +140,8 @@ class ThreadController extends BaseController {
@override
void onClose() {
mailboxDashBoardController.selectedMailbox.close();
mailboxDashBoardController.dashBoardAction.close();
mailboxDashBoardController.viewState.close();
mailboxDashBoardController.searchState.close();
listEmailController.dispose();
_clearWorker();
super.onClose();
}
@@ -224,67 +223,77 @@ class ThreadController extends BaseController {
@override
void onError(error) {}
void _onMailboxDashBoardListener() {
mailboxDashBoardController.selectedMailbox.listen((selectedMailbox) {
log('ThreadController::_onMailboxDashBoardListener(): selectMailbox: ${selectedMailbox?.name?.name}(${selectedMailbox?.id})');
if (_currentMailboxId != selectedMailbox?.id) {
_currentMailboxId = selectedMailbox?.id;
_resetToOriginalValue();
_getAllEmail();
}
});
mailboxDashBoardController.searchState.listen((state) {
log('ThreadController::_onMailboxDashBoardListener(): searchState: $state');
if (state.searchStatus == SearchStatus.INACTIVE) {
emailListSearch.clear();
} else if (state.searchStatus == SearchStatus.ACTIVE) {
cancelSelectEmail();
}
});
mailboxDashBoardController.dashBoardAction.listen((action) {
log('ThreadController::_onMailboxDashBoardListener(): dashBoardAction: ${action.runtimeType}');
if (action is RefreshAllEmailAction) {
refreshAllEmail();
mailboxDashBoardController.clearDashBoardAction();
} else if (action is MarkAsReadAllEmailAction) {
markAsReadAllEmails();
mailboxDashBoardController.clearDashBoardAction();
} if (action is SelectionAllEmailAction) {
setSelectAllEmailAction();
mailboxDashBoardController.clearDashBoardAction();
} if (action is CancelSelectionAllEmailAction) {
cancelSelectEmail();
mailboxDashBoardController.clearDashBoardAction();
} if (action is FilterMessageAction) {
filterMessagesAction(action.context, action.option);
mailboxDashBoardController.clearDashBoardAction();
} if (action is HandleEmailActionTypeAction) {
log('ThreadController::_onMailboxDashBoardListener(): ${action.listEmailSelected.length}');
pressEmailSelectionAction(action.context, action.emailAction, action.listEmailSelected);
mailboxDashBoardController.clearDashBoardAction();
}
});
mailboxDashBoardController.viewState.listen((state) {
log('ThreadController::_onMailboxDashBoardListener(): viewState: $state');
state.map((success) {
if (success is SearchEmailNewQuery){
mailboxDashBoardController.clearState();
_searchEmail();
} else if (success is MarkAsEmailReadSuccess
|| success is MoveToMailboxSuccess
|| success is MarkAsStarEmailSuccess
|| success is DeleteEmailPermanentlySuccess
|| success is SaveEmailAsDraftsSuccess
|| success is RemoveEmailDraftsSuccess
|| success is SendEmailSuccess
|| success is UpdateEmailDraftsSuccess) {
_refreshEmailChanges();
void _initWorker() {
mailboxWorker = ever(mailboxDashBoardController.selectedMailbox, (mailbox) {
if (mailbox is PresentationMailbox) {
if (_currentMailboxId != mailbox.id) {
_currentMailboxId = mailbox.id;
_resetToOriginalValue();
_getAllEmail();
}
});
}
});
searchWorker = ever(mailboxDashBoardController.searchState, (searchState) {
if (searchState is SearchState) {
if (searchState.searchStatus == SearchStatus.INACTIVE) {
emailListSearch.clear();
} else if (searchState.searchStatus == SearchStatus.ACTIVE) {
cancelSelectEmail();
}
}
});
dashboardActionWorker = ever(mailboxDashBoardController.dashBoardAction, (action) {
if (action is DashBoardAction) {
if (action is RefreshAllEmailAction) {
refreshAllEmail();
mailboxDashBoardController.clearDashBoardAction();
} else if (action is MarkAsReadAllEmailAction) {
markAsReadAllEmails();
mailboxDashBoardController.clearDashBoardAction();
} if (action is SelectionAllEmailAction) {
setSelectAllEmailAction();
mailboxDashBoardController.clearDashBoardAction();
} if (action is CancelSelectionAllEmailAction) {
cancelSelectEmail();
mailboxDashBoardController.clearDashBoardAction();
} if (action is FilterMessageAction) {
filterMessagesAction(action.context, action.option);
mailboxDashBoardController.clearDashBoardAction();
} if (action is HandleEmailActionTypeAction) {
pressEmailSelectionAction(action.context, action.emailAction, action.listEmailSelected);
mailboxDashBoardController.clearDashBoardAction();
}
}
});
viewStateWorker = ever(mailboxDashBoardController.viewState, (viewState) {
if (viewState is Either) {
viewState.map((success) {
if (success is SearchEmailNewQuery){
mailboxDashBoardController.clearState();
_searchEmail();
} else if (success is MarkAsEmailReadSuccess
|| success is MoveToMailboxSuccess
|| success is MarkAsStarEmailSuccess
|| success is DeleteEmailPermanentlySuccess
|| success is SaveEmailAsDraftsSuccess
|| success is RemoveEmailDraftsSuccess
|| success is SendEmailSuccess
|| success is UpdateEmailDraftsSuccess) {
_refreshEmailChanges();
}
});
}
});
}
void _clearWorker() {
mailboxWorker.call();
dashboardActionWorker.call();
searchWorker.call();
viewStateWorker.call();
}
void _getAllEmail() {