TF-657 Implement send receipt to sender
This commit is contained in:
+1
-1
@@ -246,4 +246,4 @@ SPEC CHECKSUMS:
|
|||||||
|
|
||||||
PODFILE CHECKSUM: 91efd4097cc41f032416d67ecaac21cc2de8dd55
|
PODFILE CHECKSUM: 91efd4097cc41f032416d67ecaac21cc2de8dd55
|
||||||
|
|
||||||
COCOAPODS: 1.11.2
|
COCOAPODS: 1.11.3
|
||||||
|
|||||||
@@ -3,9 +3,11 @@ import 'package:core/core.dart';
|
|||||||
import 'package:dartz/dartz.dart';
|
import 'package:dartz/dartz.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
import 'package:jmap_dart_client/jmap/account_id.dart';
|
import 'package:jmap_dart_client/jmap/account_id.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/core/capability/capability_identifier.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/session/session.dart';
|
import 'package:jmap_dart_client/jmap/core/session/session.dart';
|
||||||
import 'package:tmail_ui_user/features/base/mixin/message_dialog_action_mixin.dart';
|
import 'package:tmail_ui_user/features/base/mixin/message_dialog_action_mixin.dart';
|
||||||
import 'package:tmail_ui_user/features/base/mixin/popup_context_menu_action_mixin.dart';
|
import 'package:tmail_ui_user/features/base/mixin/popup_context_menu_action_mixin.dart';
|
||||||
|
import 'package:tmail_ui_user/features/email/presentation/mdn_interactor_bindings.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/bindings/contact_autocomplete_bindings.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/bindings/contact_autocomplete_bindings.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/bindings/tmail_autocomplete_bindings.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/bindings/tmail_autocomplete_bindings.dart';
|
||||||
import 'package:tmail_ui_user/main/error/capability_validator.dart';
|
import 'package:tmail_ui_user/main/error/capability_validator.dart';
|
||||||
@@ -72,4 +74,13 @@ abstract class BaseController extends GetxController with MessageDialogActionMix
|
|||||||
logError('BaseController::injectAutoCompleteBindings(): exception: $e');
|
logError('BaseController::injectAutoCompleteBindings(): exception: $e');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void injectMdnBindings(Session? session, AccountId? accountId) {
|
||||||
|
try {
|
||||||
|
requireCapability(session!, accountId!, [CapabilityIdentifier.jmapMdn]);
|
||||||
|
MdnInteractorBindings().dependencies();
|
||||||
|
} catch(e) {
|
||||||
|
logError('ReloadableController::injectVacationBindings(): exception: $e');
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -1037,7 +1037,7 @@ class ComposerController extends BaseController {
|
|||||||
|
|
||||||
if(arguments.emailContents != null && arguments.emailContents!.isNotEmpty) {
|
if(arguments.emailContents != null && arguments.emailContents!.isNotEmpty) {
|
||||||
_emailContents = arguments.emailContents;
|
_emailContents = arguments.emailContents;
|
||||||
emailContentsViewState.value = Right(GetEmailContentSuccess(_emailContents!, [], [], false));
|
emailContentsViewState.value = Right(GetEmailContentSuccess(_emailContents!, [], [], null));
|
||||||
} else {
|
} else {
|
||||||
final baseDownloadUrl = mailboxDashBoardController.sessionCurrent?.getDownloadUrl();
|
final baseDownloadUrl = mailboxDashBoardController.sessionCurrent?.getDownloadUrl();
|
||||||
final accountId = mailboxDashBoardController.sessionCurrent?.accounts.keys.first;
|
final accountId = mailboxDashBoardController.sessionCurrent?.accounts.keys.first;
|
||||||
|
|||||||
@@ -27,7 +27,18 @@ import 'package:jmap_dart_client/jmap/mail/email/submission/envelope.dart';
|
|||||||
import 'package:jmap_dart_client/jmap/mail/email/submission/set/set_email_submission_method.dart';
|
import 'package:jmap_dart_client/jmap/mail/email/submission/set/set_email_submission_method.dart';
|
||||||
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
||||||
import 'package:jmap_dart_client/jmap/mail/mailbox/set/set_mailbox_method.dart';
|
import 'package:jmap_dart_client/jmap/mail/mailbox/set/set_mailbox_method.dart';
|
||||||
import 'package:model/model.dart';
|
import 'package:model/account/account_request.dart';
|
||||||
|
import 'package:model/account/authentication_type.dart';
|
||||||
|
import 'package:model/download/download_task_id.dart';
|
||||||
|
import 'package:model/email/attachment.dart';
|
||||||
|
import 'package:model/email/email_property.dart';
|
||||||
|
import 'package:model/email/mark_star_action.dart';
|
||||||
|
import 'package:model/email/read_actions.dart';
|
||||||
|
import 'package:model/extensions/email_extension.dart';
|
||||||
|
import 'package:model/extensions/keyword_identifier_extension.dart';
|
||||||
|
import 'package:model/extensions/list_email_id_extension.dart';
|
||||||
|
import 'package:model/extensions/mailbox_id_extension.dart';
|
||||||
|
import 'package:model/oidc/token.dart';
|
||||||
import 'package:path_provider/path_provider.dart';
|
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:tmail_ui_user/features/email/domain/model/move_to_mailbox_request.dart';
|
import 'package:tmail_ui_user/features/email/domain/model/move_to_mailbox_request.dart';
|
||||||
|
|||||||
@@ -44,6 +44,8 @@ import 'package:tmail_ui_user/features/mailbox/data/network/mailbox_api.dart';
|
|||||||
import 'package:tmail_ui_user/features/mailbox/data/network/mailbox_isolate_worker.dart';
|
import 'package:tmail_ui_user/features/mailbox/data/network/mailbox_isolate_worker.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/data/repository/mailbox_repository_impl.dart';
|
import 'package:tmail_ui_user/features/mailbox/data/repository/mailbox_repository_impl.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart';
|
||||||
|
import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_identities_interactor.dart';
|
||||||
|
import 'package:tmail_ui_user/features/manage_account/presentation/profiles/identities/identity_interactors_bindings.dart';
|
||||||
|
|
||||||
class EmailBindings extends BaseBindings {
|
class EmailBindings extends BaseBindings {
|
||||||
|
|
||||||
@@ -58,6 +60,7 @@ class EmailBindings extends BaseBindings {
|
|||||||
Get.find<MoveToMailboxInteractor>(),
|
Get.find<MoveToMailboxInteractor>(),
|
||||||
Get.find<MarkAsStarEmailInteractor>(),
|
Get.find<MarkAsStarEmailInteractor>(),
|
||||||
Get.find<DownloadAttachmentForWebInteractor>(),
|
Get.find<DownloadAttachmentForWebInteractor>(),
|
||||||
|
Get.find<GetAllIdentitiesInteractor>(),
|
||||||
));
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -122,6 +125,7 @@ class EmailBindings extends BaseBindings {
|
|||||||
Get.find<AuthenticationOIDCRepository>(),
|
Get.find<AuthenticationOIDCRepository>(),
|
||||||
Get.find<AccountRepository>(),
|
Get.find<AccountRepository>(),
|
||||||
));
|
));
|
||||||
|
IdentityInteractorsBindings().dependencies();
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
|
|||||||
@@ -10,8 +10,12 @@ import 'package:flutter/services.dart';
|
|||||||
import 'package:flutter_svg/flutter_svg.dart';
|
import 'package:flutter_svg/flutter_svg.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
import 'package:jmap_dart_client/jmap/account_id.dart';
|
import 'package:jmap_dart_client/jmap/account_id.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/core/id.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/identities/identity.dart';
|
||||||
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
|
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
|
||||||
import 'package:jmap_dart_client/jmap/mail/email/email_address.dart';
|
import 'package:jmap_dart_client/jmap/mail/email/email_address.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/mdn/disposition.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/mdn/mdn.dart';
|
||||||
import 'package:model/model.dart';
|
import 'package:model/model.dart';
|
||||||
import 'package:better_open_file/better_open_file.dart' as open_file;
|
import 'package:better_open_file/better_open_file.dart' as open_file;
|
||||||
import 'package:permission_handler/permission_handler.dart';
|
import 'package:permission_handler/permission_handler.dart';
|
||||||
@@ -23,6 +27,7 @@ import 'package:tmail_ui_user/features/composer/presentation/extensions/email_ac
|
|||||||
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_action.dart';
|
import 'package:tmail_ui_user/features/email/domain/model/move_action.dart';
|
||||||
import 'package:tmail_ui_user/features/email/domain/model/move_to_mailbox_request.dart';
|
import 'package:tmail_ui_user/features/email/domain/model/move_to_mailbox_request.dart';
|
||||||
|
import 'package:tmail_ui_user/features/email/domain/model/send_receipt_to_sender_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';
|
||||||
@@ -30,6 +35,7 @@ import 'package:tmail_ui_user/features/email/domain/state/get_email_content_stat
|
|||||||
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/send_receipt_to_sender_state.dart';
|
||||||
import 'package:tmail_ui_user/features/email/domain/usecases/download_attachment_for_web_interactor.dart';
|
import 'package:tmail_ui_user/features/email/domain/usecases/download_attachment_for_web_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/email/domain/usecases/download_attachments_interactor.dart';
|
import 'package:tmail_ui_user/features/email/domain/usecases/download_attachments_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/email/domain/usecases/export_attachment_interactor.dart';
|
import 'package:tmail_ui_user/features/email/domain/usecases/export_attachment_interactor.dart';
|
||||||
@@ -37,12 +43,16 @@ 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/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_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/send_receipt_to_sender_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/email/presentation/widgets/email_address_bottom_sheet_builder.dart';
|
import 'package:tmail_ui_user/features/email/presentation/widgets/email_address_bottom_sheet_builder.dart';
|
||||||
import 'package:tmail_ui_user/features/email/presentation/widgets/email_address_dialog_builder.dart';
|
import 'package:tmail_ui_user/features/email/presentation/widgets/email_address_dialog_builder.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';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/controller/mailbox_dashboard_controller.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/download/download_task_state.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/download/download_task_state.dart';
|
||||||
|
import 'package:tmail_ui_user/features/manage_account/domain/state/get_all_identities_state.dart';
|
||||||
|
import 'package:tmail_ui_user/features/manage_account/domain/usecases/get_all_identities_interactor.dart';
|
||||||
|
import 'package:tmail_ui_user/features/manage_account/presentation/extensions/datetime_extension.dart';
|
||||||
import 'package:tmail_ui_user/features/thread/presentation/model/delete_action_type.dart';
|
import 'package:tmail_ui_user/features/thread/presentation/model/delete_action_type.dart';
|
||||||
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
||||||
import 'package:tmail_ui_user/main/routes/app_routes.dart';
|
import 'package:tmail_ui_user/main/routes/app_routes.dart';
|
||||||
@@ -66,12 +76,16 @@ class EmailController extends BaseController with AppLoaderMixin {
|
|||||||
final MoveToMailboxInteractor _moveToMailboxInteractor;
|
final MoveToMailboxInteractor _moveToMailboxInteractor;
|
||||||
final MarkAsStarEmailInteractor _markAsStarEmailInteractor;
|
final MarkAsStarEmailInteractor _markAsStarEmailInteractor;
|
||||||
final DownloadAttachmentForWebInteractor _downloadAttachmentForWebInteractor;
|
final DownloadAttachmentForWebInteractor _downloadAttachmentForWebInteractor;
|
||||||
|
final GetAllIdentitiesInteractor _getAllIdentitiesInteractor;
|
||||||
|
|
||||||
|
SendReceiptToSenderInteractor? _sendReceiptToSenderInteractor;
|
||||||
|
|
||||||
final emailAddressExpandMode = ExpandMode.COLLAPSE.obs;
|
final emailAddressExpandMode = ExpandMode.COLLAPSE.obs;
|
||||||
final attachmentsExpandMode = ExpandMode.COLLAPSE.obs;
|
final attachmentsExpandMode = ExpandMode.COLLAPSE.obs;
|
||||||
final emailContents = <EmailContent>[].obs;
|
final emailContents = <EmailContent>[].obs;
|
||||||
final attachments = <Attachment>[].obs;
|
final attachments = <Attachment>[].obs;
|
||||||
EmailId? _currentEmailId;
|
EmailId? _currentEmailId;
|
||||||
|
Identity? _identitySelected;
|
||||||
List<EmailContent>? initialEmailContents;
|
List<EmailContent>? initialEmailContents;
|
||||||
|
|
||||||
late Worker emailWorker;
|
late Worker emailWorker;
|
||||||
@@ -95,6 +109,7 @@ class EmailController extends BaseController with AppLoaderMixin {
|
|||||||
this._moveToMailboxInteractor,
|
this._moveToMailboxInteractor,
|
||||||
this._markAsStarEmailInteractor,
|
this._markAsStarEmailInteractor,
|
||||||
this._downloadAttachmentForWebInteractor,
|
this._downloadAttachmentForWebInteractor,
|
||||||
|
this._getAllIdentitiesInteractor,
|
||||||
);
|
);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -104,6 +119,19 @@ class EmailController extends BaseController with AppLoaderMixin {
|
|||||||
super.onInit();
|
super.onInit();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void onReady() {
|
||||||
|
injectMdnBindings(
|
||||||
|
mailboxDashBoardController.sessionCurrent,
|
||||||
|
mailboxDashBoardController.accountId.value);
|
||||||
|
try {
|
||||||
|
_sendReceiptToSenderInteractor = Get.find<SendReceiptToSenderInteractor>();
|
||||||
|
} catch (e) {
|
||||||
|
logError('EmailController::onReady(): SendReceiptToSenderInteractor not registered');
|
||||||
|
}
|
||||||
|
super.onReady();
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void onClose() {
|
void onClose() {
|
||||||
_downloadProgressStateController.close();
|
_downloadProgressStateController.close();
|
||||||
@@ -121,6 +149,7 @@ class EmailController extends BaseController with AppLoaderMixin {
|
|||||||
if (!presentationEmail.hasRead) {
|
if (!presentationEmail.hasRead) {
|
||||||
markAsEmailRead(presentationEmail, ReadActions.markAsRead);
|
markAsEmailRead(presentationEmail, ReadActions.markAsRead);
|
||||||
}
|
}
|
||||||
|
_getAllIdentities();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
@@ -167,6 +196,26 @@ class EmailController extends BaseController with AppLoaderMixin {
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _getAllIdentities() {
|
||||||
|
final accountId = mailboxDashBoardController.accountId.value;
|
||||||
|
if (accountId != null) {
|
||||||
|
consumeState(_getAllIdentitiesInteractor.execute(accountId));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void _getAllIdentitiesSuccess(GetAllIdentitiesSuccess success) {
|
||||||
|
if (success.identities?.isNotEmpty == true) {
|
||||||
|
try {
|
||||||
|
final identityDefault = success.identities!
|
||||||
|
.firstWhere((identity) => identity.mayDelete == false);
|
||||||
|
_identitySelected = identityDefault;
|
||||||
|
} catch (e) {
|
||||||
|
logError('EmailController::_getAllIdentitiesSuccess(): ${e.toString()}');
|
||||||
|
_identitySelected = success.identities!.first;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void _getEmailContentAction(EmailId emailId) async {
|
void _getEmailContentAction(EmailId emailId) async {
|
||||||
final accountId = mailboxDashBoardController.accountId.value;
|
final accountId = mailboxDashBoardController.accountId.value;
|
||||||
final baseDownloadUrl = mailboxDashBoardController.sessionCurrent?.getDownloadUrl();
|
final baseDownloadUrl = mailboxDashBoardController.sessionCurrent?.getDownloadUrl();
|
||||||
@@ -202,6 +251,10 @@ class EmailController extends BaseController with AppLoaderMixin {
|
|||||||
_markAsEmailStarSuccess(success);
|
_markAsEmailStarSuccess(success);
|
||||||
} else if (success is DownloadAttachmentForWebSuccess) {
|
} else if (success is DownloadAttachmentForWebSuccess) {
|
||||||
_downloadAttachmentForWebSuccessAction(success);
|
_downloadAttachmentForWebSuccessAction(success);
|
||||||
|
} else if (success is GetAllIdentitiesSuccess) {
|
||||||
|
_getAllIdentitiesSuccess(success);
|
||||||
|
} else if (success is SendReceiptToSenderSuccess) {
|
||||||
|
_sendReceiptToSenderSuccess(success);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@@ -216,7 +269,9 @@ class EmailController extends BaseController with AppLoaderMixin {
|
|||||||
initialEmailContents = success.emailContents;
|
initialEmailContents = success.emailContents;
|
||||||
attachments.value = success.attachments;
|
attachments.value = success.attachments;
|
||||||
|
|
||||||
if (success.readReceiptRequested) {
|
final isShowMessageReadReceipt = success.emailCurrent
|
||||||
|
?.hasReadReceipt(mailboxDashBoardController.mapMailboxById) == true;
|
||||||
|
if (isShowMessageReadReceipt) {
|
||||||
_handleReadReceipt();
|
_handleReadReceipt();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -226,7 +281,7 @@ class EmailController extends BaseController with AppLoaderMixin {
|
|||||||
showConfirmDialogAction(currentContext!,
|
showConfirmDialogAction(currentContext!,
|
||||||
AppLocalizations.of(currentContext!).subTitleReadReceiptRequestNotificationMessage,
|
AppLocalizations.of(currentContext!).subTitleReadReceiptRequestNotificationMessage,
|
||||||
AppLocalizations.of(currentContext!).yes,
|
AppLocalizations.of(currentContext!).yes,
|
||||||
onConfirmAction: () => {},
|
onConfirmAction: () => _handleSendReceiptToSenderAction(currentContext!),
|
||||||
showAsBottomSheet: true,
|
showAsBottomSheet: true,
|
||||||
title: AppLocalizations.of(currentContext!).titleReadReceiptRequestNotificationMessage,
|
title: AppLocalizations.of(currentContext!).titleReadReceiptRequestNotificationMessage,
|
||||||
cancelTitle: AppLocalizations.of(currentContext!).no,
|
cancelTitle: AppLocalizations.of(currentContext!).no,
|
||||||
@@ -728,9 +783,116 @@ class EmailController extends BaseController with AppLoaderMixin {
|
|||||||
mailboxDashBoardController.deleteEmailPermanently(email);
|
mailboxDashBoardController.deleteEmailPermanently(email);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _handleSendReceiptToSenderAction(BuildContext context) {
|
||||||
|
final accountId = mailboxDashBoardController.accountId.value;
|
||||||
|
if (accountId == null) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_sendReceiptToSenderInteractor == null) {
|
||||||
|
_appToast.showBottomToast(
|
||||||
|
currentOverlayContext!,
|
||||||
|
AppLocalizations.of(context).toastMessageNotSupportMdnWhenSendReceipt,
|
||||||
|
leadingIcon: SvgPicture.asset(
|
||||||
|
imagePaths.icNotConnection,
|
||||||
|
width: 24,
|
||||||
|
height: 24,
|
||||||
|
color: Colors.white,
|
||||||
|
fit: BoxFit.fill),
|
||||||
|
backgroundColor: AppColor.toastErrorBackgroundColor,
|
||||||
|
textColor: Colors.white,
|
||||||
|
textActionColor: Colors.white,
|
||||||
|
maxWidth: responsiveUtils.getMaxWidthToast(currentContext!));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (_identitySelected == null || _identitySelected?.id == null) {
|
||||||
|
_appToast.showBottomToast(
|
||||||
|
currentOverlayContext!,
|
||||||
|
AppLocalizations.of(context).toastMessageCannotFoundIdentityWhenSendReceipt,
|
||||||
|
leadingIcon: SvgPicture.asset(
|
||||||
|
imagePaths.icNotConnection,
|
||||||
|
width: 24,
|
||||||
|
height: 24,
|
||||||
|
color: Colors.white,
|
||||||
|
fit: BoxFit.fill),
|
||||||
|
backgroundColor: AppColor.toastErrorBackgroundColor,
|
||||||
|
textColor: Colors.white,
|
||||||
|
textActionColor: Colors.white,
|
||||||
|
maxWidth: responsiveUtils.getMaxWidthToast(currentContext!));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (currentEmail == null || _currentEmailId == null) {
|
||||||
|
_appToast.showBottomToast(
|
||||||
|
currentOverlayContext!,
|
||||||
|
AppLocalizations.of(context).toastMessageCannotFoundEmailIdWhenSendReceipt,
|
||||||
|
leadingIcon: SvgPicture.asset(
|
||||||
|
imagePaths.icNotConnection,
|
||||||
|
width: 24,
|
||||||
|
height: 24,
|
||||||
|
color: Colors.white,
|
||||||
|
fit: BoxFit.fill),
|
||||||
|
backgroundColor: AppColor.toastErrorBackgroundColor,
|
||||||
|
textColor: Colors.white,
|
||||||
|
textActionColor: Colors.white,
|
||||||
|
maxWidth: responsiveUtils.getMaxWidthToast(currentContext!));
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
final mdnToSender = _generateMDN(context, currentEmail!);
|
||||||
|
final sendReceiptRequest = SendReceiptToSenderRequest(
|
||||||
|
mdn: mdnToSender,
|
||||||
|
identityId: _identitySelected!.id!,
|
||||||
|
sendId: Id(_uuid.v1()));
|
||||||
|
log('EmailController::_handleSendReceiptToSenderAction(): sendReceiptRequest: $sendReceiptRequest');
|
||||||
|
|
||||||
|
consumeState(_sendReceiptToSenderInteractor!.execute(accountId, sendReceiptRequest));
|
||||||
|
}
|
||||||
|
|
||||||
|
MDN _generateMDN(BuildContext context, PresentationEmail email) {
|
||||||
|
final senderEmailAddress = email.from?.first.asFullString() ?? '';
|
||||||
|
final subjectEmail = email.subject ?? '';
|
||||||
|
final timeCurrent = DateTime.now();
|
||||||
|
final timeAsString = '${timeCurrent.formatDate(
|
||||||
|
pattern: 'EEE, d MMM yyyy HH:mm:ss')} (${timeCurrent.timeZoneName})';
|
||||||
|
|
||||||
|
final mdnToSender = MDN(
|
||||||
|
forEmailId: email.id,
|
||||||
|
subject: AppLocalizations.of(context).subjectSendReceiptToSender(subjectEmail),
|
||||||
|
textBody: AppLocalizations.of(context).textBodySendReceiptToSender(
|
||||||
|
senderEmailAddress,
|
||||||
|
subjectEmail,
|
||||||
|
timeAsString),
|
||||||
|
disposition: Disposition(
|
||||||
|
ActionMode.manual,
|
||||||
|
SendingMode.manually,
|
||||||
|
DispositionType.displayed));
|
||||||
|
|
||||||
|
return mdnToSender;
|
||||||
|
}
|
||||||
|
|
||||||
|
void _sendReceiptToSenderSuccess(SendReceiptToSenderSuccess success) {
|
||||||
|
log('EmailController::_sendReceiptToSenderSuccess(): ${success.mdn.toString()}');
|
||||||
|
if (currentContext != null) {
|
||||||
|
_appToast.showBottomToast(
|
||||||
|
currentOverlayContext!,
|
||||||
|
AppLocalizations.of(currentContext!).toastMessageSendReceiptSuccess,
|
||||||
|
leadingIcon: SvgPicture.asset(
|
||||||
|
imagePaths.icReadReceiptMessage,
|
||||||
|
width: 24,
|
||||||
|
height: 24,
|
||||||
|
fit: BoxFit.fill),
|
||||||
|
backgroundColor: AppColor.toastSuccessBackgroundColor,
|
||||||
|
textColor: Colors.white,
|
||||||
|
textActionColor: Colors.white,
|
||||||
|
maxWidth: responsiveUtils.getMaxWidthToast(currentContext!));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void closeEmailView(BuildContext context) {
|
void closeEmailView(BuildContext context) {
|
||||||
mailboxDashBoardController.clearSelectedEmail();
|
mailboxDashBoardController.clearSelectedEmail();
|
||||||
|
_currentEmailId = null;
|
||||||
if (mailboxDashBoardController.searchController.isSearchEmailRunning) {
|
if (mailboxDashBoardController.searchController.isSearchEmailRunning) {
|
||||||
if (responsiveUtils.isWebDesktop(context)) {
|
if (responsiveUtils.isWebDesktop(context)) {
|
||||||
mailboxDashBoardController.dispatchRoute(AppRoutes.THREAD);
|
mailboxDashBoardController.dispatchRoute(AppRoutes.THREAD);
|
||||||
|
|||||||
@@ -0,0 +1,36 @@
|
|||||||
|
import 'package:get/get.dart';
|
||||||
|
import 'package:tmail_ui_user/features/base/interactors_bindings.dart';
|
||||||
|
import 'package:tmail_ui_user/features/email/data/datasource/mdn_datasource.dart';
|
||||||
|
import 'package:tmail_ui_user/features/email/data/datasource_impl/mdn_datasource_impl.dart';
|
||||||
|
import 'package:tmail_ui_user/features/email/data/network/mdn_api.dart';
|
||||||
|
import 'package:tmail_ui_user/features/email/data/repository/mdn_repository_impl.dart';
|
||||||
|
import 'package:tmail_ui_user/features/email/domain/repository/mdn_repository.dart';
|
||||||
|
import 'package:tmail_ui_user/features/email/domain/usecases/send_receipt_to_sender_interactor.dart';
|
||||||
|
|
||||||
|
class MdnInteractorBindings extends InteractorsBindings {
|
||||||
|
|
||||||
|
@override
|
||||||
|
void bindingsDataSource() {
|
||||||
|
Get.lazyPut<MdnDataSource>(() => Get.find<MdnDataSourceImpl>());
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void bindingsDataSourceImpl() {
|
||||||
|
Get.lazyPut(() => MdnDataSourceImpl(Get.find<MdnAPI>()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void bindingsInteractor() {
|
||||||
|
Get.lazyPut(() => SendReceiptToSenderInteractor(Get.find<MdnRepository>()));
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void bindingsRepository() {
|
||||||
|
Get.lazyPut<MdnRepository>(() => Get.find<MdnRepositoryImpl>());
|
||||||
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
void bindingsRepositoryImpl() {
|
||||||
|
Get.lazyPut(() => MdnRepositoryImpl(Get.find<MdnDataSource>()));
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"@@last_modified": "2022-10-19T15:56:55.354560",
|
"@@last_modified": "2022-10-21T10:04:34.240729",
|
||||||
"initializing_data": "Initializing data...",
|
"initializing_data": "Initializing data...",
|
||||||
"@initializing_data": {
|
"@initializing_data": {
|
||||||
"type": "text",
|
"type": "text",
|
||||||
@@ -2325,5 +2325,53 @@
|
|||||||
"type": "text",
|
"type": "text",
|
||||||
"placeholders_order": [],
|
"placeholders_order": [],
|
||||||
"placeholders": {}
|
"placeholders": {}
|
||||||
|
},
|
||||||
|
"toastMessageNotSupportMdnWhenSendReceipt": "Your account does not support the MDN capability",
|
||||||
|
"@toastMessageNotSupportMdnWhenSendReceipt": {
|
||||||
|
"type": "text",
|
||||||
|
"placeholders_order": [],
|
||||||
|
"placeholders": {}
|
||||||
|
},
|
||||||
|
"toastMessageCannotFoundIdentityWhenSendReceipt": "Identity id given cannot be found",
|
||||||
|
"@toastMessageCannotFoundIdentityWhenSendReceipt": {
|
||||||
|
"type": "text",
|
||||||
|
"placeholders_order": [],
|
||||||
|
"placeholders": {}
|
||||||
|
},
|
||||||
|
"toastMessageCannotFoundEmailIdWhenSendReceipt": "Email id given cannot be found",
|
||||||
|
"@toastMessageCannotFoundEmailIdWhenSendReceipt": {
|
||||||
|
"type": "text",
|
||||||
|
"placeholders_order": [],
|
||||||
|
"placeholders": {}
|
||||||
|
},
|
||||||
|
"subjectSendReceiptToSender": "Read: {subject}",
|
||||||
|
"@subjectSendReceiptToSender": {
|
||||||
|
"type": "text",
|
||||||
|
"placeholders_order": [
|
||||||
|
"subject"
|
||||||
|
],
|
||||||
|
"placeholders": {
|
||||||
|
"subject": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"textBodySendReceiptToSender": "Message was read by {sender} on {time} \n\nSubject: {subject} \n\nNote: This Return ReceiptReceipt only acknowledges that the message was displayed on the recipient's computer. There is no guarantee that the recipient has read or understood the message contents.",
|
||||||
|
"@textBodySendReceiptToSender": {
|
||||||
|
"type": "text",
|
||||||
|
"placeholders_order": [
|
||||||
|
"sender",
|
||||||
|
"subject",
|
||||||
|
"time"
|
||||||
|
],
|
||||||
|
"placeholders": {
|
||||||
|
"sender": {},
|
||||||
|
"subject": {},
|
||||||
|
"time": {}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"toastMessageSendReceiptSuccess": "A read receipt has been sent.",
|
||||||
|
"@toastMessageSendReceiptSuccess": {
|
||||||
|
"type": "text",
|
||||||
|
"placeholders_order": [],
|
||||||
|
"placeholders": {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -9,6 +9,7 @@ import 'package:flutter_appauth/flutter_appauth.dart';
|
|||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
import 'package:jmap_dart_client/http/http_client.dart' as JmapHttpClient;
|
import 'package:jmap_dart_client/http/http_client.dart' as JmapHttpClient;
|
||||||
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/network/mdn_api.dart';
|
||||||
import 'package:tmail_ui_user/features/login/data/local/account_cache_manager.dart';
|
import 'package:tmail_ui_user/features/login/data/local/account_cache_manager.dart';
|
||||||
import 'package:tmail_ui_user/features/login/data/local/token_oidc_cache_manager.dart';
|
import 'package:tmail_ui_user/features/login/data/local/token_oidc_cache_manager.dart';
|
||||||
import 'package:tmail_ui_user/features/login/data/network/authentication_client/authentication_client_base.dart';
|
import 'package:tmail_ui_user/features/login/data/network/authentication_client/authentication_client_base.dart';
|
||||||
@@ -81,6 +82,7 @@ class NetworkBindings extends Bindings {
|
|||||||
Get.put(VacationAPI(Get.find<JmapHttpClient.HttpClient>()));
|
Get.put(VacationAPI(Get.find<JmapHttpClient.HttpClient>()));
|
||||||
Get.put(ContactAPI(Get.find<JmapHttpClient.HttpClient>()));
|
Get.put(ContactAPI(Get.find<JmapHttpClient.HttpClient>()));
|
||||||
Get.put(IdentityAPI(Get.find<JmapHttpClient.HttpClient>()));
|
Get.put(IdentityAPI(Get.find<JmapHttpClient.HttpClient>()));
|
||||||
|
Get.put(MdnAPI(Get.find<JmapHttpClient.HttpClient>()));
|
||||||
}
|
}
|
||||||
|
|
||||||
void _bindingConnection() {
|
void _bindingConnection() {
|
||||||
|
|||||||
@@ -2409,4 +2409,42 @@ class AppLocalizations {
|
|||||||
'No',
|
'No',
|
||||||
name: 'no');
|
name: 'no');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String get toastMessageNotSupportMdnWhenSendReceipt {
|
||||||
|
return Intl.message(
|
||||||
|
'Your account does not support the MDN capability',
|
||||||
|
name: 'toastMessageNotSupportMdnWhenSendReceipt');
|
||||||
|
}
|
||||||
|
|
||||||
|
String get toastMessageCannotFoundIdentityWhenSendReceipt {
|
||||||
|
return Intl.message(
|
||||||
|
'Identity id given cannot be found',
|
||||||
|
name: 'toastMessageCannotFoundIdentityWhenSendReceipt');
|
||||||
|
}
|
||||||
|
|
||||||
|
String get toastMessageCannotFoundEmailIdWhenSendReceipt {
|
||||||
|
return Intl.message(
|
||||||
|
'Email id given cannot be found',
|
||||||
|
name: 'toastMessageCannotFoundEmailIdWhenSendReceipt');
|
||||||
|
}
|
||||||
|
|
||||||
|
String subjectSendReceiptToSender(String subject) {
|
||||||
|
return Intl.message(
|
||||||
|
'Read: $subject',
|
||||||
|
name: 'subjectSendReceiptToSender',
|
||||||
|
args: [subject]);
|
||||||
|
}
|
||||||
|
|
||||||
|
String textBodySendReceiptToSender(String sender, String subject, String time) {
|
||||||
|
return Intl.message(
|
||||||
|
'Message was read by $sender on $time \n\nSubject: $subject \n\nNote: This Return ReceiptReceipt only acknowledges that the message was displayed on the recipient\'s computer. There is no guarantee that the recipient has read or understood the message contents.',
|
||||||
|
name: 'textBodySendReceiptToSender',
|
||||||
|
args: [sender, subject, time]);
|
||||||
|
}
|
||||||
|
|
||||||
|
String get toastMessageSendReceiptSuccess {
|
||||||
|
return Intl.message(
|
||||||
|
'A read receipt has been sent.',
|
||||||
|
name: 'toastMessageSendReceiptSuccess');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -17,8 +17,11 @@ extension EmailExtension on Email {
|
|||||||
|
|
||||||
bool get withAttachments => hasAttachment == true;
|
bool get withAttachments => hasAttachment == true;
|
||||||
|
|
||||||
bool get needShowNotificationMessageReadReceipt {
|
bool hasReadReceipt(Map<MailboxId, PresentationMailbox> mapMailbox) {
|
||||||
return !hasMdnSent && headers.readReceiptHasBeenRequested;
|
final mailboxCurrent = findMailboxContain(mapMailbox);
|
||||||
|
return !hasMdnSent &&
|
||||||
|
headers.readReceiptHasBeenRequested &&
|
||||||
|
mailboxCurrent?.isSent == false;
|
||||||
}
|
}
|
||||||
|
|
||||||
Set<String> getRecipientEmailAddressList() {
|
Set<String> getRecipientEmailAddressList() {
|
||||||
@@ -119,4 +122,17 @@ extension EmailExtension on Email {
|
|||||||
}
|
}
|
||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
|
|
||||||
|
PresentationMailbox? findMailboxContain(Map<MailboxId, PresentationMailbox> mapMailbox) {
|
||||||
|
final newMailboxIds = mailboxIds;
|
||||||
|
newMailboxIds?.removeWhere((key, value) => !value);
|
||||||
|
|
||||||
|
if (newMailboxIds?.isNotEmpty == true) {
|
||||||
|
final firstMailboxId = newMailboxIds!.keys.first;
|
||||||
|
if (mapMailbox.containsKey(firstMailboxId)) {
|
||||||
|
return mapMailbox[firstMailboxId];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user