diff --git a/lib/features/composer/domain/model/sending_email.dart b/lib/features/composer/domain/model/sending_email.dart index dbefc2da0..36250dd9f 100644 --- a/lib/features/composer/domain/model/sending_email.dart +++ b/lib/features/composer/domain/model/sending_email.dart @@ -14,6 +14,7 @@ import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; import 'package:model/email/email_action_type.dart'; import 'package:model/email/presentation_email.dart'; import 'package:model/extensions/email_extension.dart'; +import 'package:model/mailbox/select_mode.dart'; class SendingEmail with EquatableMixin { final String sendingId; @@ -26,6 +27,7 @@ class SendingEmail with EquatableMixin { final MailboxName? mailboxNameRequest; final Id? creationIdRequest; final DateTime createTime; + final SelectMode selectMode; SendingEmail({ required this.sendingId, @@ -37,7 +39,8 @@ class SendingEmail with EquatableMixin { this.emailIdAnsweredOrForwarded, this.identityId, this.mailboxNameRequest, - this.creationIdRequest + this.creationIdRequest, + this.selectMode = SelectMode.INACTIVE }); Map toJson() { @@ -70,7 +73,6 @@ class SendingEmail with EquatableMixin { } factory SendingEmail.fromJson(Map json) { - return SendingEmail( sendingId: json['sendingId'] as String, email: Email.fromJson(jsonDecode(json['email'])), @@ -92,6 +94,8 @@ class SendingEmail with EquatableMixin { ); } + bool get isSelected => selectMode == SelectMode.ACTIVE; + @override List get props => [ sendingId, @@ -103,6 +107,7 @@ class SendingEmail with EquatableMixin { emailIdAnsweredOrForwarded, identityId, mailboxNameRequest, - creationIdRequest + creationIdRequest, + selectMode ]; } \ No newline at end of file diff --git a/lib/features/sending_queue/presentation/extensions/list_sending_email_extension.dart b/lib/features/sending_queue/presentation/extensions/list_sending_email_extension.dart new file mode 100644 index 000000000..61af8b21a --- /dev/null +++ b/lib/features/sending_queue/presentation/extensions/list_sending_email_extension.dart @@ -0,0 +1,17 @@ + +import 'package:tmail_ui_user/features/composer/domain/extensions/sending_email_extension.dart'; +import 'package:tmail_ui_user/features/composer/domain/model/sending_email.dart'; + +extension ListSendingEmailExtension on List { + List toggleSelection({required SendingEmail sendingEmailSelected}) => + map((sendingEmail) => sendingEmailSelected.sendingId == sendingEmail.sendingId + ? sendingEmail.toggleSelection() + : sendingEmail + ).toList(); + + List unAllSelected() => map((sendingEmail) => sendingEmail.unSelected()).toList(); + + bool isAllSelected() => every((sendingEmail) => sendingEmail.isSelected); + + bool isAllUnSelected() => every((sendingEmail) => !sendingEmail.isSelected); +} \ No newline at end of file diff --git a/lib/features/sending_queue/presentation/model/sending_email_action_type.dart b/lib/features/sending_queue/presentation/model/sending_email_action_type.dart new file mode 100644 index 000000000..4ca8e1834 --- /dev/null +++ b/lib/features/sending_queue/presentation/model/sending_email_action_type.dart @@ -0,0 +1,36 @@ + +import 'package:core/presentation/extensions/color_extension.dart'; +import 'package:flutter/cupertino.dart'; +import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; + +enum SendingEmailActionType { + delete; + + String getButtonTitle(BuildContext context) { + switch(this) { + case SendingEmailActionType.delete: + return AppLocalizations.of(context).delete; + } + } + + String getButtonKey() { + switch(this) { + case SendingEmailActionType.delete: + return 'button_delete_sending_email'; + } + } + + Color getButtonIconColor() { + switch(this) { + case SendingEmailActionType.delete: + return AppColor.colorDeletePermanentlyButton; + } + } + + Color getButtonTitleColor() { + switch(this) { + case SendingEmailActionType.delete: + return AppColor.colorDeletePermanentlyButton; + } + } +} \ No newline at end of file diff --git a/lib/features/sending_queue/presentation/widgets/bottom_bar_sending_queue_widget.dart b/lib/features/sending_queue/presentation/widgets/bottom_bar_sending_queue_widget.dart new file mode 100644 index 000000000..2504f43f2 --- /dev/null +++ b/lib/features/sending_queue/presentation/widgets/bottom_bar_sending_queue_widget.dart @@ -0,0 +1,51 @@ + +import 'package:core/presentation/extensions/color_extension.dart'; +import 'package:core/presentation/resources/image_paths.dart'; +import 'package:core/presentation/views/button/button_builder.dart'; +import 'package:flutter/material.dart'; +import 'package:get/get.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'; + +typedef OnHandleSendingEmailActionType = void Function(SendingEmailActionType, List); + +class BottomBarSendingQueueWidget extends StatelessWidget { + + final List listSendingEmails; + final OnHandleSendingEmailActionType? onHandleSendingEmailActionType; + + const BottomBarSendingQueueWidget({ + super.key, + required this.listSendingEmails, + this.onHandleSendingEmailActionType, + }); + + @override + Widget build(BuildContext context) { + final imagePaths = Get.find(); + + return Container( + decoration: const BoxDecoration( + border: Border(top: BorderSide( + color: AppColor.lineItemListColor, + width: 0.2, + )), + color: Colors.white + ), + child: Row( + mainAxisAlignment: MainAxisAlignment.center, + children: [ + Expanded(child: (ButtonBuilder(imagePaths.icDeleteComposer) + ..key(Key(SendingEmailActionType.delete.getButtonKey())) + ..iconColor(SendingEmailActionType.delete.getButtonIconColor()) + ..padding(const EdgeInsets.all(8)) + ..radiusSplash(8) + ..textStyle(TextStyle(fontSize: 12, color: SendingEmailActionType.delete.getButtonTitleColor())) + ..onPressActionClick(() => onHandleSendingEmailActionType?.call(SendingEmailActionType.delete, listSendingEmails)) + ..text(SendingEmailActionType.delete.getButtonTitle(context), isVertical: true) + ).build()) + ], + ), + ); + } +} \ No newline at end of file