TF-1865: Update UI and replace task in workmanager when update sending email
(cherry picked from commit 15168421c994c5f928873e0794bcbf0c36b015c9)
This commit is contained in:
@@ -1,3 +1,4 @@
|
|||||||
|
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
|
||||||
import 'package:model/extensions/email_extension.dart';
|
import 'package:model/extensions/email_extension.dart';
|
||||||
import 'package:model/extensions/email_id_extensions.dart';
|
import 'package:model/extensions/email_id_extensions.dart';
|
||||||
import 'package:model/extensions/identity_id_extension.dart';
|
import 'package:model/extensions/identity_id_extension.dart';
|
||||||
@@ -23,9 +24,9 @@ extension SendingEmailExtension on SendingEmail {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
EmailRequest toEmailRequest() {
|
EmailRequest toEmailRequest({Email? emailEdit}) {
|
||||||
return EmailRequest(
|
return EmailRequest(
|
||||||
email: email,
|
email: emailEdit ?? email,
|
||||||
emailActionType: emailActionType,
|
emailActionType: emailActionType,
|
||||||
sentMailboxId: sentMailboxId,
|
sentMailboxId: sentMailboxId,
|
||||||
emailIdDestroyed: emailIdDestroyed,
|
emailIdDestroyed: emailIdDestroyed,
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ class SendingEmail with EquatableMixin {
|
|||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
|
|
||||||
PresentationEmail get presentationEmail => email.toPresentationEmail();
|
PresentationEmail get presentationEmail => email.sendingEmailToPresentationEmail();
|
||||||
|
|
||||||
String getCreateTimeAt(String newLocale) {
|
String getCreateTimeAt(String newLocale) {
|
||||||
return DateFormat(createTime.toPattern(), newLocale).format(createTime);
|
return DateFormat(createTime.toPattern(), newLocale).format(createTime);
|
||||||
|
|||||||
@@ -33,6 +33,7 @@ import 'package:receive_sharing_intent/receive_sharing_intent.dart';
|
|||||||
import 'package:rich_text_composer/rich_text_composer.dart';
|
import 'package:rich_text_composer/rich_text_composer.dart';
|
||||||
import 'package:super_tag_editor/tag_editor.dart';
|
import 'package:super_tag_editor/tag_editor.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/composer/domain/extensions/sending_email_extension.dart';
|
||||||
import 'package:tmail_ui_user/features/composer/domain/model/contact_suggestion_source.dart';
|
import 'package:tmail_ui_user/features/composer/domain/model/contact_suggestion_source.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/composer/domain/state/download_image_as_base64_state.dart';
|
import 'package:tmail_ui_user/features/composer/domain/state/download_image_as_base64_state.dart';
|
||||||
@@ -235,9 +236,7 @@ class ComposerController extends BaseController {
|
|||||||
@override
|
@override
|
||||||
void onReady() async {
|
void onReady() async {
|
||||||
_initEmail();
|
_initEmail();
|
||||||
if (isNetworkConnectionAvailable) {
|
_getAllIdentities();
|
||||||
_getAllIdentities();
|
|
||||||
}
|
|
||||||
if (!BuildUtils.isWeb) {
|
if (!BuildUtils.isWeb) {
|
||||||
Future.delayed(const Duration(milliseconds: 500), () =>
|
Future.delayed(const Duration(milliseconds: 500), () =>
|
||||||
_checkContactPermission());
|
_checkContactPermission());
|
||||||
@@ -616,7 +615,8 @@ class ComposerController extends BaseController {
|
|||||||
{
|
{
|
||||||
bool asDrafts = false,
|
bool asDrafts = false,
|
||||||
MailboxId? draftMailboxId,
|
MailboxId? draftMailboxId,
|
||||||
MailboxId? outboxMailboxId
|
MailboxId? outboxMailboxId,
|
||||||
|
ComposerArguments? arguments
|
||||||
}
|
}
|
||||||
) async {
|
) async {
|
||||||
Set<EmailAddress> listFromEmailAddress = {EmailAddress(null, userProfile.email)};
|
Set<EmailAddress> listFromEmailAddress = {EmailAddress(null, userProfile.email)};
|
||||||
@@ -663,7 +663,10 @@ class ComposerController extends BaseController {
|
|||||||
|
|
||||||
final generatePartId = PartId(_uuid.v1());
|
final generatePartId = PartId(_uuid.v1());
|
||||||
|
|
||||||
|
final isUpdateSendingEmail = arguments?.sendingEmail != null;
|
||||||
|
|
||||||
return Email(
|
return Email(
|
||||||
|
id: isUpdateSendingEmail ? EmailId(Id(arguments!.sendingEmail!.sendingId)) : null,
|
||||||
mailboxIds: mailboxIds.isNotEmpty ? mailboxIds : null,
|
mailboxIds: mailboxIds.isNotEmpty ? mailboxIds : null,
|
||||||
from: listFromEmailAddress,
|
from: listFromEmailAddress,
|
||||||
to: listToEmailAddress.toSet(),
|
to: listToEmailAddress.toSet(),
|
||||||
@@ -801,17 +804,19 @@ class ComposerController extends BaseController {
|
|||||||
final userProfile = mailboxDashBoardController.userProfile.value;
|
final userProfile = mailboxDashBoardController.userProfile.value;
|
||||||
|
|
||||||
if (arguments != null && accountId != null && userProfile != null && session != null) {
|
if (arguments != null && accountId != null && userProfile != null && session != null) {
|
||||||
final email = await _generateEmail(context, userProfile, outboxMailboxId: outboxMailboxId);
|
final email = await _generateEmail(context, userProfile, outboxMailboxId: outboxMailboxId, arguments: arguments);
|
||||||
final emailRequest = EmailRequest(
|
final emailRequest = arguments.sendingEmail != null
|
||||||
email: email,
|
? arguments.sendingEmail!.toEmailRequest(emailEdit: email)
|
||||||
sentMailboxId: sentMailboxId,
|
: EmailRequest(
|
||||||
identityId: identitySelected.value?.id,
|
email: email,
|
||||||
emailIdDestroyed: arguments.emailActionType == EmailActionType.edit
|
sentMailboxId: sentMailboxId,
|
||||||
? arguments.presentationEmail?.id
|
identityId: identitySelected.value?.id,
|
||||||
: null,
|
emailIdDestroyed: arguments.emailActionType == EmailActionType.edit
|
||||||
emailIdAnsweredOrForwarded: arguments.presentationEmail?.id,
|
? arguments.presentationEmail?.id
|
||||||
emailActionType: arguments.emailActionType
|
: null,
|
||||||
);
|
emailIdAnsweredOrForwarded: arguments.presentationEmail?.id,
|
||||||
|
emailActionType: arguments.emailActionType
|
||||||
|
);
|
||||||
final mailboxRequest = outboxMailboxId == null
|
final mailboxRequest = outboxMailboxId == null
|
||||||
? CreateNewMailboxRequest(Id(_uuid.v1()), PresentationMailbox.outboxMailboxName)
|
? CreateNewMailboxRequest(Id(_uuid.v1()), PresentationMailbox.outboxMailboxName)
|
||||||
: null;
|
: null;
|
||||||
@@ -820,7 +825,8 @@ class ComposerController extends BaseController {
|
|||||||
session,
|
session,
|
||||||
accountId,
|
accountId,
|
||||||
emailRequest,
|
emailRequest,
|
||||||
mailboxRequest
|
mailboxRequest,
|
||||||
|
isUpdateSendingEmail: arguments.sendingEmail != null,
|
||||||
);
|
);
|
||||||
uploadController.clearInlineFileUploaded();
|
uploadController.clearInlineFileUploaded();
|
||||||
|
|
||||||
@@ -1127,7 +1133,7 @@ class ComposerController extends BaseController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (arguments.emailContents != null && arguments.emailContents!.isNotEmpty) {
|
if (arguments.emailContents != null && arguments.emailContents!.isNotEmpty && arguments.sendingEmail != null) {
|
||||||
_emailContents = arguments.emailContents;
|
_emailContents = arguments.emailContents;
|
||||||
emailContentsViewState.value = Right(GetEmailContentSuccess(_emailContents!, [], [], arguments.presentationEmail?.toEmail()));
|
emailContentsViewState.value = Right(GetEmailContentSuccess(_emailContents!, [], [], arguments.presentationEmail?.toEmail()));
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
@@ -9,9 +9,18 @@ class SendingEmailArguments extends RouterArguments {
|
|||||||
final AccountId accountId;
|
final AccountId accountId;
|
||||||
final EmailRequest emailRequest;
|
final EmailRequest emailRequest;
|
||||||
final CreateNewMailboxRequest? mailboxRequest;
|
final CreateNewMailboxRequest? mailboxRequest;
|
||||||
|
final bool? isUpdateSendingEmail;
|
||||||
|
|
||||||
SendingEmailArguments(this.session, this.accountId, this.emailRequest, this.mailboxRequest);
|
SendingEmailArguments(
|
||||||
|
this.session,
|
||||||
|
this.accountId,
|
||||||
|
this.emailRequest,
|
||||||
|
this.mailboxRequest,
|
||||||
|
{
|
||||||
|
this.isUpdateSendingEmail
|
||||||
|
}
|
||||||
|
);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
List<Object?> get props => [session, accountId, emailRequest, mailboxRequest];
|
List<Object?> get props => [session, accountId, emailRequest, mailboxRequest, isUpdateSendingEmail];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -2,6 +2,7 @@ import 'package:jmap_dart_client/jmap/mail/email/email_address.dart';
|
|||||||
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
||||||
import 'package:model/model.dart';
|
import 'package:model/model.dart';
|
||||||
import 'package:receive_sharing_intent/receive_sharing_intent.dart';
|
import 'package:receive_sharing_intent/receive_sharing_intent.dart';
|
||||||
|
import 'package:tmail_ui_user/features/composer/domain/model/sending_email.dart';
|
||||||
import 'package:tmail_ui_user/main/routes/router_arguments.dart';
|
import 'package:tmail_ui_user/main/routes/router_arguments.dart';
|
||||||
|
|
||||||
class ComposerArguments extends RouterArguments {
|
class ComposerArguments extends RouterArguments {
|
||||||
@@ -12,6 +13,7 @@ class ComposerArguments extends RouterArguments {
|
|||||||
final EmailAddress? emailAddress;
|
final EmailAddress? emailAddress;
|
||||||
final List<Attachment>? attachments;
|
final List<Attachment>? attachments;
|
||||||
final Role? mailboxRole;
|
final Role? mailboxRole;
|
||||||
|
final SendingEmail? sendingEmail;
|
||||||
|
|
||||||
ComposerArguments({
|
ComposerArguments({
|
||||||
this.emailActionType = EmailActionType.compose,
|
this.emailActionType = EmailActionType.compose,
|
||||||
@@ -21,6 +23,7 @@ class ComposerArguments extends RouterArguments {
|
|||||||
this.mailboxRole,
|
this.mailboxRole,
|
||||||
this.emailAddress,
|
this.emailAddress,
|
||||||
this.listSharedMediaFile,
|
this.listSharedMediaFile,
|
||||||
|
this.sendingEmail
|
||||||
});
|
});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -32,5 +35,6 @@ class ComposerArguments extends RouterArguments {
|
|||||||
mailboxRole,
|
mailboxRole,
|
||||||
emailAddress,
|
emailAddress,
|
||||||
listSharedMediaFile,
|
listSharedMediaFile,
|
||||||
|
sendingEmail
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
+105
-58
@@ -1196,7 +1196,8 @@ class MailboxDashBoardController extends ReloadableController {
|
|||||||
result.session,
|
result.session,
|
||||||
result.accountId,
|
result.accountId,
|
||||||
result.emailRequest,
|
result.emailRequest,
|
||||||
result.mailboxRequest
|
result.mailboxRequest,
|
||||||
|
isUpdateSendingEmail: result.isUpdateSendingEmail
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1317,7 +1318,8 @@ class MailboxDashBoardController extends ReloadableController {
|
|||||||
result.session,
|
result.session,
|
||||||
result.accountId,
|
result.accountId,
|
||||||
result.emailRequest,
|
result.emailRequest,
|
||||||
result.mailboxRequest
|
result.mailboxRequest,
|
||||||
|
isUpdateSendingEmail: result.isUpdateSendingEmail ?? false,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1750,7 +1752,8 @@ class MailboxDashBoardController extends ReloadableController {
|
|||||||
Session session,
|
Session session,
|
||||||
AccountId accountId,
|
AccountId accountId,
|
||||||
EmailRequest emailRequest,
|
EmailRequest emailRequest,
|
||||||
CreateNewMailboxRequest? mailboxRequest
|
CreateNewMailboxRequest? mailboxRequest,
|
||||||
|
{bool? isUpdateSendingEmail = false}
|
||||||
) {
|
) {
|
||||||
if (PlatformInfo.isMobile) {
|
if (PlatformInfo.isMobile) {
|
||||||
if (networkConnectionController.isNetworkConnectionAvailable()) {
|
if (networkConnectionController.isNetworkConnectionAvailable()) {
|
||||||
@@ -1761,48 +1764,10 @@ class MailboxDashBoardController extends ReloadableController {
|
|||||||
mailboxRequest: mailboxRequest
|
mailboxRequest: mailboxRequest
|
||||||
));
|
));
|
||||||
} else {
|
} else {
|
||||||
if (currentContext != null) {
|
if (currentContext != null && isUpdateSendingEmail == false) {
|
||||||
showConfirmDialogAction(
|
_showActionSendingEmail(session, accountId, emailRequest, mailboxRequest);
|
||||||
currentContext!,
|
} else {
|
||||||
'',
|
_handleStoreSendingEmail(session, accountId, emailRequest, mailboxRequest, isUpdateSendingEmail: isUpdateSendingEmail);
|
||||||
AppLocalizations.of(currentContext!).proceed,
|
|
||||||
onConfirmAction: () {
|
|
||||||
final sendingEmail = emailRequest.toSendingEmail(
|
|
||||||
_uuid.v1(),
|
|
||||||
mailboxRequest: mailboxRequest
|
|
||||||
);
|
|
||||||
_storeSendingEmail(accountId, session.username, sendingEmail);
|
|
||||||
},
|
|
||||||
title: AppLocalizations.of(currentContext!).youAreInOfflineMode,
|
|
||||||
icon: SvgPicture.asset(_imagePaths.icDialogOfflineMode),
|
|
||||||
alignCenter: true,
|
|
||||||
messageStyle: const TextStyle(
|
|
||||||
color: AppColor.colorTitleSendingItem,
|
|
||||||
fontSize: 15,
|
|
||||||
fontWeight: FontWeight.normal
|
|
||||||
),
|
|
||||||
listTextSpan: [
|
|
||||||
TextSpan(text: AppLocalizations.of(currentContext!).messageDialogWhenStoreSendingEmailFirst),
|
|
||||||
TextSpan(
|
|
||||||
text: AppLocalizations.of(currentContext!).messageDialogWhenStoreSendingEmailSecond,
|
|
||||||
style: const TextStyle(
|
|
||||||
color: AppColor.colorTitleSendingItem,
|
|
||||||
fontSize: 15,
|
|
||||||
fontWeight: FontWeight.w600
|
|
||||||
),
|
|
||||||
),
|
|
||||||
TextSpan(text: AppLocalizations.of(currentContext!).messageDialogWhenStoreSendingEmailThird),
|
|
||||||
TextSpan(
|
|
||||||
text: AppLocalizations.of(currentContext!).sendingQueue,
|
|
||||||
style: const TextStyle(
|
|
||||||
color: AppColor.colorTitleSendingItem,
|
|
||||||
fontSize: 15,
|
|
||||||
fontWeight: FontWeight.w600
|
|
||||||
),
|
|
||||||
),
|
|
||||||
TextSpan(text: AppLocalizations.of(currentContext!).messageDialogWhenStoreSendingEmailTail)
|
|
||||||
]
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@@ -1815,22 +1780,104 @@ class MailboxDashBoardController extends ReloadableController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void _storeSendingEmail(AccountId accountId, UserName userName, SendingEmail sendingEmail) {
|
void _handleStoreSendingEmail(
|
||||||
log('MailboxDashBoardController::_storeSendingEmail():sendingEmail: $sendingEmail');
|
Session session,
|
||||||
consumeState(_storeSendingEmailInteractor.execute(accountId, userName, sendingEmail));
|
AccountId accountId,
|
||||||
|
EmailRequest emailRequest,
|
||||||
|
CreateNewMailboxRequest? mailboxRequest,
|
||||||
|
{bool? isUpdateSendingEmail = false}
|
||||||
|
) {
|
||||||
|
final currentEmailId = emailRequest.email.id?.id.value;
|
||||||
|
final sendingEmail = emailRequest.toSendingEmail(
|
||||||
|
emailRequest.email.id != null ? currentEmailId! : _uuid.v1(),
|
||||||
|
mailboxRequest: mailboxRequest
|
||||||
|
);
|
||||||
|
_storeSendingEmail(accountId, session.username, sendingEmail, isUpdateSendingEmail: isUpdateSendingEmail);
|
||||||
}
|
}
|
||||||
|
|
||||||
void _handleStoreSendingEmailSuccess(StoreSendingEmailSuccess success) {
|
void _showActionSendingEmail(
|
||||||
if (currentOverlayContext != null && currentContext != null) {
|
Session session,
|
||||||
_appToast.showToastSuccessMessage(
|
AccountId accountId,
|
||||||
currentOverlayContext!,
|
EmailRequest emailRequest,
|
||||||
AppLocalizations.of(currentContext!).messageHasBeenSavedToTheSendingQueue,
|
CreateNewMailboxRequest? mailboxRequest
|
||||||
leadingSVGIconColor: Colors.white,
|
) {
|
||||||
leadingSVGIcon: _imagePaths.icEmail);
|
showConfirmDialogAction(
|
||||||
}
|
currentContext!,
|
||||||
|
'',
|
||||||
|
AppLocalizations.of(currentContext!).proceed,
|
||||||
|
onConfirmAction: () {
|
||||||
|
_handleStoreSendingEmail(session, accountId, emailRequest, mailboxRequest);
|
||||||
|
},
|
||||||
|
title: AppLocalizations.of(currentContext!).youAreInOfflineMode,
|
||||||
|
icon: SvgPicture.asset(_imagePaths.icDialogOfflineMode),
|
||||||
|
alignCenter: true,
|
||||||
|
messageStyle: const TextStyle(
|
||||||
|
color: AppColor.colorTitleSendingItem,
|
||||||
|
fontSize: 15,
|
||||||
|
fontWeight: FontWeight.normal
|
||||||
|
),
|
||||||
|
listTextSpan: [
|
||||||
|
TextSpan(text: AppLocalizations.of(currentContext!).messageDialogWhenStoreSendingEmailFirst),
|
||||||
|
TextSpan(
|
||||||
|
text: AppLocalizations.of(currentContext!).messageDialogWhenStoreSendingEmailSecond,
|
||||||
|
style: const TextStyle(
|
||||||
|
color: AppColor.colorTitleSendingItem,
|
||||||
|
fontSize: 15,
|
||||||
|
fontWeight: FontWeight.w600
|
||||||
|
),
|
||||||
|
),
|
||||||
|
TextSpan(text: AppLocalizations.of(currentContext!).messageDialogWhenStoreSendingEmailThird),
|
||||||
|
TextSpan(
|
||||||
|
text: AppLocalizations.of(currentContext!).sendingQueue,
|
||||||
|
style: const TextStyle(
|
||||||
|
color: AppColor.colorTitleSendingItem,
|
||||||
|
fontSize: 15,
|
||||||
|
fontWeight: FontWeight.w600
|
||||||
|
),
|
||||||
|
),
|
||||||
|
TextSpan(text: AppLocalizations.of(currentContext!).messageDialogWhenStoreSendingEmailTail)
|
||||||
|
]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
_addSendingEmailToSendingQueue(success.sendingEmail);
|
void _storeSendingEmail(
|
||||||
getAllSendingEmails();
|
AccountId accountId,
|
||||||
|
UserName userName,
|
||||||
|
SendingEmail sendingEmail,
|
||||||
|
{bool? isUpdateSendingEmail}
|
||||||
|
) {
|
||||||
|
log('MailboxDashBoardController::_storeSendingEmail():sendingEmail: $sendingEmail');
|
||||||
|
consumeState(_storeSendingEmailInteractor.execute(
|
||||||
|
accountId,
|
||||||
|
userName,
|
||||||
|
sendingEmail,
|
||||||
|
isUpdateSendingEmail ?? false));
|
||||||
|
}
|
||||||
|
|
||||||
|
void _handleStoreSendingEmailSuccess(StoreSendingEmailSuccess success) async {
|
||||||
|
if (success.isUpdateSendingEmail) {
|
||||||
|
_cancelSendingEmailToSendingQueue(success.sendingEmail);
|
||||||
|
_addSendingEmailToSendingQueue(success.sendingEmail);
|
||||||
|
getAllSendingEmails();
|
||||||
|
} else {
|
||||||
|
_addSendingEmailToSendingQueue(success.sendingEmail);
|
||||||
|
getAllSendingEmails();
|
||||||
|
if (currentOverlayContext != null && currentContext != null) {
|
||||||
|
_appToast.showToastSuccessMessage(
|
||||||
|
currentOverlayContext!,
|
||||||
|
AppLocalizations.of(currentContext!).messageHasBeenSavedToTheSendingQueue,
|
||||||
|
leadingSVGIconColor: Colors.white,
|
||||||
|
leadingSVGIcon: _imagePaths.icEmail);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void _cancelSendingEmailToSendingQueue(SendingEmail sendingEmail) async {
|
||||||
|
try {
|
||||||
|
await WorkSchedulerController().cancelByUniqueId(sendingEmail.sendingId);
|
||||||
|
} catch (e) {
|
||||||
|
logError('MailboxDashBoardController::_cancelSendingEmailToSendingQueue(): EXCEPTION: $e');
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void _addSendingEmailToSendingQueue(SendingEmail sendingEmail) async {
|
void _addSendingEmailToSendingQueue(SendingEmail sendingEmail) async {
|
||||||
|
|||||||
@@ -14,4 +14,6 @@ extension ListSendingEmailExtension on List<SendingEmail> {
|
|||||||
bool isAllSelected() => every((sendingEmail) => sendingEmail.isSelected);
|
bool isAllSelected() => every((sendingEmail) => sendingEmail.isSelected);
|
||||||
|
|
||||||
bool isAllUnSelected() => every((sendingEmail) => !sendingEmail.isSelected);
|
bool isAllUnSelected() => every((sendingEmail) => !sendingEmail.isSelected);
|
||||||
|
|
||||||
|
List<SendingEmail> listSelected() => where((sendingEmail) => sendingEmail.isSelected).toList();
|
||||||
}
|
}
|
||||||
@@ -9,6 +9,7 @@ import 'package:flutter/material.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:model/email/email_action_type.dart';
|
import 'package:model/email/email_action_type.dart';
|
||||||
|
import 'package:model/extensions/list_email_content_extension.dart';
|
||||||
import 'package:model/mailbox/select_mode.dart';
|
import 'package:model/mailbox/select_mode.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/base/mixin/message_dialog_action_mixin.dart';
|
import 'package:tmail_ui_user/features/base/mixin/message_dialog_action_mixin.dart';
|
||||||
@@ -35,6 +36,7 @@ class SendingQueueController extends BaseController with MessageDialogActionMixi
|
|||||||
final _appToast = getBinding<AppToast>();
|
final _appToast = getBinding<AppToast>();
|
||||||
|
|
||||||
final listSendingEmailController = ScrollController();
|
final listSendingEmailController = ScrollController();
|
||||||
|
final listSendingEmailSelected = <SendingEmail>[].obs;
|
||||||
|
|
||||||
final selectionState = Rx<SelectMode>(SelectMode.INACTIVE);
|
final selectionState = Rx<SelectMode>(SelectMode.INACTIVE);
|
||||||
|
|
||||||
@@ -69,6 +71,8 @@ class SendingQueueController extends BaseController with MessageDialogActionMixi
|
|||||||
selectionState.value = newListSendingEmail.isAllUnSelected()
|
selectionState.value = newListSendingEmail.isAllUnSelected()
|
||||||
? SelectMode.INACTIVE
|
? SelectMode.INACTIVE
|
||||||
: SelectMode.ACTIVE;
|
: SelectMode.ACTIVE;
|
||||||
|
|
||||||
|
listSendingEmailSelected.value = newListSendingEmail.listSelected();
|
||||||
}
|
}
|
||||||
|
|
||||||
void toggleSelectionSendingEmail(SendingEmail sendingEmail) {
|
void toggleSelectionSendingEmail(SendingEmail sendingEmail) {
|
||||||
@@ -78,6 +82,8 @@ class SendingQueueController extends BaseController with MessageDialogActionMixi
|
|||||||
selectionState.value = newListSendingEmail.isAllUnSelected()
|
selectionState.value = newListSendingEmail.isAllUnSelected()
|
||||||
? SelectMode.INACTIVE
|
? SelectMode.INACTIVE
|
||||||
: SelectMode.ACTIVE;
|
: SelectMode.ACTIVE;
|
||||||
|
|
||||||
|
listSendingEmailSelected.value = newListSendingEmail.listSelected();
|
||||||
}
|
}
|
||||||
|
|
||||||
bool get isAllUnSelected => dashboardController!.listSendingEmails.isAllUnSelected();
|
bool get isAllUnSelected => dashboardController!.listSendingEmails.isAllUnSelected();
|
||||||
@@ -178,7 +184,8 @@ class SendingQueueController extends BaseController with MessageDialogActionMixi
|
|||||||
emailActionType: EmailActionType.edit,
|
emailActionType: EmailActionType.edit,
|
||||||
presentationEmail: sendingEmail.presentationEmail,
|
presentationEmail: sendingEmail.presentationEmail,
|
||||||
mailboxRole: dashboardController?.selectedMailbox.value?.role,
|
mailboxRole: dashboardController?.selectedMailbox.value?.role,
|
||||||
emailContents: sendingEmail.email.subject,
|
emailContents: sendingEmail.presentationEmail.emailContentList.asHtmlString,
|
||||||
|
sendingEmail: sendingEmail
|
||||||
);
|
);
|
||||||
|
|
||||||
dashboardController?.goToComposer(arguments);
|
dashboardController?.goToComposer(arguments);
|
||||||
@@ -212,55 +219,4 @@ class SendingQueueController extends BaseController with MessageDialogActionMixi
|
|||||||
_sendingQueueIsolateManager?.release();
|
_sendingQueueIsolateManager?.release();
|
||||||
super.onClose();
|
super.onClose();
|
||||||
}
|
}
|
||||||
|
|
||||||
//
|
|
||||||
// void pressEmailAction(
|
|
||||||
// BuildContext context,
|
|
||||||
// EmailActionType actionType,
|
|
||||||
// PresentationEmail selectedEmail,
|
|
||||||
// {PresentationMailbox? mailboxContain}
|
|
||||||
// ) {
|
|
||||||
// switch(actionType) {
|
|
||||||
// case EmailActionType.edit:
|
|
||||||
// editEmail(selectedEmail);
|
|
||||||
// break;
|
|
||||||
// case EmailActionType.selection:
|
|
||||||
// selectEmail(context, selectedEmail);
|
|
||||||
// break;
|
|
||||||
// default:
|
|
||||||
// break;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// void pressEmailSelectionAction(
|
|
||||||
// BuildContext context,
|
|
||||||
// EmailActionType actionType,
|
|
||||||
// List<PresentationEmail> selectionEmail
|
|
||||||
// ) {
|
|
||||||
// switch(actionType) {
|
|
||||||
// case EmailActionType.edit:
|
|
||||||
// editEmail(selectionEmail.first);
|
|
||||||
// break;
|
|
||||||
// default:
|
|
||||||
// break;
|
|
||||||
// }
|
|
||||||
// }
|
|
||||||
|
|
||||||
// bool isSelectionEnabled() => currentSelectMode.value == SelectMode.ACTIVE;
|
|
||||||
//
|
|
||||||
// bool? _isUnSelectedAll() {
|
|
||||||
// return dashboardController?.sendingEmailsInCurrentMailbox.every((email) => email.selectMode == SelectMode.INACTIVE);
|
|
||||||
// }
|
|
||||||
//
|
|
||||||
// void cancelSelectEmail() {
|
|
||||||
// final newEmailList = dashboardController?.sendingEmailsInCurrentMailbox
|
|
||||||
// .map((email) => email.toSelectedEmail(selectMode: SelectMode.INACTIVE))
|
|
||||||
// .toList();
|
|
||||||
// updateEmailList(newEmailList);
|
|
||||||
// currentSelectMode.value = SelectMode.INACTIVE;
|
|
||||||
// listEmailSelected.clear();
|
|
||||||
// }
|
|
||||||
|
|
||||||
// List<PresentationEmail> get listEmailSelected => dashboardController?.sendingEmailsInCurrentMailbox.listEmailSelected ?? [];
|
|
||||||
|
|
||||||
}
|
}
|
||||||
@@ -22,12 +22,14 @@ class SendingQueueView extends GetWidget<SendingQueueController> with AppLoaderM
|
|||||||
body: SafeArea(
|
body: SafeArea(
|
||||||
child: Column(
|
child: Column(
|
||||||
children: [
|
children: [
|
||||||
Obx(() => AppBarSendingQueueWidget(
|
Obx(() {
|
||||||
listSendingEmails: controller.dashboardController!.listSendingEmails,
|
return AppBarSendingQueueWidget(
|
||||||
onOpenMailboxMenu: controller.openMailboxMenu,
|
listSendingEmails: controller.listSendingEmailSelected,
|
||||||
onBackAction: controller.disableSelectionMode,
|
onOpenMailboxMenu: controller.openMailboxMenu,
|
||||||
selectMode: controller.selectionState.value,
|
onBackAction: controller.disableSelectionMode,
|
||||||
)),
|
selectMode: controller.selectionState.value,
|
||||||
|
);
|
||||||
|
}),
|
||||||
const Divider(color: AppColor.colorDividerComposer, height: 1),
|
const Divider(color: AppColor.colorDividerComposer, height: 1),
|
||||||
const BannerMessageSendingQueueWidget(),
|
const BannerMessageSendingQueueWidget(),
|
||||||
Expanded(child: _buildListSendingEmails(context)),
|
Expanded(child: _buildListSendingEmails(context)),
|
||||||
@@ -36,7 +38,7 @@ class SendingQueueView extends GetWidget<SendingQueueController> with AppLoaderM
|
|||||||
return const SizedBox.shrink();
|
return const SizedBox.shrink();
|
||||||
} else {
|
} else {
|
||||||
return BottomBarSendingQueueWidget(
|
return BottomBarSendingQueueWidget(
|
||||||
listSendingEmails: controller.dashboardController!.listSendingEmails,
|
listSendingEmails: controller.listSendingEmailSelected,
|
||||||
onHandleSendingEmailActionType: (actionType, listSendingEmails) => controller.handleSendingEmailActionType(context, actionType, listSendingEmails),
|
onHandleSendingEmailActionType: (actionType, listSendingEmails) => controller.handleSendingEmailActionType(context, actionType, listSendingEmails),
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
@@ -60,8 +62,9 @@ class SendingQueueView extends GetWidget<SendingQueueController> with AppLoaderM
|
|||||||
sendingEmail: controller.dashboardController!.listSendingEmails[index],
|
sendingEmail: controller.dashboardController!.listSendingEmails[index],
|
||||||
selectMode: controller.selectionState.value,
|
selectMode: controller.selectionState.value,
|
||||||
onLongPressAction: controller.handleOnLongPressAction,
|
onLongPressAction: controller.handleOnLongPressAction,
|
||||||
onSelectAction: controller.toggleSelectionSendingEmail,
|
onSelectLeadingAction: controller.toggleSelectionSendingEmail,
|
||||||
));
|
onTapAction: (actionType, listSendingEmails) =>
|
||||||
|
controller.handleSendingEmailActionType(context, actionType, [listSendingEmails])));
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
} else {
|
} else {
|
||||||
|
|||||||
+11
-9
@@ -5,6 +5,7 @@ import 'package:core/presentation/views/button/button_builder.dart';
|
|||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:get/get.dart';
|
import 'package:get/get.dart';
|
||||||
import 'package:tmail_ui_user/features/composer/domain/model/sending_email.dart';
|
import 'package:tmail_ui_user/features/composer/domain/model/sending_email.dart';
|
||||||
|
import 'package:tmail_ui_user/features/sending_queue/presentation/extensions/list_sending_email_extension.dart';
|
||||||
import 'package:tmail_ui_user/features/sending_queue/presentation/model/sending_email_action_type.dart';
|
import 'package:tmail_ui_user/features/sending_queue/presentation/model/sending_email_action_type.dart';
|
||||||
|
|
||||||
typedef OnHandleSendingEmailActionType = void Function(SendingEmailActionType, List<SendingEmail>);
|
typedef OnHandleSendingEmailActionType = void Function(SendingEmailActionType, List<SendingEmail>);
|
||||||
@@ -35,15 +36,16 @@ class BottomBarSendingQueueWidget extends StatelessWidget {
|
|||||||
child: Row(
|
child: Row(
|
||||||
mainAxisAlignment: MainAxisAlignment.center,
|
mainAxisAlignment: MainAxisAlignment.center,
|
||||||
children: [
|
children: [
|
||||||
Expanded(child: (ButtonBuilder(imagePaths.icEdit)
|
if (!listSendingEmails.isAllSelected() || listSendingEmails.length < 2)
|
||||||
..key(Key(SendingEmailActionType.edit.getButtonKey()))
|
Expanded(child: (ButtonBuilder(imagePaths.icEdit)
|
||||||
..iconColor(SendingEmailActionType.edit.getButtonIconColor())
|
..key(Key(SendingEmailActionType.edit.getButtonKey()))
|
||||||
..padding(const EdgeInsets.all(8))
|
..iconColor(SendingEmailActionType.edit.getButtonIconColor())
|
||||||
..radiusSplash(8)
|
..padding(const EdgeInsets.all(8))
|
||||||
..textStyle(TextStyle(fontSize: 12, color: SendingEmailActionType.edit.getButtonTitleColor()))
|
..radiusSplash(8)
|
||||||
..onPressActionClick(() => onHandleSendingEmailActionType?.call(SendingEmailActionType.edit, listSendingEmails))
|
..textStyle(TextStyle(fontSize: 12, color: SendingEmailActionType.edit.getButtonTitleColor()))
|
||||||
..text(SendingEmailActionType.edit.getButtonTitle(context), isVertical: true)
|
..onPressActionClick(() => onHandleSendingEmailActionType?.call(SendingEmailActionType.edit, listSendingEmails))
|
||||||
).build()),
|
..text(SendingEmailActionType.edit.getButtonTitle(context), isVertical: true)
|
||||||
|
).build()),
|
||||||
Expanded(child: (ButtonBuilder(imagePaths.icDeleteComposer)
|
Expanded(child: (ButtonBuilder(imagePaths.icDeleteComposer)
|
||||||
..key(Key(SendingEmailActionType.delete.getButtonKey()))
|
..key(Key(SendingEmailActionType.delete.getButtonKey()))
|
||||||
..iconColor(SendingEmailActionType.delete.getButtonIconColor())
|
..iconColor(SendingEmailActionType.delete.getButtonIconColor())
|
||||||
|
|||||||
@@ -8,24 +8,27 @@ import 'package:get/get.dart';
|
|||||||
import 'package:model/extensions/presentation_email_extension.dart';
|
import 'package:model/extensions/presentation_email_extension.dart';
|
||||||
import 'package:model/mailbox/select_mode.dart';
|
import 'package:model/mailbox/select_mode.dart';
|
||||||
import 'package:tmail_ui_user/features/composer/domain/model/sending_email.dart';
|
import 'package:tmail_ui_user/features/composer/domain/model/sending_email.dart';
|
||||||
|
import 'package:tmail_ui_user/features/sending_queue/presentation/model/sending_email_action_type.dart';
|
||||||
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
||||||
|
|
||||||
typedef OnLongPressSendingEmailItemAction = void Function(SendingEmail);
|
typedef OnLongPressSendingEmailItemAction = void Function(SendingEmail);
|
||||||
typedef OnSelectSendingEmailItemAction = void Function(SendingEmail);
|
typedef OnSelectSendingEmailItemAction = void Function(SendingEmailActionType, SendingEmail);
|
||||||
|
typedef OnSelectLeadingSendingEmailItemAction = void Function(SendingEmail);
|
||||||
|
|
||||||
class SendingEmailTileWidget extends StatelessWidget {
|
class SendingEmailTileWidget extends StatelessWidget {
|
||||||
|
|
||||||
final SendingEmail sendingEmail;
|
final SendingEmail sendingEmail;
|
||||||
final SelectMode selectMode;
|
final SelectMode selectMode;
|
||||||
final OnLongPressSendingEmailItemAction? onLongPressAction;
|
final OnLongPressSendingEmailItemAction? onLongPressAction;
|
||||||
final OnSelectSendingEmailItemAction? onSelectAction;
|
final OnSelectSendingEmailItemAction? onTapAction;
|
||||||
|
final OnSelectLeadingSendingEmailItemAction? onSelectLeadingAction;
|
||||||
const SendingEmailTileWidget({
|
const SendingEmailTileWidget({
|
||||||
super.key,
|
super.key,
|
||||||
required this.sendingEmail,
|
required this.sendingEmail,
|
||||||
required this.selectMode,
|
required this.selectMode,
|
||||||
this.onLongPressAction,
|
this.onLongPressAction,
|
||||||
this.onSelectAction
|
this.onTapAction,
|
||||||
|
this.onSelectLeadingAction,
|
||||||
});
|
});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -35,7 +38,7 @@ class SendingEmailTileWidget extends StatelessWidget {
|
|||||||
return Material(
|
return Material(
|
||||||
color: Colors.transparent,
|
color: Colors.transparent,
|
||||||
child: InkWell(
|
child: InkWell(
|
||||||
onTap: () => {},
|
onTap: () => onTapAction?.call(SendingEmailActionType.edit ,sendingEmail),
|
||||||
onLongPress: () => onLongPressAction?.call(sendingEmail),
|
onLongPress: () => onLongPressAction?.call(sendingEmail),
|
||||||
child: Column(
|
child: Column(
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
@@ -63,7 +66,7 @@ class SendingEmailTileWidget extends StatelessWidget {
|
|||||||
height: 24
|
height: 24
|
||||||
),
|
),
|
||||||
),
|
),
|
||||||
onTap: () => onSelectAction?.call(sendingEmail),
|
onTap: () => onSelectLeadingAction?.call(sendingEmail),
|
||||||
)
|
)
|
||||||
else
|
else
|
||||||
SvgPicture.asset(
|
SvgPicture.asset(
|
||||||
|
|||||||
@@ -161,7 +161,8 @@ extension EmailExtension on Email {
|
|||||||
mailboxIds: mailboxIds,
|
mailboxIds: mailboxIds,
|
||||||
selectMode: selectMode,
|
selectMode: selectMode,
|
||||||
emailHeader: headers?.toList(),
|
emailHeader: headers?.toList(),
|
||||||
bodyValues: bodyValues
|
bodyValues: bodyValues,
|
||||||
|
htmlBody: htmlBody
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -82,19 +82,21 @@ extension PresentationEmailExtension on PresentationEmail {
|
|||||||
|
|
||||||
Email toEmail() {
|
Email toEmail() {
|
||||||
return Email(
|
return Email(
|
||||||
id: this.id,
|
id: this.id,
|
||||||
keywords: keywords,
|
keywords: keywords,
|
||||||
size: size,
|
size: size,
|
||||||
receivedAt: receivedAt,
|
receivedAt: receivedAt,
|
||||||
hasAttachment: hasAttachment,
|
hasAttachment: hasAttachment,
|
||||||
preview: preview,
|
preview: preview,
|
||||||
subject: subject,
|
subject: subject,
|
||||||
sentAt: sentAt,
|
sentAt: sentAt,
|
||||||
from: from,
|
from: from,
|
||||||
to: to,
|
to: to,
|
||||||
cc: cc,
|
cc: cc,
|
||||||
bcc: bcc,
|
bcc: bcc,
|
||||||
replyTo: replyTo
|
replyTo: replyTo,
|
||||||
|
htmlBody: htmlBody,
|
||||||
|
bodyValues: bodyValues,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user