TF-2925 Fix change mailbox very quick when refreshing after any mail action make the message list is not showed correctly
This commit is contained in:
@@ -553,7 +553,7 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM
|
|||||||
BuildContext context,
|
BuildContext context,
|
||||||
PresentationMailbox presentationMailboxSelected
|
PresentationMailbox presentationMailboxSelected
|
||||||
) {
|
) {
|
||||||
log('MailboxController::_handleOpenMailbox():MailboxName: ${presentationMailboxSelected.name}');
|
log('MailboxController::_handleOpenMailbox():MAILBOX_ID = ${presentationMailboxSelected.id.asString} | MAILBOX_NAME: ${presentationMailboxSelected.name?.name}');
|
||||||
KeyboardUtils.hideKeyboard(context);
|
KeyboardUtils.hideKeyboard(context);
|
||||||
mailboxDashBoardController.clearSelectedEmail();
|
mailboxDashBoardController.clearSelectedEmail();
|
||||||
if (presentationMailboxSelected.id != mailboxDashBoardController.selectedMailbox.value?.id) {
|
if (presentationMailboxSelected.id != mailboxDashBoardController.selectedMailbox.value?.id) {
|
||||||
|
|||||||
+2
-7
@@ -586,13 +586,8 @@ class MailboxDashBoardController extends ReloadableController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void setSelectedMailbox(PresentationMailbox? newPresentationMailbox) {
|
void setSelectedMailbox(PresentationMailbox? newPresentationMailbox) {
|
||||||
final previousMailbox = selectedMailbox.value;
|
log('MailboxDashBoardController::setSelectedMailbox: SELECTED_MAILBOX_ID = ${newPresentationMailbox?.id.asString} | SELECTED_MAILBOX_NAME = ${newPresentationMailbox?.name?.name} | ');
|
||||||
if (previousMailbox == newPresentationMailbox) {
|
selectedMailbox.value = newPresentationMailbox;
|
||||||
selectedMailbox.value = newPresentationMailbox;
|
|
||||||
selectedMailbox.refresh();
|
|
||||||
} else {
|
|
||||||
selectedMailbox.value = newPresentationMailbox;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void setSelectedEmail(PresentationEmail? newPresentationEmail) {
|
void setSelectedEmail(PresentationEmail? newPresentationEmail) {
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import 'package:core/presentation/state/failure.dart';
|
import 'package:core/presentation/state/failure.dart';
|
||||||
import 'package:core/presentation/state/success.dart';
|
import 'package:core/presentation/state/success.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/state.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';
|
import 'package:model/email/presentation_email.dart';
|
||||||
|
|
||||||
class RefreshAllEmailLoading extends LoadingState {}
|
class RefreshAllEmailLoading extends LoadingState {}
|
||||||
@@ -10,11 +11,20 @@ class GetAllEmailLoading extends LoadingState {}
|
|||||||
class GetAllEmailSuccess extends UIState {
|
class GetAllEmailSuccess extends UIState {
|
||||||
final List<PresentationEmail> emailList;
|
final List<PresentationEmail> emailList;
|
||||||
final State? currentEmailState;
|
final State? currentEmailState;
|
||||||
|
final MailboxId? currentMailboxId;
|
||||||
|
|
||||||
GetAllEmailSuccess({required this.emailList, this.currentEmailState});
|
GetAllEmailSuccess({
|
||||||
|
required this.emailList,
|
||||||
|
this.currentEmailState,
|
||||||
|
this.currentMailboxId,
|
||||||
|
});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
List<Object?> get props => [emailList, currentEmailState];
|
List<Object?> get props => [
|
||||||
|
emailList,
|
||||||
|
currentEmailState,
|
||||||
|
currentMailboxId,
|
||||||
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
class GetAllEmailFailure extends FeatureFailure {
|
class GetAllEmailFailure extends FeatureFailure {
|
||||||
|
|||||||
@@ -1,6 +1,7 @@
|
|||||||
import 'package:core/presentation/state/failure.dart';
|
import 'package:core/presentation/state/failure.dart';
|
||||||
import 'package:core/presentation/state/success.dart';
|
import 'package:core/presentation/state/success.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/state.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';
|
import 'package:model/email/presentation_email.dart';
|
||||||
|
|
||||||
class RefreshChangesAllEmailLoading extends LoadingState {}
|
class RefreshChangesAllEmailLoading extends LoadingState {}
|
||||||
@@ -8,11 +9,20 @@ class RefreshChangesAllEmailLoading extends LoadingState {}
|
|||||||
class RefreshChangesAllEmailSuccess extends UIState {
|
class RefreshChangesAllEmailSuccess extends UIState {
|
||||||
final List<PresentationEmail> emailList;
|
final List<PresentationEmail> emailList;
|
||||||
final State? currentEmailState;
|
final State? currentEmailState;
|
||||||
|
final MailboxId? currentMailboxId;
|
||||||
|
|
||||||
RefreshChangesAllEmailSuccess({required this.emailList, this.currentEmailState});
|
RefreshChangesAllEmailSuccess({
|
||||||
|
required this.emailList,
|
||||||
|
this.currentEmailState,
|
||||||
|
this.currentMailboxId
|
||||||
|
});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
List<Object?> get props => [emailList, currentEmailState];
|
List<Object?> get props => [
|
||||||
|
emailList,
|
||||||
|
currentEmailState,
|
||||||
|
currentMailboxId
|
||||||
|
];
|
||||||
}
|
}
|
||||||
|
|
||||||
class RefreshChangesAllEmailFailure extends FeatureFailure {
|
class RefreshChangesAllEmailFailure extends FeatureFailure {
|
||||||
|
|||||||
@@ -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/session/session.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/sort/comparator.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/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_filter.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/model/email_response.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';
|
import 'package:tmail_ui_user/features/thread/domain/repository/thread_repository.dart';
|
||||||
@@ -39,18 +40,25 @@ class GetEmailsInMailboxInteractor {
|
|||||||
emailFilter: emailFilter,
|
emailFilter: emailFilter,
|
||||||
propertiesCreated: propertiesCreated,
|
propertiesCreated: propertiesCreated,
|
||||||
propertiesUpdated: propertiesUpdated)
|
propertiesUpdated: propertiesUpdated)
|
||||||
.map(_toGetEmailState);
|
.map((emailResponse) => _toGetEmailState(
|
||||||
|
emailResponse: emailResponse,
|
||||||
|
currentMailboxId: emailFilter?.mailboxId
|
||||||
|
));
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
yield Left(GetAllEmailFailure(e));
|
yield Left(GetAllEmailFailure(e));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Either<Failure, Success> _toGetEmailState(EmailsResponse emailResponse) {
|
Either<Failure, Success> _toGetEmailState({
|
||||||
|
required EmailsResponse emailResponse,
|
||||||
|
MailboxId? currentMailboxId,
|
||||||
|
}) {
|
||||||
final presentationEmailList = emailResponse.emailList
|
final presentationEmailList = emailResponse.emailList
|
||||||
?.map((email) => email.toPresentationEmail()).toList() ?? List.empty();
|
?.map((email) => email.toPresentationEmail()).toList() ?? List.empty();
|
||||||
|
|
||||||
return Right<Failure, Success>(GetAllEmailSuccess(
|
return Right<Failure, Success>(GetAllEmailSuccess(
|
||||||
emailList: presentationEmailList,
|
emailList: presentationEmailList,
|
||||||
currentEmailState: emailResponse.state));
|
currentEmailState: emailResponse.state,
|
||||||
|
currentMailboxId: currentMailboxId));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+11
-3
@@ -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/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/sort/comparator.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_filter.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/domain/model/email_response.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';
|
import 'package:tmail_ui_user/features/thread/domain/repository/thread_repository.dart';
|
||||||
@@ -39,18 +40,25 @@ class RefreshChangesEmailsInMailboxInteractor {
|
|||||||
propertiesCreated: propertiesCreated,
|
propertiesCreated: propertiesCreated,
|
||||||
propertiesUpdated: propertiesUpdated,
|
propertiesUpdated: propertiesUpdated,
|
||||||
emailFilter: emailFilter)
|
emailFilter: emailFilter)
|
||||||
.map(_toGetEmailState);
|
.map((emailResponse) => _toGetEmailState(
|
||||||
|
emailResponse: emailResponse,
|
||||||
|
currentMailboxId: emailFilter?.mailboxId
|
||||||
|
));
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
yield Left(RefreshChangesAllEmailFailure(e));
|
yield Left(RefreshChangesAllEmailFailure(e));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
Either<Failure, Success> _toGetEmailState(EmailsResponse emailResponse) {
|
Either<Failure, Success> _toGetEmailState({
|
||||||
|
required EmailsResponse emailResponse,
|
||||||
|
MailboxId? currentMailboxId
|
||||||
|
}) {
|
||||||
final presentationEmailList = emailResponse.emailList
|
final presentationEmailList = emailResponse.emailList
|
||||||
?.map((email) => email.toPresentationEmail()).toList() ?? List.empty();
|
?.map((email) => email.toPresentationEmail()).toList() ?? List.empty();
|
||||||
|
|
||||||
return Right<Failure, Success>(RefreshChangesAllEmailSuccess(
|
return Right<Failure, Success>(RefreshChangesAllEmailSuccess(
|
||||||
emailList: presentationEmailList,
|
emailList: presentationEmailList,
|
||||||
currentEmailState: emailResponse.state));
|
currentEmailState: emailResponse.state,
|
||||||
|
currentMailboxId: currentMailboxId));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -104,7 +104,6 @@ class ThreadController extends BaseController with EmailActionController {
|
|||||||
|
|
||||||
bool canLoadMore = false;
|
bool canLoadMore = false;
|
||||||
bool canSearchMore = false;
|
bool canSearchMore = false;
|
||||||
MailboxId? _currentMailboxId;
|
|
||||||
jmap.State? _currentEmailState;
|
jmap.State? _currentEmailState;
|
||||||
final ScrollController listEmailController = ScrollController();
|
final ScrollController listEmailController = ScrollController();
|
||||||
final FocusNode focusNodeKeyBoard = FocusNode();
|
final FocusNode focusNodeKeyBoard = FocusNode();
|
||||||
@@ -116,6 +115,8 @@ class ThreadController extends BaseController with EmailActionController {
|
|||||||
|
|
||||||
PresentationMailbox? get currentMailbox => mailboxDashBoardController.selectedMailbox.value;
|
PresentationMailbox? get currentMailbox => mailboxDashBoardController.selectedMailbox.value;
|
||||||
|
|
||||||
|
MailboxId? get _currentMailboxId => currentMailbox?.mailboxId;
|
||||||
|
|
||||||
search.SearchController get searchController => mailboxDashBoardController.searchController;
|
search.SearchController get searchController => mailboxDashBoardController.searchController;
|
||||||
|
|
||||||
SearchEmailFilter get _searchEmailFilter => searchController.searchEmailFilter.value;
|
SearchEmailFilter get _searchEmailFilter => searchController.searchEmailFilter.value;
|
||||||
@@ -142,7 +143,7 @@ class ThreadController extends BaseController with EmailActionController {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
void onReady() {
|
void onReady() {
|
||||||
dispatchState(Right(LoadingState()));
|
consumeState(Stream.value(Right(GetAllEmailLoading())));
|
||||||
super.onReady();
|
super.onReady();
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -234,15 +235,10 @@ class ThreadController extends BaseController with EmailActionController {
|
|||||||
|
|
||||||
void _registerObxStreamListener() {
|
void _registerObxStreamListener() {
|
||||||
ever(mailboxDashBoardController.selectedMailbox, (mailbox) {
|
ever(mailboxDashBoardController.selectedMailbox, (mailbox) {
|
||||||
if (mailbox is PresentationMailbox) {
|
log('ThreadController::_registerObxStreamListener:ever: SELECTED_MAILBOX_ID = ${mailbox?.id.asString} | SELECTED_MAILBOX_NAME = ${mailbox?.name?.name}');
|
||||||
if (_currentMailboxId != mailbox.id) {
|
_resetToOriginalValue();
|
||||||
_currentMailboxId = mailbox.id;
|
if (mailbox != null) {
|
||||||
_resetToOriginalValue();
|
_getAllEmailAction();
|
||||||
_getAllEmailAction();
|
|
||||||
}
|
|
||||||
} else if (mailbox == null) { // disable current mailbox when search active
|
|
||||||
_currentMailboxId = null;
|
|
||||||
_resetToOriginalValue();
|
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -425,14 +421,21 @@ class ThreadController extends BaseController with EmailActionController {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void _resetToOriginalValue() {
|
void _resetToOriginalValue() {
|
||||||
dispatchState(Right(LoadingState()));
|
log('ThreadController::_resetToOriginalValue:');
|
||||||
|
consumeState(Stream.value(Right(GetAllEmailLoading())));
|
||||||
mailboxDashBoardController.emailsInCurrentMailbox.clear();
|
mailboxDashBoardController.emailsInCurrentMailbox.clear();
|
||||||
|
mailboxDashBoardController.listEmailSelected.clear();
|
||||||
|
mailboxDashBoardController.currentSelectMode.value = SelectMode.INACTIVE;
|
||||||
canLoadMore = false;
|
canLoadMore = false;
|
||||||
loadingMoreStatus.value = LoadingMoreStatus.idle;
|
loadingMoreStatus.value = LoadingMoreStatus.idle;
|
||||||
cancelSelectEmail();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void _getAllEmailSuccess(GetAllEmailSuccess success) {
|
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);
|
mailboxDashBoardController.refreshingMailboxState.value = Right(success);
|
||||||
_currentEmailState = success.currentEmailState;
|
_currentEmailState = success.currentEmailState;
|
||||||
log('ThreadController::_getAllEmailSuccess():COUNT = ${success.emailList.length} | EMAIL_STATE = $_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) {
|
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;
|
_currentEmailState = success.currentEmailState;
|
||||||
log('ThreadController::_refreshChangesAllEmailSuccess: COUNT = ${success.emailList.length}');
|
log('ThreadController::_refreshChangesAllEmailSuccess: COUNT = ${success.emailList.length}');
|
||||||
final emailsBeforeChanges = mailboxDashBoardController.emailsInCurrentMailbox;
|
final emailsBeforeChanges = mailboxDashBoardController.emailsInCurrentMailbox;
|
||||||
|
|||||||
@@ -87,7 +87,8 @@ void main() {
|
|||||||
EmailFixtures.email1.toPresentationEmail(),
|
EmailFixtures.email1.toPresentationEmail(),
|
||||||
EmailFixtures.email2.toPresentationEmail()
|
EmailFixtures.email2.toPresentationEmail()
|
||||||
}.toList(),
|
}.toList(),
|
||||||
currentEmailState: jmap.State('s1'))
|
currentEmailState: jmap.State('s1'),
|
||||||
|
currentMailboxId: MailboxFixtures.inboxMailbox.id)
|
||||||
),
|
),
|
||||||
Right(GetAllEmailSuccess(
|
Right(GetAllEmailSuccess(
|
||||||
emailList: {
|
emailList: {
|
||||||
@@ -97,7 +98,8 @@ void main() {
|
|||||||
EmailFixtures.email4.toPresentationEmail(),
|
EmailFixtures.email4.toPresentationEmail(),
|
||||||
EmailFixtures.email5.toPresentationEmail(),
|
EmailFixtures.email5.toPresentationEmail(),
|
||||||
}.toList(),
|
}.toList(),
|
||||||
currentEmailState: jmap.State('s1'))
|
currentEmailState: jmap.State('s1'),
|
||||||
|
currentMailboxId: MailboxFixtures.inboxMailbox.id)
|
||||||
)
|
)
|
||||||
}));
|
}));
|
||||||
});
|
});
|
||||||
|
|||||||
+2
-1
@@ -80,7 +80,8 @@ void main() {
|
|||||||
EmailFixtures.email4.toPresentationEmail(),
|
EmailFixtures.email4.toPresentationEmail(),
|
||||||
EmailFixtures.email5.toPresentationEmail(),
|
EmailFixtures.email5.toPresentationEmail(),
|
||||||
}.toList(),
|
}.toList(),
|
||||||
currentEmailState: jmap.State('s1'))
|
currentEmailState: jmap.State('s1'),
|
||||||
|
currentMailboxId: MailboxFixtures.inboxMailbox.id)
|
||||||
)
|
)
|
||||||
}));
|
}));
|
||||||
});
|
});
|
||||||
|
|||||||
Reference in New Issue
Block a user