TF-1865: Update UI and replace task in workmanager when update sending email

(cherry picked from commit 15168421c994c5f928873e0794bcbf0c36b015c9)
This commit is contained in:
HuyNguyen
2023-06-06 01:30:43 +07:00
committed by Dat Vu
parent 9ca0c7385a
commit ee6bf907ff
13 changed files with 206 additions and 170 deletions
@@ -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
]; ];
} }
@@ -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 {
@@ -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(
+2 -1
View File
@@ -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,
); );
} }