TF-348 Fix unread email counter not updating
This commit is contained in:
@@ -109,7 +109,7 @@ class ButtonBuilder {
|
||||
child: Container(
|
||||
key: _key,
|
||||
alignment: Alignment.center,
|
||||
color: _decoration == null ? _colorButton ?? Colors.white : null,
|
||||
color: _decoration == null ? _colorButton : null,
|
||||
decoration: _decoration,
|
||||
width: _maxWidth,
|
||||
padding: _padding ?? EdgeInsets.zero,
|
||||
|
||||
@@ -6,6 +6,7 @@ abstract class BaseController extends GetxController {
|
||||
final viewState = Rx<Either<Failure, Success>>(Right(UIState.idle));
|
||||
|
||||
void consumeState(Stream<Either<Failure, Success>> newStateStream) async {
|
||||
log('BaseController::consumeState():');
|
||||
newStateStream.listen(
|
||||
(state) => onData(state),
|
||||
onError: (error) => onError(error),
|
||||
|
||||
@@ -14,7 +14,6 @@ abstract class BaseMailboxController extends BaseController {
|
||||
|
||||
BaseMailboxController(this._treeBuilder);
|
||||
|
||||
final allMailboxNodeList = <MailboxNode>[].obs;
|
||||
final folderMailboxTree = MailboxTree(MailboxNode.root()).obs;
|
||||
final defaultMailboxTree = MailboxTree(MailboxNode.root()).obs;
|
||||
|
||||
@@ -24,6 +23,15 @@ abstract class BaseMailboxController extends BaseController {
|
||||
folderMailboxTree.value = tupleTree.value2;
|
||||
}
|
||||
|
||||
Future refreshTree(List<PresentationMailbox> allMailbox) async {
|
||||
final tupleTree = await _treeBuilder.generateMailboxTreeInUIAfterRefreshChanges(
|
||||
allMailbox, defaultMailboxTree.value, folderMailboxTree.value);
|
||||
defaultMailboxTree.firstRebuild = true;
|
||||
folderMailboxTree.firstRebuild = true;
|
||||
defaultMailboxTree.value = tupleTree.value1;
|
||||
folderMailboxTree.value = tupleTree.value2;
|
||||
}
|
||||
|
||||
void toggleMailboxFolder(MailboxNode selectedMailboxNode) {
|
||||
final newExpandMode = selectedMailboxNode.expandMode == ExpandMode.COLLAPSE
|
||||
? ExpandMode.EXPAND
|
||||
|
||||
@@ -35,7 +35,6 @@ class EmailBindings extends BaseBindings {
|
||||
Get.find<MarkAsEmailReadInteractor>(),
|
||||
Get.find<DownloadAttachmentsInteractor>(),
|
||||
Get.find<DeviceManager>(),
|
||||
Get.find<AppToast>(),
|
||||
Get.find<ExportAttachmentInteractor>(),
|
||||
Get.find<MoveToMailboxInteractor>(),
|
||||
Get.find<MarkAsStarEmailInteractor>(),
|
||||
|
||||
@@ -45,12 +45,12 @@ class EmailController extends BaseController {
|
||||
final mailboxDashBoardController = Get.find<MailboxDashBoardController>();
|
||||
final responsiveUtils = Get.find<ResponsiveUtils>();
|
||||
final imagePaths = Get.find<ImagePaths>();
|
||||
final _appToast = Get.find<AppToast>();
|
||||
|
||||
final GetEmailContentInteractor _getEmailContentInteractor;
|
||||
final MarkAsEmailReadInteractor _markAsEmailReadInteractor;
|
||||
final DownloadAttachmentsInteractor _downloadAttachmentsInteractor;
|
||||
final DeviceManager _deviceManager;
|
||||
final AppToast _appToast;
|
||||
final ExportAttachmentInteractor _exportAttachmentInteractor;
|
||||
final MoveToMailboxInteractor _moveToMailboxInteractor;
|
||||
final MarkAsStarEmailInteractor _markAsStarEmailInteractor;
|
||||
@@ -72,7 +72,6 @@ class EmailController extends BaseController {
|
||||
this._markAsEmailReadInteractor,
|
||||
this._downloadAttachmentsInteractor,
|
||||
this._deviceManager,
|
||||
this._appToast,
|
||||
this._exportAttachmentInteractor,
|
||||
this._moveToMailboxInteractor,
|
||||
this._markAsStarEmailInteractor,
|
||||
@@ -83,12 +82,12 @@ class EmailController extends BaseController {
|
||||
void onReady() {
|
||||
super.onReady();
|
||||
mailboxDashBoardController.selectedEmail.listen((presentationEmail) {
|
||||
log('EmailController::onReady(): ${presentationEmail.toString()}');
|
||||
if (_currentEmailId != presentationEmail?.id) {
|
||||
_clearEmailContent();
|
||||
_currentEmailId = presentationEmail?.id;
|
||||
final accountId = mailboxDashBoardController.accountId.value;
|
||||
if (accountId != null && presentationEmail != null) {
|
||||
_getEmailContentAction(accountId, presentationEmail.id);
|
||||
_resetToOriginalValue();
|
||||
if (presentationEmail != null) {
|
||||
_getEmailContentAction(presentationEmail.id);
|
||||
if (presentationEmail.isUnReadEmail()) {
|
||||
markAsEmailRead(presentationEmail, ReadActions.markAsRead);
|
||||
}
|
||||
@@ -103,9 +102,12 @@ class EmailController extends BaseController {
|
||||
super.onClose();
|
||||
}
|
||||
|
||||
void _getEmailContentAction(AccountId accountId, EmailId emailId) async {
|
||||
void _getEmailContentAction(EmailId emailId) async {
|
||||
final accountId = mailboxDashBoardController.accountId.value;
|
||||
final baseDownloadUrl = mailboxDashBoardController.sessionCurrent?.getDownloadUrl();
|
||||
consumeState(_getEmailContentInteractor.execute(accountId, emailId, baseDownloadUrl));
|
||||
if (accountId != null && baseDownloadUrl != null) {
|
||||
consumeState(_getEmailContentInteractor.execute(accountId, emailId, baseDownloadUrl));
|
||||
}
|
||||
}
|
||||
|
||||
@override
|
||||
@@ -153,7 +155,7 @@ class EmailController extends BaseController {
|
||||
attachments.value = success.attachments;
|
||||
}
|
||||
|
||||
void _clearEmailContent() {
|
||||
void _resetToOriginalValue() {
|
||||
attachmentsExpandMode.value = ExpandMode.COLLAPSE;
|
||||
emailAddressExpandMode.value = ExpandMode.COLLAPSE;
|
||||
isDisplayFullEmailAddress.value = false;
|
||||
@@ -185,9 +187,6 @@ class EmailController extends BaseController {
|
||||
}
|
||||
|
||||
void _markAsEmailReadSuccess(Success success) {
|
||||
if (success is MarkAsEmailReadSuccess) {
|
||||
mailboxDashBoardController.setSelectedEmail(success.updatedEmail.toPresentationEmail(selectMode: SelectMode.ACTIVE));
|
||||
}
|
||||
mailboxDashBoardController.dispatchState(Right(success));
|
||||
|
||||
if (success is MarkAsEmailReadSuccess
|
||||
@@ -496,9 +495,7 @@ class EmailController extends BaseController {
|
||||
}
|
||||
|
||||
void backToThreadView(BuildContext context) {
|
||||
attachmentsExpandMode.value = ExpandMode.COLLAPSE;
|
||||
emailAddressExpandMode.value = ExpandMode.COLLAPSE;
|
||||
isDisplayFullEmailAddress.value = false;
|
||||
mailboxDashBoardController.clearSelectedEmail();
|
||||
if (responsiveUtils.isDesktop(context) || responsiveUtils.isTabletLarge(context)) {
|
||||
mailboxDashBoardController.dispatchRoute(AppRoutes.THREAD);
|
||||
} else {
|
||||
|
||||
@@ -31,29 +31,35 @@ class EmailView extends GetView with UserSettingPopupMenuMixin {
|
||||
|
||||
@override
|
||||
Widget build(BuildContext context) {
|
||||
return Scaffold(
|
||||
backgroundColor: responsiveUtils.isDesktop(context) ? AppColor.colorBgDesktop : Colors.white,
|
||||
body: Container(
|
||||
padding: EdgeInsets.zero,
|
||||
margin: EdgeInsets.zero,
|
||||
decoration: responsiveUtils.isTabletLarge(context)
|
||||
? BoxDecoration(border: Border(left: BorderSide(color: AppColor.colorLineLeftEmailView, width: 1.0)))
|
||||
: null,
|
||||
child: SafeArea(
|
||||
right: responsiveUtils.isMobileDevice(context) && responsiveUtils.isLandscape(context),
|
||||
left: responsiveUtils.isMobileDevice(context) && responsiveUtils.isLandscape(context),
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
if (responsiveUtils.isDesktop(context))
|
||||
Container(
|
||||
color: Colors.white,
|
||||
padding: EdgeInsets.only(right: 10, top: 16, bottom: 10),
|
||||
child: _buildHeader(context)),
|
||||
Expanded(child: _buildBody(context)),
|
||||
]
|
||||
)
|
||||
),
|
||||
return WillPopScope(
|
||||
onWillPop: () async {
|
||||
emailController.backToThreadView(context);
|
||||
return true;
|
||||
},
|
||||
child: Scaffold(
|
||||
backgroundColor: responsiveUtils.isDesktop(context) ? AppColor.colorBgDesktop : Colors.white,
|
||||
body: Container(
|
||||
padding: EdgeInsets.zero,
|
||||
margin: EdgeInsets.zero,
|
||||
decoration: responsiveUtils.isTabletLarge(context)
|
||||
? BoxDecoration(border: Border(left: BorderSide(color: AppColor.colorLineLeftEmailView, width: 1.0)))
|
||||
: null,
|
||||
child: SafeArea(
|
||||
right: responsiveUtils.isMobileDevice(context) && responsiveUtils.isLandscape(context),
|
||||
left: responsiveUtils.isMobileDevice(context) && responsiveUtils.isLandscape(context),
|
||||
child: Column(
|
||||
mainAxisAlignment: MainAxisAlignment.center,
|
||||
children: [
|
||||
if (responsiveUtils.isDesktop(context))
|
||||
Container(
|
||||
color: Colors.white,
|
||||
padding: EdgeInsets.only(right: 10, top: 16, bottom: 10),
|
||||
child: _buildHeader(context)),
|
||||
Expanded(child: _buildBody(context)),
|
||||
]
|
||||
)
|
||||
),
|
||||
)
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
@@ -0,0 +1,25 @@
|
||||
import 'package:core/core.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/state.dart';
|
||||
import 'package:model/mailbox/presentation_mailbox.dart';
|
||||
|
||||
class RefreshChangesAllMailboxSuccess extends UIState {
|
||||
final List<PresentationMailbox> mailboxList;
|
||||
final State? currentMailboxState;
|
||||
|
||||
RefreshChangesAllMailboxSuccess({
|
||||
required this.mailboxList,
|
||||
required this.currentMailboxState
|
||||
});
|
||||
|
||||
@override
|
||||
List<Object?> get props => [mailboxList, currentMailboxState];
|
||||
}
|
||||
|
||||
class RefreshChangesAllMailboxFailure extends FeatureFailure {
|
||||
final exception;
|
||||
|
||||
RefreshChangesAllMailboxFailure(this.exception);
|
||||
|
||||
@override
|
||||
List<Object> get props => [exception];
|
||||
}
|
||||
@@ -5,7 +5,7 @@ import 'package:jmap_dart_client/jmap/core/state.dart' as jmapState;
|
||||
import 'package:model/model.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_response.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/state/get_all_mailboxes_state.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/state/refresh_changes_all_mailboxes_state.dart';
|
||||
|
||||
class RefreshAllMailboxInteractor {
|
||||
final MailboxRepository _mailboxRepository;
|
||||
@@ -20,7 +20,7 @@ class RefreshAllMailboxInteractor {
|
||||
.refresh(accountId, currentState)
|
||||
.map(_toGetMailboxState);
|
||||
} catch (e) {
|
||||
yield Left<Failure, Success>(GetAllMailboxFailure(e));
|
||||
yield Left<Failure, Success>(RefreshChangesAllMailboxFailure(e));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -29,7 +29,7 @@ class RefreshAllMailboxInteractor {
|
||||
?.map((mailbox) => mailbox.toPresentationMailbox()).toList()
|
||||
?? List<PresentationMailbox>.empty();
|
||||
|
||||
return Right<Failure, Success>(GetAllMailboxSuccess(
|
||||
return Right<Failure, Success>(RefreshChangesAllMailboxSuccess(
|
||||
mailboxList: mailboxList,
|
||||
currentMailboxState: mailboxResponse.state)
|
||||
);
|
||||
|
||||
@@ -17,11 +17,13 @@ import 'package:tmail_ui_user/features/composer/domain/state/save_email_as_draft
|
||||
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/state/mark_as_email_read_state.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/state/move_to_mailbox_state.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_request.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/model/rename_mailbox_request.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/get_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/search_mailbox_state.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox/domain/usecases/create_new_mailbox_interactor.dart';
|
||||
@@ -107,18 +109,22 @@ class MailboxController extends BaseMailboxController {
|
||||
|
||||
mailboxDashBoardController.viewState.listen((state) {
|
||||
state.map((success) {
|
||||
if (success is MarkAsEmailReadSuccess ||
|
||||
success is MarkAsMultipleEmailReadAllSuccess ||
|
||||
success is MarkAsMultipleEmailReadHasSomeEmailFailure) {
|
||||
log('MailboxController::onReady(): ${success.runtimeType}');
|
||||
|
||||
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 SaveEmailAsDraftsSuccess
|
||||
|| success is RemoveEmailDraftsSuccess
|
||||
|| success is SendEmailSuccess
|
||||
|| success is UpdateEmailDraftsSuccess) {
|
||||
} else if (success is MarkAsEmailReadSuccess
|
||||
|| success is MoveToMailboxSuccess
|
||||
|| success is SaveEmailAsDraftsSuccess
|
||||
|| success is RemoveEmailDraftsSuccess
|
||||
|| success is SendEmailSuccess
|
||||
|| success is UpdateEmailDraftsSuccess) {
|
||||
refreshMailboxChanges();
|
||||
}
|
||||
});
|
||||
@@ -147,6 +153,13 @@ class MailboxController extends BaseMailboxController {
|
||||
currentMailboxState = success.currentMailboxState;
|
||||
await buildTree(allMailboxes);
|
||||
|
||||
_setUpMapMailboxIdDefault(allMailboxes, defaultMailboxTree.value, folderMailboxTree.value);
|
||||
} else if (success is RefreshChangesAllMailboxSuccess) {
|
||||
log('MailboxController::onData(): ${allMailboxes.length}');
|
||||
allMailboxes = success.mailboxList;
|
||||
currentMailboxState = success.currentMailboxState;
|
||||
await refreshTree(allMailboxes);
|
||||
|
||||
_setUpMapMailboxIdDefault(allMailboxes, defaultMailboxTree.value, folderMailboxTree.value);
|
||||
}
|
||||
});
|
||||
@@ -171,10 +184,8 @@ class MailboxController extends BaseMailboxController {
|
||||
_searchMailboxSuccess(success);
|
||||
} else if (success is DeleteMultipleMailboxSuccess) {
|
||||
_deleteMailboxSuccess(success);
|
||||
} else if (success is GetAllMailboxSuccess) {
|
||||
if (isSearchActive()) {
|
||||
_searchMailboxAction(allMailboxes, searchQuery.value);
|
||||
}
|
||||
} else if ((success is GetAllMailboxSuccess || success is RefreshChangesAllMailboxSuccess) && isSearchActive()) {
|
||||
_searchMailboxAction(allMailboxes, searchQuery.value);
|
||||
} else if (success is RenameMailboxSuccess) {
|
||||
refreshMailboxChanges();
|
||||
}
|
||||
|
||||
@@ -75,4 +75,54 @@ class TreeBuilder {
|
||||
defaultTree.root.childrenItems?.sort((thisMailbox, thatMailbox) => thisMailbox.compareTo(thatMailbox));
|
||||
return Tuple2(defaultTree, folderTree);
|
||||
}
|
||||
|
||||
Future<Tuple2<MailboxTree, MailboxTree>> generateMailboxTreeInUIAfterRefreshChanges(
|
||||
List<PresentationMailbox> allMailboxes,
|
||||
MailboxTree defaultTreeBeforeChanges,
|
||||
MailboxTree folderTreeBeforeChanges,
|
||||
) async {
|
||||
final Map<MailboxId, MailboxNode> mailboxDictionary = HashMap();
|
||||
|
||||
final newDefaultTree = MailboxTree(MailboxNode.root());
|
||||
final newFolderTree = MailboxTree(MailboxNode.root());
|
||||
|
||||
allMailboxes.forEach((mailbox) {
|
||||
final mailboxNodeBeforeChanges = defaultTreeBeforeChanges.findNode((node) => node.item.id == mailbox.id) ??
|
||||
folderTreeBeforeChanges.findNode((node) => node.item.id == mailbox.id);
|
||||
if (mailboxNodeBeforeChanges != null) {
|
||||
mailboxDictionary[mailbox.id] = MailboxNode(
|
||||
mailbox,
|
||||
expandMode: mailboxNodeBeforeChanges.expandMode,
|
||||
selectMode: mailboxNodeBeforeChanges.selectMode);
|
||||
} else {
|
||||
mailboxDictionary[mailbox.id] = MailboxNode(mailbox);
|
||||
}
|
||||
});
|
||||
|
||||
allMailboxes.forEach((mailbox) {
|
||||
final parentId = mailbox.parentId;
|
||||
final parentNode = mailboxDictionary[parentId];
|
||||
final node = mailboxDictionary[mailbox.id];
|
||||
if (node != null) {
|
||||
if (parentNode != null) {
|
||||
parentNode.addChildNode(node);
|
||||
parentNode.childrenItems?.sortByCompare<MailboxName?>(
|
||||
(node) => node.item.name,
|
||||
(name, other) => name?.compareAlphabetically(other) ?? -1
|
||||
);
|
||||
} else {
|
||||
var tree = mailbox.hasRole() ? newDefaultTree : newFolderTree;
|
||||
|
||||
tree.root.addChildNode(node);
|
||||
tree.root.childrenItems?.sortByCompare<MailboxName?>(
|
||||
(node) => node.item.name,
|
||||
(name, other) => name?.compareAlphabetically(other) ?? -1
|
||||
);
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
newDefaultTree.root.childrenItems?.sort((thisMailbox, thatMailbox) => thisMailbox.compareTo(thatMailbox));
|
||||
return Tuple2(newDefaultTree, newFolderTree);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
import 'package:core/core.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/state.dart';
|
||||
import 'package:model/model.dart';
|
||||
|
||||
class RefreshChangesAllEmailSuccess extends UIState {
|
||||
final List<PresentationEmail> emailList;
|
||||
final State? currentEmailState;
|
||||
|
||||
RefreshChangesAllEmailSuccess({required this.emailList, this.currentEmailState});
|
||||
|
||||
@override
|
||||
List<Object?> get props => [emailList, currentEmailState];
|
||||
}
|
||||
|
||||
class RefreshChangesAllEmailFailure extends FeatureFailure {
|
||||
final exception;
|
||||
|
||||
RefreshChangesAllEmailFailure(this.exception);
|
||||
|
||||
@override
|
||||
List<Object> get props => [exception];
|
||||
}
|
||||
+3
-3
@@ -6,9 +6,9 @@ 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_response.dart';
|
||||
import 'package:tmail_ui_user/features/thread/domain/repository/thread_repository.dart';
|
||||
import 'package:tmail_ui_user/features/thread/domain/state/get_all_email_state.dart';
|
||||
import 'package:model/model.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/state.dart' as jmap;
|
||||
import 'package:tmail_ui_user/features/thread/domain/state/refresh_changes_all_email_state.dart';
|
||||
|
||||
class RefreshChangesEmailsInMailboxInteractor {
|
||||
final ThreadRepository threadRepository;
|
||||
@@ -40,7 +40,7 @@ class RefreshChangesEmailsInMailboxInteractor {
|
||||
filterOption: filterOption)
|
||||
.map(_toGetEmailState);
|
||||
} catch (e) {
|
||||
yield Left(GetAllEmailFailure(e));
|
||||
yield Left(RefreshChangesAllEmailFailure(e));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -48,7 +48,7 @@ class RefreshChangesEmailsInMailboxInteractor {
|
||||
final presentationEmailList = emailResponse.emailList
|
||||
?.map((email) => email.toPresentationEmail()).toList() ?? List.empty();
|
||||
|
||||
return Right<Failure, Success>(GetAllEmailSuccess(
|
||||
return Right<Failure, Success>(RefreshChangesAllEmailSuccess(
|
||||
emailList: presentationEmailList,
|
||||
currentEmailState: emailResponse.state));
|
||||
}
|
||||
|
||||
@@ -36,6 +36,7 @@ import 'package:tmail_ui_user/features/thread/domain/state/load_more_emails_stat
|
||||
import 'package:tmail_ui_user/features/thread/domain/state/mark_as_multiple_email_read_state.dart';
|
||||
import 'package:tmail_ui_user/features/thread/domain/state/mark_as_star_multiple_email_state.dart';
|
||||
import 'package:tmail_ui_user/features/thread/domain/state/move_multiple_email_to_mailbox_state.dart';
|
||||
import 'package:tmail_ui_user/features/thread/domain/state/refresh_changes_all_email_state.dart';
|
||||
import 'package:tmail_ui_user/features/thread/domain/state/search_email_state.dart';
|
||||
import 'package:tmail_ui_user/features/thread/domain/state/search_more_email_state.dart';
|
||||
import 'package:tmail_ui_user/features/thread/domain/usecases/get_emails_in_mailbox_interactor.dart';
|
||||
@@ -125,21 +126,18 @@ class ThreadController extends BaseController {
|
||||
|
||||
mailboxDashBoardController.viewState.listen((state) {
|
||||
state.map((success) {
|
||||
if (success is MarkAsEmailReadSuccess
|
||||
|| success is MarkAsMultipleEmailReadAllSuccess
|
||||
|| success is MarkAsMultipleEmailReadHasSomeEmailFailure
|
||||
|| success is MoveToMailboxSuccess
|
||||
|| success is MarkAsStarEmailSuccess) {
|
||||
cancelSelectEmail();
|
||||
_refreshEmailChanges();
|
||||
} else if (success is SearchEmailNewQuery){
|
||||
_searchEmail();
|
||||
log('ThreadController::onReady(): ${success.runtimeType}');
|
||||
|
||||
if (success is SearchEmailNewQuery){
|
||||
mailboxDashBoardController.clearState();
|
||||
} else if (success is SaveEmailAsDraftsSuccess
|
||||
_searchEmail();
|
||||
} else if (success is MarkAsEmailReadSuccess
|
||||
|| success is MoveToMailboxSuccess
|
||||
|| success is MarkAsStarEmailSuccess
|
||||
|| success is SaveEmailAsDraftsSuccess
|
||||
|| success is RemoveEmailDraftsSuccess
|
||||
|| success is SendEmailSuccess
|
||||
|| success is UpdateEmailDraftsSuccess) {
|
||||
cancelSelectEmail();
|
||||
_refreshEmailChanges();
|
||||
}
|
||||
});
|
||||
@@ -175,6 +173,8 @@ class ThreadController extends BaseController {
|
||||
(success) {
|
||||
if (success is GetAllEmailSuccess) {
|
||||
_getAllEmailSuccess(success);
|
||||
} else if (success is RefreshChangesAllEmailSuccess) {
|
||||
_refreshChangesAllEmailSuccess(success);
|
||||
} else if (success is LoadMoreEmailsSuccess) {
|
||||
_loadMoreEmailsSuccess(success);
|
||||
} else if (success is SearchEmailSuccess) {
|
||||
@@ -194,7 +194,7 @@ class ThreadController extends BaseController {
|
||||
(failure) {
|
||||
if (failure is MarkAsMultipleEmailReadAllFailure
|
||||
|| failure is MarkAsMultipleEmailReadFailure) {
|
||||
_markAsSelectedEmailReadFailure(failure);
|
||||
_markAsReadSelectedMultipleEmailFailure(failure);
|
||||
} else if (failure is MarkAsStarMultipleEmailAllFailure
|
||||
|| failure is MarkAsStarMultipleEmailFailure) {
|
||||
_markAsStarMultipleEmailFailure(failure);
|
||||
@@ -203,7 +203,7 @@ class ThreadController extends BaseController {
|
||||
(success) {
|
||||
if (success is MarkAsMultipleEmailReadAllSuccess
|
||||
|| success is MarkAsMultipleEmailReadHasSomeEmailFailure) {
|
||||
_markAsSelectedEmailReadSuccess(success);
|
||||
_markAsReadSelectedMultipleEmailSuccess(success);
|
||||
} else if (success is MoveMultipleEmailToMailboxAllSuccess
|
||||
|| success is MoveMultipleEmailToMailboxHasSomeEmailFailure) {
|
||||
_moveSelectedMultipleEmailToMailboxSuccess(success);
|
||||
@@ -242,6 +242,12 @@ class ThreadController extends BaseController {
|
||||
emailList.value = success.emailList;
|
||||
}
|
||||
|
||||
void _refreshChangesAllEmailSuccess(RefreshChangesAllEmailSuccess success) {
|
||||
log('ThreadController::_refreshChangesAllEmailSuccess(): ${success.emailList.length}');
|
||||
_currentEmailState = success.currentEmailState;
|
||||
emailList.value = success.emailList;
|
||||
}
|
||||
|
||||
void _getAllEmailAction(AccountId accountId, {MailboxId? mailboxId}) {
|
||||
log('ThreadController::_getAllEmailAction(): mailboxId = $mailboxId');
|
||||
consumeState(_getEmailsInMailboxInteractor.execute(
|
||||
@@ -431,13 +437,10 @@ class ThreadController extends BaseController {
|
||||
currentSelectMode.value = SelectMode.INACTIVE;
|
||||
}
|
||||
|
||||
void markAsSelectedEmailRead(List<PresentationEmail> listPresentationEmail, {bool fromContextMenuAction = false}) {
|
||||
if (fromContextMenuAction) {
|
||||
popBack();
|
||||
}
|
||||
void markAsReadSelectedMultipleEmail(List<PresentationEmail> listPresentationEmail) {
|
||||
cancelSelectEmail();
|
||||
|
||||
final readAction = listPresentationEmail.isAllEmailRead ? ReadActions.markAsUnread : ReadActions.markAsRead;
|
||||
|
||||
final mailboxCurrent = mailboxDashBoardController.selectedMailbox.value;
|
||||
if (_accountId != null && mailboxCurrent != null) {
|
||||
final listEmail = listPresentationEmail.map((presentationEmail) => presentationEmail.toEmail()).toList();
|
||||
@@ -445,9 +448,7 @@ class ThreadController extends BaseController {
|
||||
}
|
||||
}
|
||||
|
||||
void _markAsSelectedEmailReadSuccess(Success success) {
|
||||
cancelSelectEmail();
|
||||
|
||||
void _markAsReadSelectedMultipleEmailSuccess(Success success) {
|
||||
mailboxDashBoardController.dispatchState(Right(success));
|
||||
|
||||
ReadActions? readActions;
|
||||
@@ -467,11 +468,14 @@ class ThreadController extends BaseController {
|
||||
message: message,
|
||||
icon: readActions == ReadActions.markAsUnread ? _imagePaths.icUnreadToast : _imagePaths.icReadToast);
|
||||
}
|
||||
|
||||
_refreshEmailChanges();
|
||||
}
|
||||
|
||||
void _markAsSelectedEmailReadFailure(Failure failure) {
|
||||
cancelSelectEmail();
|
||||
_appToast.showErrorToast(AppLocalizations.of(currentContext!).an_error_occurred);
|
||||
void _markAsReadSelectedMultipleEmailFailure(Failure failure) {
|
||||
if (currentContext != null) {
|
||||
_appToast.showErrorToast(AppLocalizations.of(currentContext!).an_error_occurred);
|
||||
}
|
||||
}
|
||||
|
||||
void openFilterMessagesCupertinoActionSheet(BuildContext context, List<Widget> actionTiles, {Widget? cancelButton}) {
|
||||
@@ -514,6 +518,8 @@ class ThreadController extends BaseController {
|
||||
if (currentMailbox != null && _accountId != null) {
|
||||
popBack();
|
||||
|
||||
cancelSelectEmail();
|
||||
|
||||
final listEmailIds = listEmail.map((email) => email.id).toList();
|
||||
final destinationMailbox = await push(
|
||||
AppRoutes.DESTINATION_PICKER,
|
||||
@@ -538,7 +544,6 @@ class ThreadController extends BaseController {
|
||||
}
|
||||
|
||||
void _moveSelectedMultipleEmailToMailboxSuccess(Success success) {
|
||||
cancelSelectEmail();
|
||||
mailboxDashBoardController.dispatchState(Right(success));
|
||||
|
||||
String? destinationPath;
|
||||
@@ -603,16 +608,10 @@ class ThreadController extends BaseController {
|
||||
_refreshEmailChanges();
|
||||
}
|
||||
|
||||
void markAsStarSelectedMultipleEmail(List<PresentationEmail> listPresentationEmail,
|
||||
{bool fromContextMenuAction = false, MarkStarAction? markStarAction}) {
|
||||
if (fromContextMenuAction) {
|
||||
popBack();
|
||||
}
|
||||
|
||||
final starAction = markStarAction != null
|
||||
? markStarAction
|
||||
: listPresentationEmail.isAllEmailStarred ? MarkStarAction.unMarkStar : MarkStarAction.markStar;
|
||||
void markAsStarSelectedMultipleEmail(List<PresentationEmail> listPresentationEmail) {
|
||||
cancelSelectEmail();
|
||||
|
||||
final starAction = listPresentationEmail.isAllEmailStarred ? MarkStarAction.unMarkStar : MarkStarAction.markStar;
|
||||
final mailboxCurrent = mailboxDashBoardController.selectedMailbox.value;
|
||||
if (_accountId != null && mailboxCurrent != null) {
|
||||
final listEmail = listPresentationEmail.map((presentationEmail) => presentationEmail.toEmail()).toList();
|
||||
@@ -621,9 +620,6 @@ class ThreadController extends BaseController {
|
||||
}
|
||||
|
||||
void _markAsStarMultipleEmailSuccess(Success success) {
|
||||
cancelSelectEmail();
|
||||
_refreshEmailChanges();
|
||||
|
||||
MarkStarAction? markStarAction;
|
||||
int countMarkStarSuccess = 0;
|
||||
|
||||
@@ -640,10 +636,11 @@ class ThreadController extends BaseController {
|
||||
? AppLocalizations.of(currentContext!).marked_unstar_multiple_item(countMarkStarSuccess)
|
||||
: AppLocalizations.of(currentContext!).marked_star_multiple_item(countMarkStarSuccess));
|
||||
}
|
||||
|
||||
_refreshEmailChanges();
|
||||
}
|
||||
|
||||
void _markAsStarMultipleEmailFailure(Failure failure) {
|
||||
cancelSelectEmail();
|
||||
if (currentContext != null) {
|
||||
_appToast.showErrorToast(AppLocalizations.of(currentContext!).an_error_occurred);
|
||||
}
|
||||
@@ -716,7 +713,7 @@ class ThreadController extends BaseController {
|
||||
switch(actionType) {
|
||||
case EmailActionType.markAsRead:
|
||||
case EmailActionType.markAsUnread:
|
||||
markAsSelectedEmailRead(selectionEmail);
|
||||
markAsReadSelectedMultipleEmail(selectionEmail);
|
||||
break;
|
||||
case EmailActionType.markAsStar:
|
||||
case EmailActionType.markAsUnStar:
|
||||
|
||||
@@ -144,7 +144,7 @@ class ThreadView extends GetWidget<ThreadController> with UserSettingPopupMenuMi
|
||||
: controller.emailList.allEmailUnread;
|
||||
|
||||
if (listEmail.isNotEmpty) {
|
||||
controller.markAsSelectedEmailRead(listEmail);
|
||||
controller.markAsReadSelectedMultipleEmail(listEmail);
|
||||
}
|
||||
})
|
||||
..text(AppLocalizations.of(context).mark_all_as_read, isVertical: false))
|
||||
|
||||
@@ -111,9 +111,9 @@ class EmailTileBuilder {
|
||||
Padding(
|
||||
padding: EdgeInsets.only(left: 8),
|
||||
child: (ButtonBuilder(_imagePaths.icAttachment)
|
||||
..paddingIcon(EdgeInsets.zero)
|
||||
..size(16))
|
||||
.build()),
|
||||
..paddingIcon(EdgeInsets.zero)
|
||||
..size(16))
|
||||
.build()),
|
||||
Padding(
|
||||
padding: EdgeInsets.only(right: 4, left: 8),
|
||||
child: Text(
|
||||
@@ -122,9 +122,9 @@ class EmailTileBuilder {
|
||||
overflow:TextOverflow.ellipsis,
|
||||
style: TextStyle(fontSize: 13, color: AppColor.colorContentEmail))),
|
||||
(ButtonBuilder(_imagePaths.icChevron)
|
||||
..paddingIcon(EdgeInsets.zero)
|
||||
..size(16))
|
||||
.build(),
|
||||
..paddingIcon(EdgeInsets.zero)
|
||||
..size(16))
|
||||
.build(),
|
||||
],
|
||||
)
|
||||
),
|
||||
@@ -169,9 +169,9 @@ class EmailTileBuilder {
|
||||
),
|
||||
if (_presentationEmail.isFlaggedEmail() )
|
||||
(ButtonBuilder(_imagePaths.icStar)
|
||||
..paddingIcon(EdgeInsets.zero)
|
||||
..size(15))
|
||||
.build(),
|
||||
..paddingIcon(EdgeInsets.zero)
|
||||
..size(15))
|
||||
.build(),
|
||||
],
|
||||
)),
|
||||
Padding(
|
||||
|
||||
+2
-2
@@ -12,7 +12,7 @@ import 'package:mockito/mockito.dart';
|
||||
import 'package:tmail_ui_user/features/thread/domain/model/email_response.dart';
|
||||
import 'package:tmail_ui_user/features/thread/domain/constants/thread_constants.dart';
|
||||
import 'package:tmail_ui_user/features/thread/domain/repository/thread_repository.dart';
|
||||
import 'package:tmail_ui_user/features/thread/domain/state/get_all_email_state.dart';
|
||||
import 'package:tmail_ui_user/features/thread/domain/state/refresh_changes_all_email_state.dart';
|
||||
import 'package:tmail_ui_user/features/thread/domain/usecases/refresh_changes_emails_in_mailbox_interactor.dart';
|
||||
|
||||
import '../../../../fixtures/account_fixtures.dart';
|
||||
@@ -66,7 +66,7 @@ void main() {
|
||||
expect(states.length, equals(2));
|
||||
expect(states, containsAllInOrder({
|
||||
Right(RefreshingState()),
|
||||
Right(GetAllEmailSuccess(
|
||||
Right(RefreshChangesAllEmailSuccess(
|
||||
emailList: {
|
||||
EmailFixtures.email1.toPresentationEmail(),
|
||||
EmailFixtures.email2.toPresentationEmail(),
|
||||
|
||||
Reference in New Issue
Block a user