TF-314 Implement delete an email in EmailView
This commit is contained in:
@@ -4,6 +4,7 @@ import 'package:jmap_dart_client/jmap/mail/email/email.dart';
|
|||||||
import 'package:model/model.dart';
|
import 'package:model/model.dart';
|
||||||
import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart';
|
import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart';
|
||||||
import 'package:tmail_ui_user/features/email/domain/model/move_request.dart';
|
import 'package:tmail_ui_user/features/email/domain/model/move_request.dart';
|
||||||
|
import 'package:tmail_ui_user/features/email/domain/model/move_to_trash_request.dart';
|
||||||
|
|
||||||
abstract class EmailDataSource {
|
abstract class EmailDataSource {
|
||||||
Future<Email> getEmailContent(AccountId accountId, EmailId emailId);
|
Future<Email> getEmailContent(AccountId accountId, EmailId emailId);
|
||||||
@@ -36,6 +37,8 @@ abstract class EmailDataSource {
|
|||||||
|
|
||||||
Future<List<EmailId>> moveToMailbox(AccountId accountId, MoveRequest moveRequest);
|
Future<List<EmailId>> moveToMailbox(AccountId accountId, MoveRequest moveRequest);
|
||||||
|
|
||||||
|
Future<List<EmailId>> moveToTrash(AccountId accountId, MoveToTrashRequest moveRequest);
|
||||||
|
|
||||||
Future<List<Email>> markAsStar(
|
Future<List<Email>> markAsStar(
|
||||||
AccountId accountId,
|
AccountId accountId,
|
||||||
List<Email> emails,
|
List<Email> emails,
|
||||||
|
|||||||
@@ -6,6 +6,7 @@ import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart'
|
|||||||
import 'package:tmail_ui_user/features/email/data/datasource/email_datasource.dart';
|
import 'package:tmail_ui_user/features/email/data/datasource/email_datasource.dart';
|
||||||
import 'package:tmail_ui_user/features/email/data/network/email_api.dart';
|
import 'package:tmail_ui_user/features/email/data/network/email_api.dart';
|
||||||
import 'package:tmail_ui_user/features/email/domain/model/move_request.dart';
|
import 'package:tmail_ui_user/features/email/domain/model/move_request.dart';
|
||||||
|
import 'package:tmail_ui_user/features/email/domain/model/move_to_trash_request.dart';
|
||||||
|
|
||||||
class EmailDataSourceImpl extends EmailDataSource {
|
class EmailDataSourceImpl extends EmailDataSource {
|
||||||
|
|
||||||
@@ -122,4 +123,13 @@ class EmailDataSourceImpl extends EmailDataSource {
|
|||||||
throw error;
|
throw error;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<List<EmailId>> moveToTrash(AccountId accountId, MoveToTrashRequest moveRequest) {
|
||||||
|
return Future.sync(() async {
|
||||||
|
return await emailAPI.moveToTrash(accountId, moveRequest);
|
||||||
|
}).catchError((error) {
|
||||||
|
throw error;
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -27,6 +27,7 @@ import 'package:path_provider/path_provider.dart';
|
|||||||
import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart';
|
import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart';
|
||||||
import 'package:model/model.dart';
|
import 'package:model/model.dart';
|
||||||
import 'package:tmail_ui_user/features/email/domain/model/move_request.dart';
|
import 'package:tmail_ui_user/features/email/domain/model/move_request.dart';
|
||||||
|
import 'package:tmail_ui_user/features/email/domain/model/move_to_trash_request.dart';
|
||||||
|
|
||||||
class EmailAPI {
|
class EmailAPI {
|
||||||
|
|
||||||
@@ -352,4 +353,32 @@ class EmailAPI {
|
|||||||
throw error;
|
throw error;
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<List<EmailId>> moveToTrash(AccountId accountId, MoveToTrashRequest moveRequest) async {
|
||||||
|
final setEmailMethod = SetEmailMethod(accountId)
|
||||||
|
..addUpdates(moveRequest.emailIds
|
||||||
|
.generateMapUpdateObjectMoveToMailbox(moveRequest.currentMailboxId, moveRequest.trashMailboxId));
|
||||||
|
|
||||||
|
final requestBuilder = JmapRequestBuilder(_httpClient, ProcessingInvocation());
|
||||||
|
|
||||||
|
final setEmailInvocation = requestBuilder.invocation(setEmailMethod);
|
||||||
|
|
||||||
|
final response = await (requestBuilder
|
||||||
|
..usings(setEmailMethod.requiredCapabilities))
|
||||||
|
.build()
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
final setEmailResponse = response.parse<SetEmailResponse>(
|
||||||
|
setEmailInvocation.methodCallId,
|
||||||
|
SetEmailResponse.deserialize);
|
||||||
|
|
||||||
|
return Future.sync(() async {
|
||||||
|
final mapUpdated = setEmailResponse!.updated!;
|
||||||
|
return moveRequest.emailIds
|
||||||
|
.where((emailId) => mapUpdated.containsKey(emailId.id))
|
||||||
|
.toList();
|
||||||
|
}).catchError((error) {
|
||||||
|
throw error;
|
||||||
|
});
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -7,6 +7,7 @@ import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart'
|
|||||||
import 'package:tmail_ui_user/features/email/data/datasource/email_datasource.dart';
|
import 'package:tmail_ui_user/features/email/data/datasource/email_datasource.dart';
|
||||||
import 'package:tmail_ui_user/features/email/data/datasource/html_datasource.dart';
|
import 'package:tmail_ui_user/features/email/data/datasource/html_datasource.dart';
|
||||||
import 'package:tmail_ui_user/features/email/domain/model/move_request.dart';
|
import 'package:tmail_ui_user/features/email/domain/model/move_request.dart';
|
||||||
|
import 'package:tmail_ui_user/features/email/domain/model/move_to_trash_request.dart';
|
||||||
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
|
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
|
||||||
|
|
||||||
class EmailRepositoryImpl extends EmailRepository {
|
class EmailRepositoryImpl extends EmailRepository {
|
||||||
@@ -108,4 +109,9 @@ class EmailRepositoryImpl extends EmailRepository {
|
|||||||
Future<bool> downloadAttachmentForWeb(Attachment attachment, AccountId accountId, String baseDownloadUrl, AccountRequest accountRequest) {
|
Future<bool> downloadAttachmentForWeb(Attachment attachment, AccountId accountId, String baseDownloadUrl, AccountRequest accountRequest) {
|
||||||
return emailDataSource.downloadAttachmentForWeb(attachment, accountId, baseDownloadUrl, accountRequest);
|
return emailDataSource.downloadAttachmentForWeb(attachment, accountId, baseDownloadUrl, accountRequest);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<List<EmailId>> moveToTrash(AccountId accountId, MoveToTrashRequest moveRequest) {
|
||||||
|
return emailDataSource.moveToTrash(accountId, moveRequest);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,28 @@
|
|||||||
|
|
||||||
|
import 'package:equatable/equatable.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 MoveToTrashRequest with EquatableMixin {
|
||||||
|
|
||||||
|
final List<EmailId> emailIds;
|
||||||
|
final MailboxId currentMailboxId;
|
||||||
|
final MailboxId trashMailboxId;
|
||||||
|
final MoveAction moveAction;
|
||||||
|
|
||||||
|
MoveToTrashRequest(
|
||||||
|
this.emailIds,
|
||||||
|
this.currentMailboxId,
|
||||||
|
this.trashMailboxId,
|
||||||
|
this.moveAction,
|
||||||
|
);
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object?> get props => [
|
||||||
|
emailIds,
|
||||||
|
currentMailboxId,
|
||||||
|
trashMailboxId,
|
||||||
|
moveAction,
|
||||||
|
];
|
||||||
|
}
|
||||||
@@ -4,6 +4,7 @@ import 'package:jmap_dart_client/jmap/mail/email/email.dart';
|
|||||||
import 'package:model/model.dart';
|
import 'package:model/model.dart';
|
||||||
import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart';
|
import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart';
|
||||||
import 'package:tmail_ui_user/features/email/domain/model/move_request.dart';
|
import 'package:tmail_ui_user/features/email/domain/model/move_request.dart';
|
||||||
|
import 'package:tmail_ui_user/features/email/domain/model/move_to_trash_request.dart';
|
||||||
|
|
||||||
abstract class EmailRepository {
|
abstract class EmailRepository {
|
||||||
Future<Email> getEmailContent(AccountId accountId, EmailId emailId);
|
Future<Email> getEmailContent(AccountId accountId, EmailId emailId);
|
||||||
@@ -36,6 +37,8 @@ abstract class EmailRepository {
|
|||||||
|
|
||||||
Future<List<EmailId>> moveToMailbox(AccountId accountId, MoveRequest moveRequest);
|
Future<List<EmailId>> moveToMailbox(AccountId accountId, MoveRequest moveRequest);
|
||||||
|
|
||||||
|
Future<List<EmailId>> moveToTrash(AccountId accountId, MoveToTrashRequest moveRequest);
|
||||||
|
|
||||||
Future<List<Email>> markAsStar(
|
Future<List<Email>> markAsStar(
|
||||||
AccountId accountId,
|
AccountId accountId,
|
||||||
List<Email> emails,
|
List<Email> emails,
|
||||||
|
|||||||
@@ -0,0 +1,35 @@
|
|||||||
|
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 MoveToTrashSuccess extends UIState {
|
||||||
|
final EmailId emailId;
|
||||||
|
final MailboxId currentMailboxId;
|
||||||
|
final MailboxId trashMailboxId;
|
||||||
|
final MoveAction moveAction;
|
||||||
|
|
||||||
|
MoveToTrashSuccess(
|
||||||
|
this.emailId,
|
||||||
|
this.currentMailboxId,
|
||||||
|
this.trashMailboxId,
|
||||||
|
this.moveAction
|
||||||
|
);
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object?> get props => [
|
||||||
|
emailId,
|
||||||
|
currentMailboxId,
|
||||||
|
trashMailboxId,
|
||||||
|
moveAction
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
class MoveToTrashFailure extends FeatureFailure {
|
||||||
|
final exception;
|
||||||
|
|
||||||
|
MoveToTrashFailure(this.exception);
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object> get props => [exception];
|
||||||
|
}
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
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_to_trash_request.dart';
|
||||||
|
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
|
||||||
|
import 'package:tmail_ui_user/features/email/domain/state/move_to_trash_state.dart';
|
||||||
|
|
||||||
|
class MoveToTrashInteractor {
|
||||||
|
final EmailRepository emailRepository;
|
||||||
|
|
||||||
|
MoveToTrashInteractor(this.emailRepository);
|
||||||
|
|
||||||
|
Stream<Either<Failure, Success>> execute(AccountId accountId, MoveToTrashRequest moveRequest) async* {
|
||||||
|
try {
|
||||||
|
final result = await emailRepository.moveToTrash(accountId, moveRequest);
|
||||||
|
if (result.isNotEmpty) {
|
||||||
|
yield Right(MoveToTrashSuccess(
|
||||||
|
result.first,
|
||||||
|
moveRequest.currentMailboxId,
|
||||||
|
moveRequest.trashMailboxId,
|
||||||
|
moveRequest.moveAction));
|
||||||
|
} else {
|
||||||
|
yield Left(MoveToTrashFailure(null));
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
yield Left(MoveToTrashFailure(e));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -17,6 +17,7 @@ import 'package:tmail_ui_user/features/email/domain/usecases/get_email_content_i
|
|||||||
import 'package:tmail_ui_user/features/email/domain/usecases/mark_as_email_read_interactor.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/email/domain/usecases/move_to_mailbox_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/email/domain/usecases/mark_as_star_email_interactor.dart';
|
import 'package:tmail_ui_user/features/email/domain/usecases/mark_as_star_email_interactor.dart';
|
||||||
|
import 'package:tmail_ui_user/features/email/domain/usecases/move_to_trash_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/email/presentation/email_controller.dart';
|
import 'package:tmail_ui_user/features/email/presentation/email_controller.dart';
|
||||||
import 'package:tmail_ui_user/features/login/data/repository/credential_repository_impl.dart';
|
import 'package:tmail_ui_user/features/login/data/repository/credential_repository_impl.dart';
|
||||||
import 'package:tmail_ui_user/features/login/domain/repository/credential_repository.dart';
|
import 'package:tmail_ui_user/features/login/domain/repository/credential_repository.dart';
|
||||||
@@ -75,6 +76,7 @@ class EmailBindings extends BaseBindings {
|
|||||||
Get.find<EmailRepository>(),
|
Get.find<EmailRepository>(),
|
||||||
Get.find<CredentialRepository>(),
|
Get.find<CredentialRepository>(),
|
||||||
));
|
));
|
||||||
|
Get.lazyPut(() => MoveToTrashInteractor(Get.find<EmailRepository>()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
|||||||
@@ -15,6 +15,7 @@ import 'package:pointer_interceptor/pointer_interceptor.dart';
|
|||||||
import 'package:tmail_ui_user/features/base/base_controller.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/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/model/move_request.dart';
|
||||||
|
import 'package:tmail_ui_user/features/email/domain/model/move_to_trash_request.dart';
|
||||||
import 'package:tmail_ui_user/features/email/domain/state/download_attachment_for_web_state.dart';
|
import 'package:tmail_ui_user/features/email/domain/state/download_attachment_for_web_state.dart';
|
||||||
import 'package:tmail_ui_user/features/email/domain/state/download_attachments_state.dart';
|
import 'package:tmail_ui_user/features/email/domain/state/download_attachments_state.dart';
|
||||||
import 'package:tmail_ui_user/features/email/domain/state/export_attachment_state.dart';
|
import 'package:tmail_ui_user/features/email/domain/state/export_attachment_state.dart';
|
||||||
@@ -380,6 +381,26 @@ class EmailController extends BaseController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void moveToTrashAction(BuildContext context, PresentationEmail email) async {
|
||||||
|
final currentMailbox = mailboxDashBoardController.selectedMailbox.value;
|
||||||
|
final accountId = mailboxDashBoardController.accountId.value;
|
||||||
|
final trashMailboxId = mailboxDashBoardController.mapDefaultMailboxId[PresentationMailbox.roleTrash];
|
||||||
|
|
||||||
|
if (currentMailbox != null && accountId != null && trashMailboxId != null) {
|
||||||
|
_moveToTrash(context, accountId, MoveToTrashRequest(
|
||||||
|
[email.id],
|
||||||
|
currentMailbox.id,
|
||||||
|
trashMailboxId,
|
||||||
|
MoveAction.moveToTrash)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void _moveToTrash(BuildContext context, AccountId accountId, MoveToTrashRequest moveRequest) {
|
||||||
|
backToThreadView(context);
|
||||||
|
mailboxDashBoardController.moveToTrash(accountId, moveRequest);
|
||||||
|
}
|
||||||
|
|
||||||
void markAsStarEmail(PresentationEmail presentationEmail, MarkStarAction markStarAction) async {
|
void markAsStarEmail(PresentationEmail presentationEmail, MarkStarAction markStarAction) async {
|
||||||
final accountId = mailboxDashBoardController.accountId.value;
|
final accountId = mailboxDashBoardController.accountId.value;
|
||||||
final mailboxCurrent = mailboxDashBoardController.selectedMailbox.value;
|
final mailboxCurrent = mailboxDashBoardController.selectedMailbox.value;
|
||||||
@@ -410,8 +431,8 @@ class EmailController extends BaseController {
|
|||||||
case EmailActionType.move:
|
case EmailActionType.move:
|
||||||
moveToMailboxAction(presentationEmail);
|
moveToMailboxAction(presentationEmail);
|
||||||
break;
|
break;
|
||||||
case EmailActionType.delete:
|
case EmailActionType.moveToTrash:
|
||||||
_appToast.showToast(AppLocalizations.of(context).the_feature_is_under_development);
|
moveToTrashAction(context, presentationEmail);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
|||||||
@@ -113,6 +113,15 @@ class AppBarMailWidgetBuilder {
|
|||||||
_onEmailActionClick?.call(_presentationEmail!, _presentationEmail!.isFlaggedEmail() ? EmailActionType.markAsUnStar : EmailActionType.markAsStar);
|
_onEmailActionClick?.call(_presentationEmail!, _presentationEmail!.isFlaggedEmail() ? EmailActionType.markAsUnStar : EmailActionType.markAsStar);
|
||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
|
if (_currentMailbox?.role != PresentationMailbox.roleTrash)
|
||||||
|
buildIconWeb(
|
||||||
|
icon: SvgPicture.asset(_imagePaths.icDeleteEmail, fit: BoxFit.fill),
|
||||||
|
tooltip: AppLocalizations.of(_context).move_to_trash,
|
||||||
|
onTap: () {
|
||||||
|
if (_presentationEmail != null) {
|
||||||
|
_onEmailActionClick?.call(_presentationEmail!, EmailActionType.moveToTrash);
|
||||||
|
}
|
||||||
|
}),
|
||||||
Padding(
|
Padding(
|
||||||
padding: EdgeInsets.only(left: 10, right: 16),
|
padding: EdgeInsets.only(left: 10, right: 16),
|
||||||
child: buildIconWebHasPosition(
|
child: buildIconWebHasPosition(
|
||||||
|
|||||||
@@ -18,6 +18,7 @@ import 'package:tmail_ui_user/features/composer/domain/state/send_email_state.da
|
|||||||
import 'package:tmail_ui_user/features/composer/domain/state/update_email_drafts_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/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/domain/state/move_to_mailbox_state.dart';
|
||||||
|
import 'package:tmail_ui_user/features/email/domain/state/move_to_trash_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/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/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/create_new_mailbox_state.dart';
|
||||||
@@ -122,6 +123,7 @@ class MailboxController extends BaseMailboxController {
|
|||||||
refreshMailboxChanges();
|
refreshMailboxChanges();
|
||||||
} else if (success is MarkAsEmailReadSuccess
|
} else if (success is MarkAsEmailReadSuccess
|
||||||
|| success is MoveToMailboxSuccess
|
|| success is MoveToMailboxSuccess
|
||||||
|
|| success is MoveToTrashSuccess
|
||||||
|| success is SaveEmailAsDraftsSuccess
|
|| success is SaveEmailAsDraftsSuccess
|
||||||
|| success is RemoveEmailDraftsSuccess
|
|| success is RemoveEmailDraftsSuccess
|
||||||
|| success is SendEmailSuccess
|
|| success is SendEmailSuccess
|
||||||
|
|||||||
@@ -9,6 +9,8 @@ import 'package:tmail_ui_user/features/email/data/local/html_analyzer.dart';
|
|||||||
import 'package:tmail_ui_user/features/email/data/network/email_api.dart';
|
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/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/repository/email_repository.dart';
|
||||||
|
import 'package:tmail_ui_user/features/email/domain/usecases/move_to_mailbox_interactor.dart';
|
||||||
|
import 'package:tmail_ui_user/features/email/domain/usecases/move_to_trash_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/email/presentation/email_bindings.dart';
|
import 'package:tmail_ui_user/features/email/presentation/email_bindings.dart';
|
||||||
import 'package:tmail_ui_user/features/login/domain/repository/credential_repository.dart';
|
import 'package:tmail_ui_user/features/login/domain/repository/credential_repository.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/presentation/mailbox_bindings.dart';
|
import 'package:tmail_ui_user/features/mailbox/presentation/mailbox_bindings.dart';
|
||||||
@@ -29,7 +31,10 @@ class MailboxDashBoardBindings extends BaseBindings {
|
|||||||
|
|
||||||
@override
|
@override
|
||||||
void bindingsController() {
|
void bindingsController() {
|
||||||
Get.put(MailboxDashBoardController());
|
Get.put(MailboxDashBoardController(
|
||||||
|
Get.find<MoveToTrashInteractor>(),
|
||||||
|
Get.find<MoveToMailboxInteractor>(),
|
||||||
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -51,6 +56,8 @@ class MailboxDashBoardBindings extends BaseBindings {
|
|||||||
void bindingsInteractor() {
|
void bindingsInteractor() {
|
||||||
Get.lazyPut(() => GetUserProfileInteractor(Get.find<CredentialRepository>()));
|
Get.lazyPut(() => GetUserProfileInteractor(Get.find<CredentialRepository>()));
|
||||||
Get.lazyPut(() => RemoveEmailDraftsInteractor(Get.find<EmailRepository>()));
|
Get.lazyPut(() => RemoveEmailDraftsInteractor(Get.find<EmailRepository>()));
|
||||||
|
Get.lazyPut(() => MoveToTrashInteractor(Get.find<EmailRepository>()));
|
||||||
|
Get.lazyPut(() => MoveToMailboxInteractor(Get.find<EmailRepository>()));
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
|||||||
@@ -18,6 +18,11 @@ import 'package:tmail_ui_user/features/composer/domain/state/send_email_state.da
|
|||||||
import 'package:tmail_ui_user/features/composer/domain/state/update_email_drafts_state.dart';
|
import 'package:tmail_ui_user/features/composer/domain/state/update_email_drafts_state.dart';
|
||||||
import 'package:tmail_ui_user/features/composer/presentation/composer_bindings.dart';
|
import 'package:tmail_ui_user/features/composer/presentation/composer_bindings.dart';
|
||||||
import 'package:tmail_ui_user/features/composer/presentation/composer_controller.dart';
|
import 'package:tmail_ui_user/features/composer/presentation/composer_controller.dart';
|
||||||
|
import 'package:tmail_ui_user/features/email/domain/model/move_request.dart';
|
||||||
|
import 'package:tmail_ui_user/features/email/domain/model/move_to_trash_request.dart';
|
||||||
|
import 'package:tmail_ui_user/features/email/domain/state/move_to_trash_state.dart';
|
||||||
|
import 'package:tmail_ui_user/features/email/domain/usecases/move_to_mailbox_interactor.dart';
|
||||||
|
import 'package:tmail_ui_user/features/email/domain/usecases/move_to_trash_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart';
|
import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart';
|
||||||
import 'package:tmail_ui_user/features/login/domain/usecases/delete_credential_interactor.dart';
|
import 'package:tmail_ui_user/features/login/domain/usecases/delete_credential_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/get_user_profile_state.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/domain/state/get_user_profile_state.dart';
|
||||||
@@ -43,6 +48,9 @@ class MailboxDashBoardController extends ReloadableController {
|
|||||||
final DeleteCredentialInteractor _deleteCredentialInteractor = Get.find<DeleteCredentialInteractor>();
|
final DeleteCredentialInteractor _deleteCredentialInteractor = Get.find<DeleteCredentialInteractor>();
|
||||||
final CachingManager _cachingManager = Get.find<CachingManager>();
|
final CachingManager _cachingManager = Get.find<CachingManager>();
|
||||||
|
|
||||||
|
final MoveToTrashInteractor _moveToTrashInteractor;
|
||||||
|
final MoveToMailboxInteractor _moveToMailboxInteractor;
|
||||||
|
|
||||||
final scaffoldKey = GlobalKey<ScaffoldState>();
|
final scaffoldKey = GlobalKey<ScaffoldState>();
|
||||||
final selectedMailbox = Rxn<PresentationMailbox>();
|
final selectedMailbox = Rxn<PresentationMailbox>();
|
||||||
final selectedEmail = Rxn<PresentationEmail>();
|
final selectedEmail = Rxn<PresentationEmail>();
|
||||||
@@ -61,7 +69,10 @@ class MailboxDashBoardController extends ReloadableController {
|
|||||||
FocusNode searchFocus = FocusNode();
|
FocusNode searchFocus = FocusNode();
|
||||||
RouterArguments? routerArguments;
|
RouterArguments? routerArguments;
|
||||||
|
|
||||||
MailboxDashBoardController();
|
MailboxDashBoardController(
|
||||||
|
this._moveToTrashInteractor,
|
||||||
|
this._moveToMailboxInteractor,
|
||||||
|
);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void onReady() {
|
void onReady() {
|
||||||
@@ -125,6 +136,8 @@ class MailboxDashBoardController extends ReloadableController {
|
|||||||
} else if (success is RemoveEmailDraftsSuccess
|
} else if (success is RemoveEmailDraftsSuccess
|
||||||
|| success is UpdateEmailDraftsSuccess) {
|
|| success is UpdateEmailDraftsSuccess) {
|
||||||
clearState();
|
clearState();
|
||||||
|
} else if (success is MoveToTrashSuccess) {
|
||||||
|
_moveToTrashSuccess(success);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
@@ -240,6 +253,35 @@ class MailboxDashBoardController extends ReloadableController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void moveToTrash(AccountId accountId, MoveToTrashRequest moveRequest) {
|
||||||
|
consumeState(_moveToTrashInteractor.execute(accountId, moveRequest));
|
||||||
|
}
|
||||||
|
|
||||||
|
void _moveToTrashSuccess(MoveToTrashSuccess success) {
|
||||||
|
if (success.moveAction == MoveAction.moveToTrash && currentContext != null && currentOverlayContext != null) {
|
||||||
|
_appToast.showToastWithAction(
|
||||||
|
currentOverlayContext!,
|
||||||
|
AppLocalizations.of(currentContext!).moved_to_trash,
|
||||||
|
AppLocalizations.of(currentContext!).undo_action,
|
||||||
|
() {
|
||||||
|
final newMoveRequest = MoveRequest(
|
||||||
|
[success.emailId],
|
||||||
|
success.trashMailboxId,
|
||||||
|
success.currentMailboxId,
|
||||||
|
MoveAction.undo);
|
||||||
|
_revertedToOriginalMailbox(newMoveRequest);
|
||||||
|
}
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void _revertedToOriginalMailbox(MoveRequest newMoveRequest) {
|
||||||
|
final currentAccountId = accountId.value;
|
||||||
|
if (currentAccountId != null) {
|
||||||
|
consumeState(_moveToMailboxInteractor.execute(currentAccountId, newMoveRequest));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void _discardEmail(Email email) {
|
void _discardEmail(Email email) {
|
||||||
final currentAccountId = accountId.value;
|
final currentAccountId = accountId.value;
|
||||||
if (currentAccountId != null) {
|
if (currentAccountId != null) {
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ 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/mark_as_email_read_state.dart';
|
||||||
import 'package:tmail_ui_user/features/email/domain/state/mark_as_email_star_state.dart';
|
import 'package:tmail_ui_user/features/email/domain/state/mark_as_email_star_state.dart';
|
||||||
import 'package:tmail_ui_user/features/email/domain/state/move_to_mailbox_state.dart';
|
import 'package:tmail_ui_user/features/email/domain/state/move_to_mailbox_state.dart';
|
||||||
|
import 'package:tmail_ui_user/features/email/domain/state/move_to_trash_state.dart';
|
||||||
import 'package:tmail_ui_user/features/email/domain/usecases/mark_as_star_email_interactor.dart';
|
import 'package:tmail_ui_user/features/email/domain/usecases/mark_as_star_email_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart';
|
import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart';
|
import 'package:tmail_ui_user/features/mailbox/presentation/model/mailbox_actions.dart';
|
||||||
@@ -133,6 +134,7 @@ class ThreadController extends BaseController {
|
|||||||
_searchEmail();
|
_searchEmail();
|
||||||
} else if (success is MarkAsEmailReadSuccess
|
} else if (success is MarkAsEmailReadSuccess
|
||||||
|| success is MoveToMailboxSuccess
|
|| success is MoveToMailboxSuccess
|
||||||
|
|| success is MoveToTrashSuccess
|
||||||
|| success is MarkAsStarEmailSuccess
|
|| success is MarkAsStarEmailSuccess
|
||||||
|| success is SaveEmailAsDraftsSuccess
|
|| success is SaveEmailAsDraftsSuccess
|
||||||
|| success is RemoveEmailDraftsSuccess
|
|| success is RemoveEmailDraftsSuccess
|
||||||
|
|||||||
@@ -963,4 +963,11 @@ class AppLocalizations {
|
|||||||
name: 'your_download_has_started'
|
name: 'your_download_has_started'
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String get moved_to_trash {
|
||||||
|
return Intl.message(
|
||||||
|
'Moved to Trash',
|
||||||
|
name: 'moved_to_trash'
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -13,5 +13,6 @@ enum EmailActionType {
|
|||||||
markAsSpam,
|
markAsSpam,
|
||||||
delete,
|
delete,
|
||||||
edit,
|
edit,
|
||||||
composeFromEmailAddress
|
composeFromEmailAddress,
|
||||||
|
moveToTrash,
|
||||||
}
|
}
|
||||||
@@ -1,5 +1,6 @@
|
|||||||
|
|
||||||
enum MoveAction {
|
enum MoveAction {
|
||||||
moveTo,
|
moveTo,
|
||||||
|
moveToTrash,
|
||||||
undo
|
undo
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user