TF-3334 Auto resynchronisation mailbox search view when receives websocket notification

This commit is contained in:
dab246
2024-12-18 14:01:10 +07:00
committed by Dat H. Pham
parent 971b81188d
commit 75231636e2
2 changed files with 79 additions and 88 deletions
@@ -239,7 +239,6 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM
mailboxDashBoardController.clearMailboxUIAction(); mailboxDashBoardController.clearMailboxUIAction();
} else if (action is RefreshChangeMailboxAction) { } else if (action is RefreshChangeMailboxAction) {
_refreshMailboxChanges(newState: action.newState); _refreshMailboxChanges(newState: action.newState);
mailboxDashBoardController.clearMailboxUIAction();
} else if (action is OpenMailboxAction) { } else if (action is OpenMailboxAction) {
if (currentContext != null) { if (currentContext != null) {
_handleOpenMailbox(currentContext!, action.presentationMailbox); _handleOpenMailbox(currentContext!, action.presentationMailbox);
@@ -11,7 +11,6 @@ import 'package:flutter_svg/flutter_svg.dart';
import 'package:get/get.dart'; import 'package:get/get.dart';
import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/core/error/method/error_method_response.dart'; import 'package:jmap_dart_client/jmap/core/error/method/error_method_response.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/session/session.dart';
import 'package:jmap_dart_client/jmap/core/state.dart' as jmap; import 'package:jmap_dart_client/jmap/core/state.dart' as jmap;
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
@@ -34,7 +33,6 @@ import 'package:tmail_ui_user/features/mailbox/domain/model/subscribe_request.da
import 'package:tmail_ui_user/features/mailbox/domain/state/create_new_mailbox_state.dart'; import 'package:tmail_ui_user/features/mailbox/domain/state/create_new_mailbox_state.dart';
import 'package:tmail_ui_user/features/mailbox/domain/state/delete_multiple_mailbox_state.dart'; import 'package:tmail_ui_user/features/mailbox/domain/state/delete_multiple_mailbox_state.dart';
import 'package:tmail_ui_user/features/mailbox/domain/state/get_all_mailboxes_state.dart'; import 'package:tmail_ui_user/features/mailbox/domain/state/get_all_mailboxes_state.dart';
import 'package:tmail_ui_user/features/mailbox/domain/state/mark_as_mailbox_read_state.dart';
import 'package:tmail_ui_user/features/mailbox/domain/state/move_mailbox_state.dart'; import 'package:tmail_ui_user/features/mailbox/domain/state/move_mailbox_state.dart';
import 'package:tmail_ui_user/features/mailbox/domain/state/refresh_changes_all_mailboxes_state.dart'; import 'package:tmail_ui_user/features/mailbox/domain/state/refresh_changes_all_mailboxes_state.dart';
import 'package:tmail_ui_user/features/mailbox/domain/state/rename_mailbox_state.dart'; import 'package:tmail_ui_user/features/mailbox/domain/state/rename_mailbox_state.dart';
@@ -88,6 +86,10 @@ class SearchMailboxController extends BaseMailboxController with MailboxActionHa
PresentationEmail? get selectedEmail => dashboardController.selectedEmail.value; PresentationEmail? get selectedEmail => dashboardController.selectedEmail.value;
AccountId? get accountId => dashboardController.accountId.value;
Session? get session => dashboardController.sessionCurrent;
SearchMailboxController( SearchMailboxController(
this._searchMailboxInteractor, this._searchMailboxInteractor,
this._renameMailboxInteractor, this._renameMailboxInteractor,
@@ -111,6 +113,7 @@ class SearchMailboxController extends BaseMailboxController with MailboxActionHa
void onInit() { void onInit() {
super.onInit(); super.onInit();
_initializeDebounceTimeTextSearchChange(); _initializeDebounceTimeTextSearchChange();
_registerObxStreamListener();
_getAllMailboxAction(); _getAllMailboxAction();
} }
@@ -144,15 +147,6 @@ class SearchMailboxController extends BaseMailboxController with MailboxActionHa
searchMailboxAction(); searchMailboxAction();
} else if (success is SearchMailboxSuccess) { } else if (success is SearchMailboxSuccess) {
_handleSearchMailboxSuccess(success); _handleSearchMailboxSuccess(success);
} else if (success is MarkAsMailboxReadAllSuccess) {
_refreshMailboxChanges(mailboxState: success.currentMailboxState);
} else if (success is MarkAsMailboxReadHasSomeEmailFailure) {
_refreshMailboxChanges(mailboxState: success.currentMailboxState);
} else if (success is RenameMailboxSuccess) {
_refreshMailboxChanges(
mailboxState: success.currentMailboxState,
properties: MailboxConstants.propertiesDefault
);
} else if (success is MoveMailboxSuccess) { } else if (success is MoveMailboxSuccess) {
_moveMailboxSuccess(success); _moveMailboxSuccess(success);
} else if (success is DeleteMultipleMailboxAllSuccess) { } else if (success is DeleteMultipleMailboxAllSuccess) {
@@ -183,27 +177,34 @@ class SearchMailboxController extends BaseMailboxController with MailboxActionHa
}); });
} }
void _registerObxStreamListener() {
ever(dashboardController.mailboxUIAction, (action) {
if (action is RefreshChangeMailboxAction) {
_refreshMailboxChanges(newState: action.newState);
}
});
}
void _getAllMailboxAction() { void _getAllMailboxAction() {
final session = dashboardController.sessionCurrent;
final accountId = dashboardController.accountId.value;
if (session != null && accountId != null) { if (session != null && accountId != null) {
getAllMailbox(session, accountId); getAllMailbox(session!, accountId!);
} }
} }
void _refreshMailboxChanges({jmap.State? mailboxState, Properties? properties}) { void _refreshMailboxChanges({jmap.State? newState}) {
dashboardController.dispatchMailboxUIAction(RefreshChangeMailboxAction(null)); if (accountId == null ||
final newMailboxState = mailboxState ?? currentMailboxState; session == null ||
final accountId = dashboardController.accountId.value; currentMailboxState == null ||
final session = dashboardController.sessionCurrent; newState == currentMailboxState) {
if (session != null && accountId != null && newMailboxState != null) { return;
refreshMailboxChanges(
session,
accountId,
newMailboxState,
properties: properties
);
} }
refreshMailboxChanges(
session!,
accountId!,
currentMailboxState!,
properties: MailboxConstants.propertiesDefault,
);
} }
void searchMailboxAction() { void searchMailboxAction() {
@@ -328,13 +329,11 @@ class SearchMailboxController extends BaseMailboxController with MailboxActionHa
} }
void _renameMailboxAction(PresentationMailbox presentationMailbox, MailboxName newMailboxName) { void _renameMailboxAction(PresentationMailbox presentationMailbox, MailboxName newMailboxName) {
final accountId = dashboardController.accountId.value;
final session = dashboardController.sessionCurrent;
if (session != null && accountId != null) { if (session != null && accountId != null) {
consumeState(_renameMailboxInteractor.execute( consumeState(_renameMailboxInteractor.execute(
session, session!,
accountId, accountId!,
RenameMailboxRequest(presentationMailbox.id, newMailboxName) RenameMailboxRequest(presentationMailbox.id, newMailboxName),
)); ));
} }
} }
@@ -344,13 +343,11 @@ class SearchMailboxController extends BaseMailboxController with MailboxActionHa
PresentationMailbox mailboxSelected, PresentationMailbox mailboxSelected,
PresentationMailbox? destinationMailbox PresentationMailbox? destinationMailbox
) { ) {
final accountId = dashboardController.accountId.value;
final session = dashboardController.sessionCurrent;
if (session != null && accountId != null) { if (session != null && accountId != null) {
_handleMovingMailbox( _handleMovingMailbox(
context, context,
session, session!,
accountId, accountId!,
MoveAction.moving, MoveAction.moving,
mailboxSelected, mailboxSelected,
destinationMailbox: destinationMailbox destinationMailbox: destinationMailbox
@@ -400,25 +397,19 @@ class SearchMailboxController extends BaseMailboxController with MailboxActionHa
actionIcon: SvgPicture.asset(imagePaths.icUndo) actionIcon: SvgPicture.asset(imagePaths.icUndo)
); );
} }
_refreshMailboxChanges(
mailboxState: success.currentMailboxState,
properties: MailboxConstants.propertiesDefault
);
} }
void _undoMovingMailbox(MoveMailboxRequest newMoveRequest) { void _undoMovingMailbox(MoveMailboxRequest newMoveRequest) {
final accountId = dashboardController.accountId.value;
final session = dashboardController.sessionCurrent;
if (session != null && accountId != null) { if (session != null && accountId != null) {
consumeState(_moveMailboxInteractor.execute(session, accountId, newMoveRequest)); consumeState(_moveMailboxInteractor.execute(
session!,
accountId!,
newMoveRequest,
));
} }
} }
void _deleteMailboxAction(PresentationMailbox presentationMailbox) { void _deleteMailboxAction(PresentationMailbox presentationMailbox) {
final accountId = dashboardController.accountId.value;
final session = dashboardController.sessionCurrent;
if (session != null && accountId != null) { if (session != null && accountId != null) {
final tupleMap = MailboxUtils.generateMapDescendantIdsAndMailboxIdList( final tupleMap = MailboxUtils.generateMapDescendantIdsAndMailboxIdList(
[presentationMailbox], [presentationMailbox],
@@ -429,8 +420,8 @@ class SearchMailboxController extends BaseMailboxController with MailboxActionHa
final listMailboxId = tupleMap.value2; final listMailboxId = tupleMap.value2;
consumeState(_deleteMultipleMailboxInteractor.execute( consumeState(_deleteMultipleMailboxInteractor.execute(
session, session!,
accountId, accountId!,
mapDescendantIds, mapDescendantIds,
listMailboxId listMailboxId
)); ));
@@ -452,8 +443,6 @@ class SearchMailboxController extends BaseMailboxController with MailboxActionHa
dashboardController.selectedMailbox.value = null; dashboardController.selectedMailbox.value = null;
dashboardController.dispatchMailboxUIAction(SelectMailboxDefaultAction()); dashboardController.dispatchMailboxUIAction(SelectMailboxDefaultAction());
} }
_refreshMailboxChanges(mailboxState: currentMailboxState);
} }
void _deleteMailboxFailure(DeleteMultipleMailboxFailure failure) { void _deleteMailboxFailure(DeleteMultipleMailboxFailure failure) {
@@ -469,16 +458,21 @@ class SearchMailboxController extends BaseMailboxController with MailboxActionHa
MailboxSubscribeState subscribeState, MailboxSubscribeState subscribeState,
MailboxSubscribeAction subscribeAction MailboxSubscribeAction subscribeAction
) { ) {
final accountId = dashboardController.accountId.value;
final session = dashboardController.sessionCurrent;
if (session != null && accountId != null) { if (session != null && accountId != null) {
final subscribeRequest = generateSubscribeRequest(mailboxId, subscribeState, subscribeAction); final subscribeRequest = generateSubscribeRequest(mailboxId, subscribeState, subscribeAction);
if (subscribeRequest is SubscribeMultipleMailboxRequest) { if (subscribeRequest is SubscribeMultipleMailboxRequest) {
consumeState(_subscribeMultipleMailboxInteractor.execute(session, accountId, subscribeRequest)); consumeState(_subscribeMultipleMailboxInteractor.execute(
session!,
accountId!,
subscribeRequest,
));
} else if (subscribeRequest is SubscribeMailboxRequest) { } else if (subscribeRequest is SubscribeMailboxRequest) {
consumeState(_subscribeMailboxInteractor.execute(session, accountId, subscribeRequest)); consumeState(_subscribeMailboxInteractor.execute(
session!,
accountId!,
subscribeRequest,
));
} }
} }
} }
@@ -502,11 +496,6 @@ class SearchMailboxController extends BaseMailboxController with MailboxActionHa
_closeEmailViewIfMailboxDisabledOrNotExist([success.mailboxId]); _closeEmailViewIfMailboxDisabledOrNotExist([success.mailboxId]);
} }
} }
_refreshMailboxChanges(
mailboxState: success.currentMailboxState,
properties: MailboxConstants.propertiesDefault
);
} }
void _handleSubscribeMultipleMailboxAllSuccess(SubscribeMultipleMailboxAllSuccess success) { void _handleSubscribeMultipleMailboxAllSuccess(SubscribeMultipleMailboxAllSuccess success) {
@@ -523,11 +512,6 @@ class SearchMailboxController extends BaseMailboxController with MailboxActionHa
_closeEmailViewIfMailboxDisabledOrNotExist(success.mailboxIdsSubscribe); _closeEmailViewIfMailboxDisabledOrNotExist(success.mailboxIdsSubscribe);
} }
} }
_refreshMailboxChanges(
mailboxState: success.currentMailboxState,
properties: MailboxConstants.propertiesDefault
);
} }
void _handleSubscribeMultipleMailboxHasSomeSuccess(SubscribeMultipleMailboxHasSomeSuccess success) { void _handleSubscribeMultipleMailboxHasSomeSuccess(SubscribeMultipleMailboxHasSomeSuccess success) {
@@ -544,11 +528,6 @@ class SearchMailboxController extends BaseMailboxController with MailboxActionHa
_closeEmailViewIfMailboxDisabledOrNotExist(success.mailboxIdsSubscribe); _closeEmailViewIfMailboxDisabledOrNotExist(success.mailboxIdsSubscribe);
} }
} }
_refreshMailboxChanges(
mailboxState: success.currentMailboxState,
properties: MailboxConstants.propertiesDefault
);
} }
void _showToastSubscribeMailboxSuccess( void _showToastSubscribeMailboxSuccess(
@@ -587,8 +566,6 @@ class SearchMailboxController extends BaseMailboxController with MailboxActionHa
MailboxId mailboxIdSubscribed, MailboxId mailboxIdSubscribed,
{List<MailboxId>? listDescendantMailboxIds} {List<MailboxId>? listDescendantMailboxIds}
) { ) {
final accountId = dashboardController.accountId.value;
final session = dashboardController.sessionCurrent;
if (session != null && accountId != null) { if (session != null && accountId != null) {
SubscribeRequest? subscribeRequest; SubscribeRequest? subscribeRequest;
@@ -608,9 +585,17 @@ class SearchMailboxController extends BaseMailboxController with MailboxActionHa
} }
if (subscribeRequest is SubscribeMultipleMailboxRequest) { if (subscribeRequest is SubscribeMultipleMailboxRequest) {
consumeState(_subscribeMultipleMailboxInteractor.execute(session, accountId, subscribeRequest)); consumeState(_subscribeMultipleMailboxInteractor.execute(
session!,
accountId!,
subscribeRequest,
));
} else if (subscribeRequest is SubscribeMailboxRequest) { } else if (subscribeRequest is SubscribeMailboxRequest) {
consumeState(_subscribeMailboxInteractor.execute(session, accountId, subscribeRequest)); consumeState(_subscribeMailboxInteractor.execute(
session!,
accountId!,
subscribeRequest,
));
} }
} }
} }
@@ -619,8 +604,6 @@ class SearchMailboxController extends BaseMailboxController with MailboxActionHa
MailboxId mailboxIdSubscribed, MailboxId mailboxIdSubscribed,
{List<MailboxId>? listDescendantMailboxIds} {List<MailboxId>? listDescendantMailboxIds}
) { ) {
final accountId = dashboardController.accountId.value;
final session = dashboardController.sessionCurrent;
if (session != null && accountId != null) { if (session != null && accountId != null) {
SubscribeRequest? subscribeRequest; SubscribeRequest? subscribeRequest;
@@ -640,9 +623,17 @@ class SearchMailboxController extends BaseMailboxController with MailboxActionHa
} }
if (subscribeRequest is SubscribeMultipleMailboxRequest) { if (subscribeRequest is SubscribeMultipleMailboxRequest) {
consumeState(_subscribeMultipleMailboxInteractor.execute(session, accountId, subscribeRequest)); consumeState(_subscribeMultipleMailboxInteractor.execute(
session!,
accountId!,
subscribeRequest,
));
} else if (subscribeRequest is SubscribeMailboxRequest) { } else if (subscribeRequest is SubscribeMailboxRequest) {
consumeState(_subscribeMailboxInteractor.execute(session, accountId, subscribeRequest)); consumeState(_subscribeMailboxInteractor.execute(
session!,
accountId!,
subscribeRequest,
));
} }
} }
} }
@@ -660,15 +651,13 @@ class SearchMailboxController extends BaseMailboxController with MailboxActionHa
} }
void goToCreateNewMailboxView(BuildContext context, {PresentationMailbox? parentMailbox}) async { void goToCreateNewMailboxView(BuildContext context, {PresentationMailbox? parentMailbox}) async {
final accountId = dashboardController.accountId.value;
final session = dashboardController.sessionCurrent;
if (session != null && accountId != null) { if (session != null && accountId != null) {
final arguments = MailboxCreatorArguments( final arguments = MailboxCreatorArguments(
accountId, accountId!,
defaultMailboxTree.value, defaultMailboxTree.value,
personalMailboxTree.value, personalMailboxTree.value,
teamMailboxesTree.value, teamMailboxesTree.value,
dashboardController.sessionCurrent!, session!,
parentMailbox parentMailbox
); );
@@ -677,9 +666,14 @@ class SearchMailboxController extends BaseMailboxController with MailboxActionHa
: await push(AppRoutes.mailboxCreator, arguments: arguments); : await push(AppRoutes.mailboxCreator, arguments: arguments);
if (result != null && result is NewMailboxArguments) { if (result != null && result is NewMailboxArguments) {
_createNewMailboxAction(session, accountId, CreateNewMailboxRequest( _createNewMailboxAction(
result.newName, session!,
parentId: result.mailboxLocation?.id)); accountId!,
CreateNewMailboxRequest(
result.newName,
parentId: result.mailboxLocation?.id,
),
);
} }
} }
} }
@@ -696,8 +690,6 @@ class SearchMailboxController extends BaseMailboxController with MailboxActionHa
leadingSVGIconColor: Colors.white, leadingSVGIconColor: Colors.white,
leadingSVGIcon: imagePaths.icFolderMailbox); leadingSVGIcon: imagePaths.icFolderMailbox);
} }
_refreshMailboxChanges(mailboxState: success.currentMailboxState);
} }
void _createNewMailboxFailure(CreateNewMailboxFailure failure) { void _createNewMailboxFailure(CreateNewMailboxFailure failure) {