TF-80 Move multiple email to mailbox from thread view
This commit is contained in:
@@ -1,35 +1,33 @@
|
||||
import 'package:core/core.dart';
|
||||
import 'package:dartz/dartz.dart';
|
||||
import 'package:model/email/read_actions.dart';
|
||||
|
||||
class MarkAsMultipleEmailReadAllSuccess extends UIState {
|
||||
final List<Either<Failure, Success>> resultList;
|
||||
final int countMarkAsReadSuccess;
|
||||
final ReadActions readActions;
|
||||
|
||||
MarkAsMultipleEmailReadAllSuccess(this.resultList, this.readActions);
|
||||
MarkAsMultipleEmailReadAllSuccess(this.countMarkAsReadSuccess, this.readActions);
|
||||
|
||||
@override
|
||||
List<Object?> get props => [resultList, readActions];
|
||||
List<Object?> get props => [countMarkAsReadSuccess, readActions];
|
||||
}
|
||||
|
||||
class MarkAsMultipleEmailReadAllFailure extends FeatureFailure {
|
||||
final List<Either<Failure, Success>> resultList;
|
||||
final ReadActions readActions;
|
||||
|
||||
MarkAsMultipleEmailReadAllFailure(this.resultList, this.readActions);
|
||||
MarkAsMultipleEmailReadAllFailure(this.readActions);
|
||||
|
||||
@override
|
||||
List<Object> get props => [resultList, readActions];
|
||||
List<Object> get props => [readActions];
|
||||
}
|
||||
|
||||
class MarkAsMultipleEmailReadHasSomeEmailFailure extends UIState {
|
||||
final List<Either<Failure, Success>> resultList;
|
||||
final int countMarkAsReadSuccess;
|
||||
final ReadActions readActions;
|
||||
|
||||
MarkAsMultipleEmailReadHasSomeEmailFailure(this.resultList, this.readActions);
|
||||
MarkAsMultipleEmailReadHasSomeEmailFailure(this.countMarkAsReadSuccess, this.readActions);
|
||||
|
||||
@override
|
||||
List<Object> get props => [resultList, readActions];
|
||||
List<Object> get props => [countMarkAsReadSuccess, readActions];
|
||||
}
|
||||
|
||||
class MarkAsMultipleEmailReadFailure extends FeatureFailure {
|
||||
|
||||
@@ -0,0 +1,69 @@
|
||||
import 'package:core/core.dart';
|
||||
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
|
||||
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
||||
import 'package:model/model.dart';
|
||||
|
||||
class MoveMultipleEmailToMailboxAllSuccess extends UIState {
|
||||
final List<EmailId> movedListEmailId;
|
||||
final MailboxId currentMailboxId;
|
||||
final MailboxId destinationMailboxId;
|
||||
final MoveAction moveAction;
|
||||
final String? destinationPath;
|
||||
|
||||
MoveMultipleEmailToMailboxAllSuccess(
|
||||
this.movedListEmailId,
|
||||
this.currentMailboxId,
|
||||
this.destinationMailboxId,
|
||||
this.moveAction,
|
||||
this.destinationPath);
|
||||
|
||||
@override
|
||||
List<Object?> get props => [
|
||||
movedListEmailId,
|
||||
currentMailboxId,
|
||||
destinationMailboxId,
|
||||
moveAction,
|
||||
destinationPath];
|
||||
}
|
||||
|
||||
class MoveMultipleEmailToMailboxAllFailure extends FeatureFailure {
|
||||
final MoveAction moveAction;
|
||||
|
||||
MoveMultipleEmailToMailboxAllFailure(this.moveAction);
|
||||
|
||||
@override
|
||||
List<Object> get props => [moveAction];
|
||||
}
|
||||
|
||||
class MoveMultipleEmailToMailboxHasSomeEmailFailure extends UIState {
|
||||
final List<EmailId> movedListEmailId;
|
||||
final MailboxId currentMailboxId;
|
||||
final MailboxId destinationMailboxId;
|
||||
final MoveAction moveAction;
|
||||
final String? destinationPath;
|
||||
|
||||
MoveMultipleEmailToMailboxHasSomeEmailFailure(
|
||||
this.movedListEmailId,
|
||||
this.currentMailboxId,
|
||||
this.destinationMailboxId,
|
||||
this.moveAction,
|
||||
this.destinationPath);
|
||||
|
||||
@override
|
||||
List<Object?> get props => [
|
||||
movedListEmailId,
|
||||
currentMailboxId,
|
||||
destinationMailboxId,
|
||||
moveAction,
|
||||
destinationPath];
|
||||
}
|
||||
|
||||
class MoveMultipleEmailToMailboxFailure extends FeatureFailure {
|
||||
final exception;
|
||||
final MoveAction moveAction;
|
||||
|
||||
MoveMultipleEmailToMailboxFailure(this.exception, this.moveAction);
|
||||
|
||||
@override
|
||||
List<Object> get props => [exception, moveAction];
|
||||
}
|
||||
@@ -2,40 +2,37 @@ import 'package:core/core.dart';
|
||||
import 'package:dartz/dartz.dart';
|
||||
import 'package:jmap_dart_client/jmap/account_id.dart';
|
||||
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
|
||||
import 'package:model/email/read_actions.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/usecases/mark_as_email_read_interactor.dart';
|
||||
import 'package:model/model.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
|
||||
import 'package:tmail_ui_user/features/thread/domain/state/mark_as_multiple_email_read_state.dart';
|
||||
|
||||
class MarkAsMultipleEmailReadInteractor {
|
||||
final MarkAsEmailReadInteractor markAsEmailReadInteractor;
|
||||
final EmailRepository _emailRepository;
|
||||
|
||||
MarkAsMultipleEmailReadInteractor(this.markAsEmailReadInteractor);
|
||||
MarkAsMultipleEmailReadInteractor(this._emailRepository);
|
||||
|
||||
Stream<Either<Failure, Success>> execute(
|
||||
AccountId accountId,
|
||||
List<EmailId> listEmailId,
|
||||
List<Email> emails,
|
||||
ReadActions readAction
|
||||
) async* {
|
||||
try {
|
||||
final listResult = await Future.wait(listEmailId.map((emailId) async {
|
||||
final result = await markAsEmailReadInteractor.execute(accountId, emailId, readAction).toList();
|
||||
return result.first;
|
||||
}));
|
||||
if (listResult.length == 1) {
|
||||
yield listResult.first;
|
||||
yield Right<Failure, Success>(LoadingState());
|
||||
|
||||
final listEmailNeedMarkAsRead = emails
|
||||
.where((email) => readAction == ReadActions.markAsUnread ? email.isReadEmail() : email.isUnReadEmail())
|
||||
.toList();
|
||||
|
||||
final result = await _emailRepository.markAsRead(accountId, listEmailNeedMarkAsRead, readAction);
|
||||
|
||||
if (listEmailNeedMarkAsRead.length == result.length) {
|
||||
final countMarkAsReadSuccess = emails.length;
|
||||
yield Right(MarkAsMultipleEmailReadAllSuccess(countMarkAsReadSuccess, readAction));
|
||||
} else if (result.isEmpty) {
|
||||
yield Left(MarkAsMultipleEmailReadAllFailure(readAction));
|
||||
} else {
|
||||
var failedFileCount = 0;
|
||||
listResult.forEach((element) {
|
||||
if (element is Left) {
|
||||
failedFileCount++;
|
||||
}
|
||||
});
|
||||
if (failedFileCount == 0) {
|
||||
yield Right(MarkAsMultipleEmailReadAllSuccess(listResult, readAction));
|
||||
} else if (failedFileCount == listResult.length) {
|
||||
yield Left(MarkAsMultipleEmailReadAllFailure(listResult, readAction));
|
||||
}
|
||||
yield Right(MarkAsMultipleEmailReadHasSomeEmailFailure(listResult, readAction));
|
||||
final countMarkAsReadSuccess = emails.length - (listEmailNeedMarkAsRead.length - result.length);
|
||||
yield Right(MarkAsMultipleEmailReadHasSomeEmailFailure(countMarkAsReadSuccess, readAction));
|
||||
}
|
||||
} catch (e) {
|
||||
yield Left(MarkAsMultipleEmailReadFailure(e, readAction));
|
||||
|
||||
@@ -0,0 +1,42 @@
|
||||
import 'dart:async';
|
||||
|
||||
import 'package:core/core.dart';
|
||||
import 'package:dartz/dartz.dart';
|
||||
import 'package:jmap_dart_client/jmap/account_id.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/model/move_request.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
|
||||
import 'package:tmail_ui_user/features/thread/domain/state/move_multiple_email_to_mailbox_state.dart';
|
||||
|
||||
class MoveMultipleEmailToMailboxInteractor {
|
||||
final EmailRepository _emailRepository;
|
||||
|
||||
MoveMultipleEmailToMailboxInteractor(this._emailRepository);
|
||||
|
||||
Stream<Either<Failure, Success>> execute(AccountId accountId, MoveRequest moveRequest) async* {
|
||||
try {
|
||||
yield Right<Failure, Success>(LoadingState());
|
||||
|
||||
final result = await _emailRepository.moveToMailbox(accountId, moveRequest);
|
||||
|
||||
if (moveRequest.emailIds.length == result.length) {
|
||||
yield Right(MoveMultipleEmailToMailboxAllSuccess(
|
||||
result,
|
||||
moveRequest.currentMailboxId,
|
||||
moveRequest.destinationMailboxId,
|
||||
moveRequest.moveAction,
|
||||
moveRequest.destinationPath));
|
||||
} else if (result.isEmpty) {
|
||||
yield Left(MoveMultipleEmailToMailboxAllFailure(moveRequest.moveAction));
|
||||
} else {
|
||||
yield Right(MoveMultipleEmailToMailboxHasSomeEmailFailure(
|
||||
result,
|
||||
moveRequest.currentMailboxId,
|
||||
moveRequest.destinationMailboxId,
|
||||
moveRequest.moveAction,
|
||||
moveRequest.destinationPath));
|
||||
}
|
||||
} catch (e) {
|
||||
yield Left(MoveMultipleEmailToMailboxFailure(e, moveRequest.moveAction));
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -8,6 +8,7 @@ import 'package:tmail_ui_user/features/email/data/network/email_api.dart';
|
||||
import 'package:tmail_ui_user/features/email/data/repository/email_repository_impl.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/usecases/mark_as_email_read_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/usecases/move_to_mailbox_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/thread/data/datasource/thread_datasource.dart';
|
||||
import 'package:tmail_ui_user/features/thread/data/datasource_impl/thread_datasource_impl.dart';
|
||||
import 'package:tmail_ui_user/features/thread/data/network/thread_api.dart';
|
||||
@@ -15,6 +16,7 @@ import 'package:tmail_ui_user/features/thread/data/repository/thread_repository_
|
||||
import 'package:tmail_ui_user/features/thread/domain/repository/thread_repository.dart';
|
||||
import 'package:tmail_ui_user/features/thread/domain/usecases/get_emails_in_mailbox_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/thread/domain/usecases/mark_as_multiple_email_read_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/thread/domain/usecases/move_multiple_email_to_mailbox_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/thread/presentation/thread_controller.dart';
|
||||
|
||||
class ThreadBindings extends Bindings {
|
||||
@@ -31,13 +33,16 @@ class ThreadBindings extends Bindings {
|
||||
Get.lazyPut(() => EmailRepositoryImpl(Get.find<EmailDataSource>()));
|
||||
Get.lazyPut<EmailRepository>(() => Get.find<EmailRepositoryImpl>());
|
||||
Get.lazyPut(() => MarkAsEmailReadInteractor(Get.find<EmailRepository>()));
|
||||
Get.lazyPut(() => MarkAsMultipleEmailReadInteractor(Get.find<MarkAsEmailReadInteractor>()));
|
||||
Get.lazyPut(() => MarkAsMultipleEmailReadInteractor(Get.find<EmailRepository>()));
|
||||
Get.lazyPut(() => MoveToMailboxInteractor(Get.find<EmailRepository>()));
|
||||
Get.lazyPut(() => MoveMultipleEmailToMailboxInteractor(Get.find<EmailRepository>()));
|
||||
Get.put(ThreadController(
|
||||
Get.find<ResponsiveUtils>(),
|
||||
Get.find<GetEmailsInMailboxInteractor>(),
|
||||
Get.find<ScrollController>(),
|
||||
Get.find<MarkAsMultipleEmailReadInteractor>(),
|
||||
Get.find<AppToast>(),
|
||||
Get.find<MoveMultipleEmailToMailboxInteractor>(),
|
||||
));
|
||||
}
|
||||
}
|
||||
@@ -16,6 +16,7 @@ import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
||||
import 'package:model/model.dart';
|
||||
import 'package:tmail_ui_user/features/base/base_controller.dart';
|
||||
import 'package:tmail_ui_user/features/destination_picker/presentation/model/destination_picker_arguments.dart';
|
||||
import 'package:tmail_ui_user/features/email/domain/model/move_request.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/email/presentation/model/composer_arguments.dart';
|
||||
@@ -23,8 +24,10 @@ import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/mailbox_da
|
||||
import 'package:tmail_ui_user/features/thread/domain/constants/thread_constants.dart';
|
||||
import 'package:tmail_ui_user/features/thread/domain/state/get_all_email_state.dart';
|
||||
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/move_multiple_email_to_mailbox_state.dart';
|
||||
import 'package:tmail_ui_user/features/thread/domain/usecases/get_emails_in_mailbox_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/thread/domain/usecases/mark_as_multiple_email_read_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/thread/domain/usecases/move_multiple_email_to_mailbox_interactor.dart';
|
||||
import 'package:tmail_ui_user/features/thread/presentation/model/load_more_state.dart';
|
||||
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
||||
import 'package:tmail_ui_user/main/routes/app_routes.dart';
|
||||
@@ -38,6 +41,7 @@ class ThreadController extends BaseController {
|
||||
final AppToast _appToast;
|
||||
final ResponsiveUtils responsiveUtils;
|
||||
final ScrollController listEmailController;
|
||||
final MoveMultipleEmailToMailboxInteractor _moveMultipleEmailToMailboxInteractor;
|
||||
|
||||
final _properties = Properties({
|
||||
'id', 'subject', 'from', 'to', 'cc', 'bcc', 'keywords', 'receivedAt',
|
||||
@@ -58,6 +62,7 @@ class ThreadController extends BaseController {
|
||||
this.listEmailController,
|
||||
this._markAsMultipleEmailReadInteractor,
|
||||
this._appToast,
|
||||
this._moveMultipleEmailToMailboxInteractor,
|
||||
);
|
||||
|
||||
@override
|
||||
@@ -73,20 +78,17 @@ class ThreadController extends BaseController {
|
||||
if (_currentMailboxId != selectedMailbox?.id) {
|
||||
_currentMailboxId = selectedMailbox?.id;
|
||||
refreshGetAllEmailAction();
|
||||
} else {
|
||||
mailboxDashBoardController.viewState.value.map((success) {
|
||||
if (success is MarkAsEmailReadSuccess ||
|
||||
success is MarkAsMultipleEmailReadAllSuccess ||
|
||||
success is MarkAsMultipleEmailReadHasSomeEmailFailure) {
|
||||
_refreshListEmail();
|
||||
}
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
mailboxDashBoardController.viewState.listen((state) {
|
||||
state.map((success) {
|
||||
if (success is MoveToMailboxSuccess) {
|
||||
if (success is MarkAsEmailReadSuccess
|
||||
|| success is MarkAsMultipleEmailReadAllSuccess
|
||||
|| success is MarkAsMultipleEmailReadHasSomeEmailFailure) {
|
||||
_refreshListEmail();
|
||||
mailboxDashBoardController.clearState();
|
||||
} else if (success is MoveToMailboxSuccess) {
|
||||
_refreshListEmail();
|
||||
mailboxDashBoardController.clearState();
|
||||
}
|
||||
@@ -108,19 +110,20 @@ class ThreadController extends BaseController {
|
||||
(failure) {
|
||||
if (failure is GetAllEmailFailure) {
|
||||
_resetPositionCurrentAndLoadMoreState();
|
||||
} else if (failure is MarkAsEmailReadFailure ||
|
||||
failure is MarkAsMultipleEmailReadAllFailure ||
|
||||
failure is MarkAsMultipleEmailReadFailure) {
|
||||
} else if (failure is MarkAsMultipleEmailReadAllFailure
|
||||
|| failure is MarkAsMultipleEmailReadFailure) {
|
||||
_markAsSelectedEmailReadFailure(failure);
|
||||
}
|
||||
},
|
||||
(success) {
|
||||
if (success is GetAllEmailSuccess) {
|
||||
_getAllEmailSuccess(success);
|
||||
} else if (success is MarkAsEmailReadSuccess ||
|
||||
success is MarkAsMultipleEmailReadAllSuccess ||
|
||||
success is MarkAsMultipleEmailReadHasSomeEmailFailure) {
|
||||
} else if (success is MarkAsMultipleEmailReadAllSuccess
|
||||
|| success is MarkAsMultipleEmailReadHasSomeEmailFailure) {
|
||||
_markAsSelectedEmailReadSuccess(success);
|
||||
} else if (success is MoveMultipleEmailToMailboxAllSuccess
|
||||
|| success is MoveMultipleEmailToMailboxHasSomeEmailFailure) {
|
||||
_moveSelectedMultipleEmailToMailboxSuccess(success);
|
||||
}
|
||||
}
|
||||
);
|
||||
@@ -177,7 +180,8 @@ class ThreadController extends BaseController {
|
||||
void refreshGetAllEmailAction() {
|
||||
loadMoreState.value = LoadMoreState.IDLE;
|
||||
positionCurrent = 0;
|
||||
emailList.clear();
|
||||
dispatchState(Right(LoadingState()));
|
||||
emailList.value = <PresentationEmail>[];
|
||||
|
||||
final accountId = mailboxDashBoardController.accountId.value;
|
||||
|
||||
@@ -245,9 +249,11 @@ class ThreadController extends BaseController {
|
||||
}
|
||||
|
||||
void _refreshListEmail() {
|
||||
currentSelectMode.value = SelectMode.INACTIVE;
|
||||
final newLimit = emailList.isNotEmpty ? UnsignedInt(emailList.length) : ThreadConstants.defaultLimit;
|
||||
loadMoreState.value = LoadMoreState.IDLE;
|
||||
emailList.clear();
|
||||
dispatchState(Right(LoadingState()));
|
||||
emailList.value = <PresentationEmail>[];
|
||||
|
||||
final accountId = mailboxDashBoardController.accountId.value;
|
||||
|
||||
@@ -262,61 +268,42 @@ class ThreadController extends BaseController {
|
||||
}
|
||||
}
|
||||
|
||||
void markAsSelectedEmailRead(List<PresentationEmail> listEmail, {bool fromContextMenuAction = false}) {
|
||||
void markAsSelectedEmailRead(List<PresentationEmail> listPresentationEmail, {bool fromContextMenuAction = false}) {
|
||||
if (fromContextMenuAction) {
|
||||
popBack();
|
||||
}
|
||||
|
||||
final readAction = isEmailAllRead(listEmail) ? ReadActions.markAsUnread : ReadActions.markAsRead;
|
||||
|
||||
final listEmailId = listEmail
|
||||
.where((email) => readAction == ReadActions.markAsUnread ? email.isReadEmail() : email.isUnReadEmail())
|
||||
.map((email) => email.id)
|
||||
.toList();
|
||||
final readAction = isEmailAllRead(listPresentationEmail) ? ReadActions.markAsUnread : ReadActions.markAsRead;
|
||||
|
||||
final accountId = mailboxDashBoardController.accountId.value;
|
||||
final mailboxCurrent = mailboxDashBoardController.selectedMailbox.value;
|
||||
if (accountId != null && mailboxCurrent != null) {
|
||||
consumeState(_markAsMultipleEmailReadInteractor.execute(accountId, listEmailId, readAction));
|
||||
final listEmail = listPresentationEmail.map((presentationEmail) => presentationEmail.toEmail()).toList();
|
||||
consumeState(_markAsMultipleEmailReadInteractor.execute(accountId, listEmail, readAction));
|
||||
}
|
||||
}
|
||||
|
||||
void _markAsSelectedEmailReadSuccess(Success success) {
|
||||
cancelSelectEmail();
|
||||
|
||||
List<EmailId> listEmailId = <EmailId>[];
|
||||
ReadActions? readActions;
|
||||
mailboxDashBoardController.dispatchState(Right(success));
|
||||
|
||||
if (success is MarkAsEmailReadSuccess) {
|
||||
listEmailId.add(success.emailId);
|
||||
readActions = success.readActions;
|
||||
} else if (success is MarkAsMultipleEmailReadAllSuccess) {
|
||||
success.resultList.forEach((either) {
|
||||
either.map((success) {
|
||||
if (success is MarkAsEmailReadSuccess) {
|
||||
listEmailId.add(success.emailId);
|
||||
}
|
||||
});
|
||||
});
|
||||
ReadActions? readActions;
|
||||
int countMarkAsReadSuccess = 0;
|
||||
|
||||
if (success is MarkAsMultipleEmailReadAllSuccess) {
|
||||
readActions = success.readActions;
|
||||
countMarkAsReadSuccess = success.countMarkAsReadSuccess;
|
||||
} else if (success is MarkAsMultipleEmailReadHasSomeEmailFailure) {
|
||||
success.resultList.forEach((either) {
|
||||
either.map((success) {
|
||||
if (success is MarkAsEmailReadSuccess) {
|
||||
listEmailId.add(success.emailId);
|
||||
}
|
||||
});
|
||||
});
|
||||
readActions = success.readActions;
|
||||
countMarkAsReadSuccess = success.countMarkAsReadSuccess;
|
||||
}
|
||||
|
||||
if (Get.context != null && readActions != null) {
|
||||
_appToast.showSuccessToast(readActions == ReadActions.markAsUnread
|
||||
? AppLocalizations.of(Get.context!).marked_multiple_item_as_unread(listEmailId.length)
|
||||
: AppLocalizations.of(Get.context!).marked_multiple_item_as_read(listEmailId.length));
|
||||
? AppLocalizations.of(Get.context!).marked_multiple_item_as_unread(countMarkAsReadSuccess)
|
||||
: AppLocalizations.of(Get.context!).marked_multiple_item_as_read(countMarkAsReadSuccess));
|
||||
}
|
||||
|
||||
mailboxDashBoardController.dispatchState(Right(success));
|
||||
}
|
||||
|
||||
void _markAsSelectedEmailReadFailure(Failure failure) {
|
||||
@@ -330,17 +317,87 @@ class ThreadController extends BaseController {
|
||||
.build();
|
||||
}
|
||||
|
||||
void moveSelectedMultipleEmailToMailboxAction(List<PresentationEmail> listEmail) {
|
||||
void moveSelectedMultipleEmailToMailboxAction(List<PresentationEmail> listEmail) async {
|
||||
final currentMailbox = mailboxDashBoardController.selectedMailbox.value;
|
||||
final accountId = mailboxDashBoardController.accountId.value;
|
||||
if (currentMailbox != null && accountId != null) {
|
||||
popBack();
|
||||
|
||||
final listEmailIds = listEmail.map((email) => email.id).toList();
|
||||
push(
|
||||
final destinationMailbox = await push(
|
||||
AppRoutes.DESTINATION_PICKER,
|
||||
arguments: DestinationPickerArguments(accountId, listEmailIds, currentMailbox)
|
||||
);
|
||||
|
||||
if (destinationMailbox != null && destinationMailbox is PresentationMailbox) {
|
||||
_moveSelectedEmailMultipleToMailbox(
|
||||
accountId,
|
||||
MoveRequest(
|
||||
listEmailIds,
|
||||
currentMailbox.id,
|
||||
destinationMailbox.id,
|
||||
MoveAction.moveTo,
|
||||
destinationPath: destinationMailbox.mailboxPath));
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void _moveSelectedEmailMultipleToMailbox(AccountId accountId, MoveRequest moveRequest) {
|
||||
consumeState(_moveMultipleEmailToMailboxInteractor.execute(accountId, moveRequest));
|
||||
}
|
||||
|
||||
void _moveSelectedMultipleEmailToMailboxSuccess(Success success) {
|
||||
mailboxDashBoardController.dispatchState(Right(success));
|
||||
|
||||
String? destinationPath;
|
||||
List<EmailId> movedEmailIds = [];
|
||||
MailboxId? currentMailboxId;
|
||||
MailboxId? destinationMailboxId;
|
||||
MoveAction? moveAction;
|
||||
|
||||
if (success is MoveMultipleEmailToMailboxAllSuccess) {
|
||||
destinationPath = success.destinationPath;
|
||||
movedEmailIds = success.movedListEmailId;
|
||||
currentMailboxId = success.currentMailboxId;
|
||||
destinationMailboxId = success.destinationMailboxId;
|
||||
moveAction = success.moveAction;
|
||||
} else if (success is MoveMultipleEmailToMailboxHasSomeEmailFailure) {
|
||||
destinationPath = success.destinationPath;
|
||||
movedEmailIds = success.movedListEmailId;
|
||||
currentMailboxId = success.currentMailboxId;
|
||||
destinationMailboxId = success.destinationMailboxId;
|
||||
moveAction = success.moveAction;
|
||||
}
|
||||
|
||||
if (Get.context != null && Get.overlayContext != null
|
||||
&& destinationPath != null && moveAction == MoveAction.moveTo) {
|
||||
_appToast.showToastWithAction(
|
||||
Get.overlayContext!,
|
||||
AppLocalizations.of(Get.context!).moved_to_mailbox(destinationPath),
|
||||
AppLocalizations.of(Get.context!).undo_action,
|
||||
() {
|
||||
final newCurrentMailboxId = destinationMailboxId;
|
||||
final newDestinationMailboxId = currentMailboxId;
|
||||
if (newCurrentMailboxId != null && newDestinationMailboxId != null) {
|
||||
_undoMoveSelectedMultipleEmailToMailbox(MoveRequest(
|
||||
movedEmailIds,
|
||||
newCurrentMailboxId,
|
||||
newDestinationMailboxId,
|
||||
MoveAction.undo,
|
||||
destinationPath: destinationPath));
|
||||
}
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
_refreshListEmail();
|
||||
}
|
||||
|
||||
void _undoMoveSelectedMultipleEmailToMailbox(MoveRequest moveRequest) {
|
||||
final accountId = mailboxDashBoardController.accountId.value;
|
||||
|
||||
if (accountId != null) {
|
||||
_moveSelectedEmailMultipleToMailbox(accountId, moveRequest);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@@ -106,73 +106,14 @@ class ThreadView extends GetWidget<ThreadController> {
|
||||
.build();
|
||||
}
|
||||
|
||||
Widget _moveToTrashAction(BuildContext context, List<PresentationEmail> listEmail) {
|
||||
return (EmailContextMenuActionBuilder(
|
||||
Key('move_to_trash_context_menu_action'),
|
||||
SvgPicture.asset(imagePaths.icTrash, width: 24, height: 24, fit: BoxFit.fill),
|
||||
AppLocalizations.of(context).move_to_trash, listEmail)
|
||||
..onActionClick((data) => {}))
|
||||
.build();
|
||||
}
|
||||
|
||||
Widget _moveToMailboxAction(BuildContext context, List<PresentationEmail> listEmail) {
|
||||
return (EmailContextMenuActionBuilder(
|
||||
Key('move_to_mailbox_context_menu_action'),
|
||||
SvgPicture.asset(imagePaths.icFolder, width: 24, height: 24, fit: BoxFit.fill),
|
||||
AppLocalizations.of(context).move_to_mailbox, listEmail)
|
||||
..onActionClick((data) => {}))
|
||||
.build();
|
||||
}
|
||||
|
||||
Widget _markAsFlagAction(BuildContext context, List<PresentationEmail> listEmail) {
|
||||
return (EmailContextMenuActionBuilder(
|
||||
Key('mark_as_flag_context_menu_action'),
|
||||
SvgPicture.asset(imagePaths.icFlag, width: 24, height: 24, fit: BoxFit.fill),
|
||||
AppLocalizations.of(context).mark_as_flag, listEmail)
|
||||
..onActionClick((data) => {}))
|
||||
.build();
|
||||
}
|
||||
|
||||
Widget _moveToSpamAction(BuildContext context, List<PresentationEmail> listEmail) {
|
||||
return (EmailContextMenuActionBuilder(
|
||||
Key('move_to_spam_context_menu_action'),
|
||||
SvgPicture.asset(imagePaths.icMailboxSpam, width: 24, height: 24, fit: BoxFit.fill),
|
||||
AppLocalizations.of(context).move_to_spam, listEmail)
|
||||
..onActionClick((data) => {}))
|
||||
.build();
|
||||
}
|
||||
|
||||
List<Widget> _contextMenuActionList(BuildContext context, List<PresentationEmail> listEmail) {
|
||||
return [
|
||||
_moveToTrashAction(context, listEmail),
|
||||
_moveToMailboxAction(context, listEmail),
|
||||
_markAsReadAction(context, listEmail),
|
||||
_markAsFlagAction(context, listEmail),
|
||||
_moveToSpamAction(context, listEmail),
|
||||
SizedBox(height: 30),
|
||||
];
|
||||
}
|
||||
|
||||
Widget _markAsReadAction(BuildContext context, List<PresentationEmail> listEmail) {
|
||||
return (EmailContextMenuActionBuilder(
|
||||
Key('mark_as_read_context_menu_action'),
|
||||
SvgPicture.asset(imagePaths.icEyeDisable, width: 24, height: 24, fit: BoxFit.fill),
|
||||
controller.isEmailAllRead(listEmail)
|
||||
? AppLocalizations.of(context).mark_as_unread
|
||||
: AppLocalizations.of(context).mark_as_read,
|
||||
listEmail)
|
||||
..onActionClick((data) => controller.markAsSelectedEmailRead(data, fromContextMenuAction: true)))
|
||||
.build();
|
||||
}
|
||||
|
||||
Widget _moveToTrashAction(BuildContext context, List<PresentationEmail> listEmail) {
|
||||
return (EmailContextMenuActionBuilder(
|
||||
Key('move_to_trash_context_menu_action'),
|
||||
SvgPicture.asset(imagePaths.icTrash, width: 24, height: 24, fit: BoxFit.fill),
|
||||
AppLocalizations.of(context).move_to_trash,
|
||||
listEmail)
|
||||
..onActionClick((data) => {}))
|
||||
.build();
|
||||
..onActionClick((data) => {}))
|
||||
.build();
|
||||
}
|
||||
|
||||
Widget _moveToMailboxAction(BuildContext context, List<PresentationEmail> listEmail) {
|
||||
@@ -181,8 +122,8 @@ class ThreadView extends GetWidget<ThreadController> {
|
||||
SvgPicture.asset(imagePaths.icFolder, width: 24, height: 24, fit: BoxFit.fill),
|
||||
AppLocalizations.of(context).move_to_mailbox,
|
||||
listEmail)
|
||||
..onActionClick((emails) => controller.moveSelectedMultipleEmailToMailboxAction(emails)))
|
||||
.build();
|
||||
..onActionClick((data) => controller.moveSelectedMultipleEmailToMailboxAction(data)))
|
||||
.build();
|
||||
}
|
||||
|
||||
Widget _markAsFlagAction(BuildContext context, List<PresentationEmail> listEmail) {
|
||||
@@ -191,8 +132,8 @@ class ThreadView extends GetWidget<ThreadController> {
|
||||
SvgPicture.asset(imagePaths.icFlag, width: 24, height: 24, fit: BoxFit.fill),
|
||||
AppLocalizations.of(context).mark_as_flag,
|
||||
listEmail)
|
||||
..onActionClick((data) => {}))
|
||||
.build();
|
||||
..onActionClick((data) => {}))
|
||||
.build();
|
||||
}
|
||||
|
||||
Widget _moveToSpamAction(BuildContext context, List<PresentationEmail> listEmail) {
|
||||
@@ -201,8 +142,8 @@ class ThreadView extends GetWidget<ThreadController> {
|
||||
SvgPicture.asset(imagePaths.icMailboxSpam, width: 24, height: 24, fit: BoxFit.fill),
|
||||
AppLocalizations.of(context).move_to_spam,
|
||||
listEmail)
|
||||
..onActionClick((data) => {}))
|
||||
.build();
|
||||
..onActionClick((data) => {}))
|
||||
.build();
|
||||
}
|
||||
|
||||
Widget _buildLoadingView() {
|
||||
@@ -238,63 +179,59 @@ class ThreadView extends GetWidget<ThreadController> {
|
||||
padding: EdgeInsets.zero,
|
||||
color: responsiveUtils.isMobile(context) ? AppColor.bgMailboxListMail : Colors.white,
|
||||
child: Obx(() => controller.currentSelectMode.value == SelectMode.INACTIVE
|
||||
? RefreshIndicator(
|
||||
color: AppColor.primaryColor,
|
||||
onRefresh: () async => controller.refreshGetAllEmailAction(),
|
||||
child: _buildListEmailBody(context))
|
||||
: _buildListEmailBody(context)));
|
||||
? controller.emailList.isNotEmpty
|
||||
? RefreshIndicator(
|
||||
color: AppColor.primaryColor,
|
||||
onRefresh: () async => controller.refreshGetAllEmailAction(),
|
||||
child: _buildListEmailBody(context, controller.emailList))
|
||||
: RefreshIndicator(
|
||||
color: AppColor.primaryColor,
|
||||
onRefresh: () async => controller.refreshGetAllEmailAction(),
|
||||
child: _buildEmptyEmail(context))
|
||||
: controller.emailList.isNotEmpty
|
||||
? _buildListEmailBody(context, controller.emailList)
|
||||
: _buildEmptyEmail(context)));
|
||||
}
|
||||
|
||||
Widget _buildListEmailBody(BuildContext context) {
|
||||
return controller.emailList.isNotEmpty
|
||||
? _buildListEmailSuccess(context, controller.emailList)
|
||||
: _buildEmptyEmail(context);
|
||||
}
|
||||
Widget _buildListEmailSuccess(BuildContext context, List<PresentationEmail> listPresentationEmail) {
|
||||
if (listPresentationEmail.isEmpty) {
|
||||
return _buildEmptyEmail(context);
|
||||
} else {
|
||||
return NotificationListener<ScrollNotification>(
|
||||
onNotification: (ScrollNotification scrollInfo) {
|
||||
if (controller.loadMoreState.value == LoadMoreState.IDLE
|
||||
&& scrollInfo.metrics.pixels == scrollInfo.metrics.maxScrollExtent) {
|
||||
controller.loadMoreEmailAction();
|
||||
return true;
|
||||
}
|
||||
return false;
|
||||
},
|
||||
child: ListView.builder(
|
||||
controller: controller.listEmailController,
|
||||
padding: EdgeInsets.only(top: 16),
|
||||
key: Key('presentation_email_list'),
|
||||
itemCount: listPresentationEmail.length,
|
||||
itemBuilder: (context, index) =>
|
||||
Obx(() => (EmailTileBuilder(
|
||||
context,
|
||||
imagePaths,
|
||||
controller.getSelectMode(listPresentationEmail[index], controller.mailboxDashBoardController.selectedEmail.value),
|
||||
listPresentationEmail[index],
|
||||
responsiveUtils,
|
||||
controller.currentSelectMode.value)
|
||||
..onOpenEmailAction((selectedEmail) => controller.previewEmail(context, selectedEmail))
|
||||
..onSelectEmailAction((selectedEmail) => controller.selectEmail(context, selectedEmail)))
|
||||
.build()),
|
||||
));
|
||||
}
|
||||
Widget _buildListEmailBody(BuildContext context, List<PresentationEmail> listPresentationEmail) {
|
||||
return NotificationListener<ScrollNotification>(
|
||||
onNotification: (ScrollNotification scrollInfo) {
|
||||
if (scrollInfo is ScrollEndNotification
|
||||
&& controller.loadMoreState.value == LoadMoreState.IDLE
|
||||
&& scrollInfo.metrics.pixels == scrollInfo.metrics.maxScrollExtent) {
|
||||
controller.loadMoreEmailAction();
|
||||
}
|
||||
return false;
|
||||
},
|
||||
child: ListView.builder(
|
||||
controller: controller.listEmailController,
|
||||
physics: AlwaysScrollableScrollPhysics(),
|
||||
padding: EdgeInsets.only(top: 16),
|
||||
key: Key('presentation_email_list'),
|
||||
itemCount: listPresentationEmail.length,
|
||||
itemBuilder: (context, index) => Obx(() => (EmailTileBuilder(
|
||||
context,
|
||||
imagePaths,
|
||||
controller.getSelectMode(listPresentationEmail[index], controller.mailboxDashBoardController.selectedEmail.value),
|
||||
listPresentationEmail[index],
|
||||
responsiveUtils,
|
||||
controller.currentSelectMode.value)
|
||||
..onOpenEmailAction((selectedEmail) => controller.previewEmail(context, selectedEmail))
|
||||
..onSelectEmailAction((selectedEmail) => controller.selectEmail(context, selectedEmail)))
|
||||
.build()),
|
||||
));
|
||||
}
|
||||
|
||||
Widget _buildEmptyEmail(BuildContext context) {
|
||||
return Obx(() => controller.viewState.value.fold(
|
||||
(failure) => Text(
|
||||
AppLocalizations.of(context).no_emails,
|
||||
maxLines: 1,
|
||||
style: TextStyle(fontSize: 25, color: AppColor.mailboxTextColor, fontWeight: FontWeight.bold)),
|
||||
(success) => success is LoadingState
|
||||
? SizedBox.shrink()
|
||||
: Text(
|
||||
AppLocalizations.of(context).no_emails,
|
||||
maxLines: 1,
|
||||
style: TextStyle(fontSize: 25, color: AppColor.mailboxTextColor, fontWeight: FontWeight.bold)))
|
||||
(failure) => SizedBox.shrink(),
|
||||
(success) => !(success is LoadingState)
|
||||
? (BackgroundWidgetBuilder(context)
|
||||
..key(Key('empty_email_background'))
|
||||
..image(SvgPicture.asset(imagePaths.icEmptyImageDefault, width: 120, height: 120, fit: BoxFit.fill))
|
||||
..text(AppLocalizations.of(context).no_emails))
|
||||
.build()
|
||||
: SizedBox.shrink())
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user