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; EmailId? _currentEmailId;
List<EmailContent>? initialEmailContents; List<EmailContent>? initialEmailContents;
late Worker emailWorker;
PresentationMailbox? get currentMailbox => mailboxDashBoardController.selectedMailbox.value; PresentationMailbox? get currentMailbox => mailboxDashBoardController.selectedMailbox.value;
PresentationEmail? get currentEmail => mailboxDashBoardController.selectedEmail.value; PresentationEmail? get currentEmail => mailboxDashBoardController.selectedEmail.value;
@@ -85,12 +87,22 @@ class EmailController extends BaseController {
@override @override
void onInit() { void onInit() {
mailboxDashBoardController.selectedEmail.listen((presentationEmail) { _initWorker();
log('EmailController::onReady(): selectedEmail: ${presentationEmail.toString()}'); super.onInit();
if (_currentEmailId != presentationEmail?.id) { }
_currentEmailId = presentationEmail?.id;
_resetToOriginalValue(); @override
if (presentationEmail != null) { 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); _getEmailContentAction(presentationEmail.id);
if (!presentationEmail.hasRead) { if (!presentationEmail.hasRead) {
markAsEmailRead(presentationEmail, ReadActions.markAsRead); markAsEmailRead(presentationEmail, ReadActions.markAsRead);
@@ -98,13 +110,10 @@ class EmailController extends BaseController {
} }
} }
}); });
super.onInit();
} }
@override void _clearWorker() {
void onClose() { emailWorker.call();
mailboxDashBoardController.selectedEmail.close();
super.onClose();
} }
void _getEmailContentAction(EmailId emailId) async { void _getEmailContentAction(EmailId emailId) async {
@@ -92,6 +92,8 @@ class MailboxController extends BaseMailboxController {
jmap_state.State? currentMailboxState; jmap_state.State? currentMailboxState;
List<String> listMailboxNameAsStringExist = <String>[]; List<String> listMailboxNameAsStringExist = <String>[];
late Worker accountIdWorker, viewStateWorker;
MailboxController( MailboxController(
this._getAllMailboxInteractor, this._getAllMailboxInteractor,
this._refreshAllMailboxInteractor, this._refreshAllMailboxInteractor,
@@ -106,7 +108,7 @@ class MailboxController extends BaseMailboxController {
@override @override
void onInit() { void onInit() {
_onMailboxDashBoardListener(); _initWorker();
super.onInit(); super.onInit();
} }
@@ -122,10 +124,11 @@ class MailboxController extends BaseMailboxController {
@override @override
void onClose() { void onClose() {
mailboxDashBoardController.accountId.close();
mailboxDashBoardController.viewState.close();
searchInputController.dispose(); searchInputController.dispose();
searchFocus.dispose(); searchFocus.dispose();
_openMailboxEventController.close();
mailboxListScrollController.dispose();
_clearWorker();
super.onClose(); super.onClose();
} }
@@ -176,50 +179,55 @@ class MailboxController extends BaseMailboxController {
@override @override
void onError(error) {} void onError(error) {}
void _onMailboxDashBoardListener() { void _initWorker() {
mailboxDashBoardController.accountId.listen((accountId) { accountIdWorker = ever(mailboxDashBoardController.accountId, (accountId) {
log('MailboxController::_onMailboxDashBoardListener(): accountId: $accountId'); if (accountId is AccountId) {
if (accountId != null) {
getAllMailboxAction(accountId); getAllMailboxAction(accountId);
} }
}); });
mailboxDashBoardController.viewState.listen((state) { viewStateWorker = ever(mailboxDashBoardController.viewState, (state) {
log('MailboxController::_onMailboxDashBoardListener(): viewState: $viewState'); if (state is Either) {
state.fold((failure) { state.fold((failure) {
if (failure is EmptyTrashFolderFailure) { if (failure is EmptyTrashFolderFailure) {
mailboxDashBoardController.clearState(); mailboxDashBoardController.clearState();
refreshMailboxChanges(); refreshMailboxChanges();
} }
}, (success) { }, (success) {
if (success is MarkAsMultipleEmailReadAllSuccess || if (success is MarkAsMultipleEmailReadAllSuccess ||
success is MarkAsMultipleEmailReadHasSomeEmailFailure) { success is MarkAsMultipleEmailReadHasSomeEmailFailure) {
mailboxDashBoardController.clearState(); mailboxDashBoardController.clearState();
refreshMailboxChanges(); refreshMailboxChanges();
} else if (success is MoveMultipleEmailToMailboxAllSuccess || } else if (success is MoveMultipleEmailToMailboxAllSuccess ||
success is MoveMultipleEmailToMailboxHasSomeEmailFailure) { success is MoveMultipleEmailToMailboxHasSomeEmailFailure) {
mailboxDashBoardController.clearState(); mailboxDashBoardController.clearState();
refreshMailboxChanges(); refreshMailboxChanges();
} else if (success is DeleteMultipleEmailsPermanentlyAllSuccess || } else if (success is DeleteMultipleEmailsPermanentlyAllSuccess ||
success is DeleteMultipleEmailsPermanentlyHasSomeEmailFailure) { success is DeleteMultipleEmailsPermanentlyHasSomeEmailFailure) {
mailboxDashBoardController.clearState(); mailboxDashBoardController.clearState();
refreshMailboxChanges(); refreshMailboxChanges();
} else if (success is EmptyTrashFolderSuccess) { } else if (success is EmptyTrashFolderSuccess) {
mailboxDashBoardController.clearState(); mailboxDashBoardController.clearState();
refreshMailboxChanges(); refreshMailboxChanges();
} else if (success is MarkAsEmailReadSuccess || } else if (success is MarkAsEmailReadSuccess ||
success is MoveToMailboxSuccess || success is MoveToMailboxSuccess ||
success is DeleteEmailPermanentlySuccess || success is DeleteEmailPermanentlySuccess ||
success is SaveEmailAsDraftsSuccess || success is SaveEmailAsDraftsSuccess ||
success is RemoveEmailDraftsSuccess || success is RemoveEmailDraftsSuccess ||
success is SendEmailSuccess || success is SendEmailSuccess ||
success is UpdateEmailDraftsSuccess) { success is UpdateEmailDraftsSuccess) {
refreshMailboxChanges(); refreshMailboxChanges();
} }
}); });
}
}); });
} }
void _clearWorker() {
accountIdWorker.call();
viewStateWorker.call();
}
void _initCollapseMailboxCategories() { void _initCollapseMailboxCategories() {
if (kIsWeb && currentContext != null if (kIsWeb && currentContext != null
&& (_responsiveUtils.isMobile(currentContext!) || _responsiveUtils.isTablet(currentContext!))) { && (_responsiveUtils.isMobile(currentContext!) || _responsiveUtils.isTablet(currentContext!))) {
@@ -680,10 +688,4 @@ class MailboxController extends BaseMailboxController {
_cancelSelectMailbox(); _cancelSelectMailbox();
mailboxDashBoardController.closeMailboxMenuDrawer(); mailboxDashBoardController.closeMailboxMenuDrawer();
} }
@override
void dispose() {
_openMailboxEventController.close();
super.dispose();
}
} }
@@ -174,7 +174,10 @@ class MailboxDashBoardView extends GetWidget<MailboxDashBoardController> with Ne
..addOnTapAvatarActionWithPositionClick((position) => ..addOnTapAvatarActionWithPositionClick((position) =>
controller.openPopupMenuAction(context, position, popupMenuUserSettingActionTile(context, controller.openPopupMenuAction(context, position, popupMenuUserSettingActionTile(context,
controller.userProfile.value, controller.userProfile.value,
onLogoutAction: () => controller.logoutAction(), onLogoutAction: () {
popBack();
controller.logoutAction();
},
onSettingAction: () { onSettingAction: () {
popBack(); popBack();
controller.goToSettings(); controller.goToSettings();
@@ -121,7 +121,10 @@ class ManageAccountDashBoardView extends GetWidget<ManageAccountDashBoardControl
..addOnTapAvatarActionWithPositionClick((position) => ..addOnTapAvatarActionWithPositionClick((position) =>
controller.openPopupMenuAction(context, position, popupMenuUserSettingActionTile(context, controller.openPopupMenuAction(context, position, popupMenuUserSettingActionTile(context,
controller.userProfile.value, controller.userProfile.value,
onLogoutAction: () => controller.logoutAction(), onLogoutAction: () {
popBack();
controller.logoutAction();
},
onSettingAction: () { onSettingAction: () {
popBack(); popBack();
controller.goToSettings(); controller.goToSettings();
@@ -45,6 +45,8 @@ class IdentitiesController extends BaseController {
final idIdentityAll = IdentityId(Id('all')); final idIdentityAll = IdentityId(Id('all'));
late Worker accountIdWorker;
IdentitiesController( IdentitiesController(
this._getAllIdentitiesInteractor, this._getAllIdentitiesInteractor,
this._deleteIdentityInteractor, this._deleteIdentityInteractor,
@@ -55,10 +57,16 @@ class IdentitiesController extends BaseController {
@override @override
void onInit() { void onInit() {
_onAccountDashBoardListener(); _initWorker();
super.onInit(); super.onInit();
} }
@override
void onClose() {
_clearWorker();
super.onClose();
}
@override @override
void onDone() { void onDone() {
viewState.value.fold( viewState.value.fold(
@@ -91,15 +99,18 @@ class IdentitiesController extends BaseController {
void onError(error) { void onError(error) {
} }
void _onAccountDashBoardListener() { void _initWorker() {
_accountDashBoardController.accountId.listen((accountId) { accountIdWorker = ever(_accountDashBoardController.accountId, (accountId) {
log('IdentitiesController::_onAccountDashBoardListener(): accountId: $accountId'); if (accountId is AccountId) {
if (accountId != null) {
_getAllIdentities(accountId); _getAllIdentities(accountId);
} }
}); });
} }
void _clearWorker() {
accountIdWorker.call();
}
void _getAllIdentities(AccountId accountId) { void _getAllIdentities(AccountId accountId) {
consumeState(_getAllIdentitiesInteractor.execute(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/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/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/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/features/thread/presentation/model/search_status.dart';
import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
import 'package:tmail_ui_user/main/routes/app_routes.dart'; import 'package:tmail_ui_user/main/routes/app_routes.dart';
@@ -97,6 +98,7 @@ class ThreadController extends BaseController {
MailboxId? _currentMailboxId; MailboxId? _currentMailboxId;
jmap.State? _currentEmailState; jmap.State? _currentEmailState;
final ScrollController listEmailController = ScrollController(); final ScrollController listEmailController = ScrollController();
late Worker mailboxWorker, searchWorker, dashboardActionWorker, viewStateWorker;
SearchQuery? get searchQuery => mailboxDashBoardController.searchQuery; SearchQuery? get searchQuery => mailboxDashBoardController.searchQuery;
@@ -126,7 +128,7 @@ class ThreadController extends BaseController {
@override @override
void onInit() { void onInit() {
_onMailboxDashBoardListener(); _initWorker();
super.onInit(); super.onInit();
} }
@@ -138,11 +140,8 @@ class ThreadController extends BaseController {
@override @override
void onClose() { void onClose() {
mailboxDashBoardController.selectedMailbox.close();
mailboxDashBoardController.dashBoardAction.close();
mailboxDashBoardController.viewState.close();
mailboxDashBoardController.searchState.close();
listEmailController.dispose(); listEmailController.dispose();
_clearWorker();
super.onClose(); super.onClose();
} }
@@ -224,67 +223,77 @@ class ThreadController extends BaseController {
@override @override
void onError(error) {} void onError(error) {}
void _onMailboxDashBoardListener() { void _initWorker() {
mailboxDashBoardController.selectedMailbox.listen((selectedMailbox) { mailboxWorker = ever(mailboxDashBoardController.selectedMailbox, (mailbox) {
log('ThreadController::_onMailboxDashBoardListener(): selectMailbox: ${selectedMailbox?.name?.name}(${selectedMailbox?.id})'); if (mailbox is PresentationMailbox) {
if (_currentMailboxId != selectedMailbox?.id) { if (_currentMailboxId != mailbox.id) {
_currentMailboxId = selectedMailbox?.id; _currentMailboxId = mailbox.id;
_resetToOriginalValue(); _resetToOriginalValue();
_getAllEmail(); _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();
} }
}); }
}); });
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() { void _getAllEmail() {