TF-421 Support delete permanently selection email in mailbox Draft
This commit is contained in:
@@ -139,6 +139,7 @@ extension AppColor on Color {
|
|||||||
static const colorDividerRuleFilter = Color(0xFFE7E8EC);
|
static const colorDividerRuleFilter = Color(0xFFE7E8EC);
|
||||||
static const colorIconTextField = Color(0xFFB8C1CC);
|
static const colorIconTextField = Color(0xFFB8C1CC);
|
||||||
static const colorVacationNotificationMessageBackground = Color(0x2999A2AD);
|
static const colorVacationNotificationMessageBackground = Color(0x2999A2AD);
|
||||||
|
static const colorDeletePermanentlyButton = Color(0xffE64646);
|
||||||
|
|
||||||
static const mapGradientColor = [
|
static const mapGradientColor = [
|
||||||
[Color(0xFF21D4FD), Color(0xFFB721FF)],
|
[Color(0xFF21D4FD), Color(0xFFB721FF)],
|
||||||
|
|||||||
@@ -2,6 +2,14 @@ import 'package:core/core.dart';
|
|||||||
import 'package:tmail_ui_user/features/base/state/ui_action_state.dart';
|
import 'package:tmail_ui_user/features/base/state/ui_action_state.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/state.dart' as jmap;
|
import 'package:jmap_dart_client/jmap/core/state.dart' as jmap;
|
||||||
|
|
||||||
|
class StartDeleteEmailPermanently extends UIState {
|
||||||
|
|
||||||
|
StartDeleteEmailPermanently();
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object?> get props => [];
|
||||||
|
}
|
||||||
|
|
||||||
class DeleteEmailPermanentlySuccess extends UIActionState {
|
class DeleteEmailPermanentlySuccess extends UIActionState {
|
||||||
|
|
||||||
DeleteEmailPermanentlySuccess({
|
DeleteEmailPermanentlySuccess({
|
||||||
|
|||||||
@@ -14,6 +14,8 @@ class DeleteEmailPermanentlyInteractor {
|
|||||||
|
|
||||||
Stream<Either<Failure, Success>> execute(AccountId accountId, EmailId emailId) async* {
|
Stream<Either<Failure, Success>> execute(AccountId accountId, EmailId emailId) async* {
|
||||||
try {
|
try {
|
||||||
|
yield Right<Failure, Success>(StartDeleteEmailPermanently());
|
||||||
|
|
||||||
final listState = await Future.wait([
|
final listState = await Future.wait([
|
||||||
_mailboxRepository.getMailboxState(),
|
_mailboxRepository.getMailboxState(),
|
||||||
_emailRepository.getEmailState(),
|
_emailRepository.getEmailState(),
|
||||||
|
|||||||
@@ -421,12 +421,17 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
|
|||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
Obx(() => buildIconWeb(
|
Obx(() => buildIconWeb(
|
||||||
icon: SvgPicture.asset(imagePaths.icDelete, fit: BoxFit.fill),
|
icon: SvgPicture.asset(
|
||||||
tooltip: controller.selectedMailbox.value?.isTrash == true
|
canDeletePermanently ? imagePaths.icDeleteComposer : imagePaths.icDelete,
|
||||||
|
color: canDeletePermanently ? AppColor.colorDeletePermanentlyButton : AppColor.primaryColor,
|
||||||
|
width: 20,
|
||||||
|
height: 20,
|
||||||
|
fit: BoxFit.fill),
|
||||||
|
tooltip: canDeletePermanently
|
||||||
? AppLocalizations.of(context).delete_permanently
|
? AppLocalizations.of(context).delete_permanently
|
||||||
: AppLocalizations.of(context).move_to_trash,
|
: AppLocalizations.of(context).move_to_trash,
|
||||||
onTap: () {
|
onTap: () {
|
||||||
if (controller.selectedMailbox.value?.isTrash == true) {
|
if (canDeletePermanently) {
|
||||||
return controller.dispatchAction(HandleEmailActionTypeAction(context,
|
return controller.dispatchAction(HandleEmailActionTypeAction(context,
|
||||||
controller.listEmailSelected,
|
controller.listEmailSelected,
|
||||||
EmailActionType.deletePermanently));
|
EmailActionType.deletePermanently));
|
||||||
@@ -439,6 +444,11 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
|
|||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool get canDeletePermanently {
|
||||||
|
return controller.selectedMailbox.value?.isTrash == true ||
|
||||||
|
controller.selectedMailbox.value?.isDrafts == true;
|
||||||
|
}
|
||||||
|
|
||||||
Widget _buildSearchForm(BuildContext context) {
|
Widget _buildSearchForm(BuildContext context) {
|
||||||
return Row(
|
return Row(
|
||||||
children: [
|
children: [
|
||||||
|
|||||||
@@ -21,12 +21,14 @@ extension DeleteActionTypeExtension on DeleteActionType {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
String getContentDialog(BuildContext context, {int? count}) {
|
String getContentDialog(BuildContext context, {int? count, String? mailboxName}) {
|
||||||
switch(this) {
|
switch(this) {
|
||||||
case DeleteActionType.all:
|
case DeleteActionType.all:
|
||||||
return AppLocalizations.of(context).empty_trash_dialog_message;
|
return AppLocalizations.of(context).empty_trash_dialog_message;
|
||||||
case DeleteActionType.multiple:
|
case DeleteActionType.multiple:
|
||||||
return AppLocalizations.of(context).delete_multiple_messages_dialog(count ?? 0);
|
return AppLocalizations.of(context).delete_multiple_messages_dialog(
|
||||||
|
count ?? 0,
|
||||||
|
mailboxName ?? '');
|
||||||
case DeleteActionType.single:
|
case DeleteActionType.single:
|
||||||
return AppLocalizations.of(context).delete_single_message_dialog;
|
return AppLocalizations.of(context).delete_single_message_dialog;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -928,7 +928,11 @@ class ThreadController extends BaseController {
|
|||||||
moveSelectedMultipleEmailToTrash(selectionEmail);
|
moveSelectedMultipleEmailToTrash(selectionEmail);
|
||||||
break;
|
break;
|
||||||
case EmailActionType.deletePermanently:
|
case EmailActionType.deletePermanently:
|
||||||
deleteSelectionEmailsPermanently(context, DeleteActionType.multiple, selectedEmails: selectionEmail);
|
deleteSelectionEmailsPermanently(
|
||||||
|
context,
|
||||||
|
DeleteActionType.multiple,
|
||||||
|
selectedEmails: selectionEmail,
|
||||||
|
presentationMailbox: currentMailbox);
|
||||||
break;
|
break;
|
||||||
case EmailActionType.moveToSpam:
|
case EmailActionType.moveToSpam:
|
||||||
moveSelectedMultipleEmailToSpam(selectionEmail);
|
moveSelectedMultipleEmailToSpam(selectionEmail);
|
||||||
@@ -1144,10 +1148,20 @@ class ThreadController extends BaseController {
|
|||||||
|
|
||||||
bool get isMailboxTrash => mailboxDashBoardController.selectedMailbox.value?.role == PresentationMailbox.roleTrash;
|
bool get isMailboxTrash => mailboxDashBoardController.selectedMailbox.value?.role == PresentationMailbox.roleTrash;
|
||||||
|
|
||||||
void deleteSelectionEmailsPermanently(BuildContext context, DeleteActionType actionType, {List<PresentationEmail>? selectedEmails}) {
|
void deleteSelectionEmailsPermanently(
|
||||||
|
BuildContext context,
|
||||||
|
DeleteActionType actionType,
|
||||||
|
{
|
||||||
|
List<PresentationEmail>? selectedEmails,
|
||||||
|
PresentationMailbox? presentationMailbox
|
||||||
|
}
|
||||||
|
) {
|
||||||
if (_responsiveUtils.isMobile(context)) {
|
if (_responsiveUtils.isMobile(context)) {
|
||||||
(ConfirmationDialogActionSheetBuilder(context)
|
(ConfirmationDialogActionSheetBuilder(context)
|
||||||
..messageText(actionType.getContentDialog(context, count: selectedEmails?.length))
|
..messageText(actionType.getContentDialog(
|
||||||
|
context,
|
||||||
|
count: selectedEmails?.length,
|
||||||
|
mailboxName: presentationMailbox?.name?.name))
|
||||||
..onCancelAction(AppLocalizations.of(context).cancel, () => popBack())
|
..onCancelAction(AppLocalizations.of(context).cancel, () => popBack())
|
||||||
..onConfirmAction(actionType.getConfirmActionName(context), () => _deleteSelectionEmailsPermanentlyAction(actionType)))
|
..onConfirmAction(actionType.getConfirmActionName(context), () => _deleteSelectionEmailsPermanentlyAction(actionType)))
|
||||||
.show();
|
.show();
|
||||||
@@ -1158,7 +1172,10 @@ class ThreadController extends BaseController {
|
|||||||
builder: (BuildContext context) => PointerInterceptor(child: (ConfirmDialogBuilder(_imagePaths)
|
builder: (BuildContext context) => PointerInterceptor(child: (ConfirmDialogBuilder(_imagePaths)
|
||||||
..key(const Key('confirm_dialog_delete_emails_permanently'))
|
..key(const Key('confirm_dialog_delete_emails_permanently'))
|
||||||
..title(actionType.getTitleDialog(context))
|
..title(actionType.getTitleDialog(context))
|
||||||
..content(actionType.getContentDialog(context, count: selectedEmails?.length))
|
..content(actionType.getContentDialog(
|
||||||
|
context,
|
||||||
|
count: selectedEmails?.length,
|
||||||
|
mailboxName: presentationMailbox?.name?.name))
|
||||||
..addIcon(SvgPicture.asset(_imagePaths.icRemoveDialog, fit: BoxFit.fill))
|
..addIcon(SvgPicture.asset(_imagePaths.icRemoveDialog, fit: BoxFit.fill))
|
||||||
..colorConfirmButton(AppColor.colorConfirmActionDialog)
|
..colorConfirmButton(AppColor.colorConfirmActionDialog)
|
||||||
..styleTextConfirmButton(const TextStyle(fontSize: 17, fontWeight: FontWeight.w500, color: AppColor.colorActionDeleteConfirmDialog))
|
..styleTextConfirmButton(const TextStyle(fontSize: 17, fontWeight: FontWeight.w500, color: AppColor.colorActionDeleteConfirmDialog))
|
||||||
|
|||||||
@@ -190,21 +190,25 @@ class AppBarThreadWidgetBuilder {
|
|||||||
iconPadding: const EdgeInsets.all(5),
|
iconPadding: const EdgeInsets.all(5),
|
||||||
splashRadius: 15,
|
splashRadius: 15,
|
||||||
icon: SvgPicture.asset(
|
icon: SvgPicture.asset(
|
||||||
_imagePaths.icDeleteComposer,
|
canDeletePermanently ? _imagePaths.icDeleteComposer : _imagePaths.icDelete,
|
||||||
width: 18,
|
color: canDeletePermanently ? AppColor.colorDeletePermanentlyButton : AppColor.primaryColor,
|
||||||
height: 18,
|
width: 20,
|
||||||
color: AppColor.textFieldErrorBorderColor,
|
height: 20,
|
||||||
fit: BoxFit.fill),
|
fit: BoxFit.fill),
|
||||||
tooltip: _currentMailbox?.role != PresentationMailbox.roleTrash
|
tooltip: canDeletePermanently
|
||||||
? AppLocalizations.of(_context).move_to_trash
|
? AppLocalizations.of(_context).delete_permanently
|
||||||
: AppLocalizations.of(_context).delete_permanently,
|
: AppLocalizations.of(_context).move_to_trash,
|
||||||
onTap: () => _currentMailbox?.isTrash == true
|
onTap: () => canDeletePermanently
|
||||||
? _onEmailSelectionAction?.call(EmailActionType.deletePermanently, _listSelectionEmail)
|
? _onEmailSelectionAction?.call(EmailActionType.deletePermanently, _listSelectionEmail)
|
||||||
: _onEmailSelectionAction?.call(EmailActionType.moveToTrash, _listSelectionEmail)),
|
: _onEmailSelectionAction?.call(EmailActionType.moveToTrash, _listSelectionEmail)),
|
||||||
const SizedBox(width: 10),
|
const SizedBox(width: 10),
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool get canDeletePermanently {
|
||||||
|
return _currentMailbox?.isTrash == true || _currentMailbox?.isDrafts == true;
|
||||||
|
}
|
||||||
|
|
||||||
Widget _buildBodyAppBarForMobile() {
|
Widget _buildBodyAppBarForMobile() {
|
||||||
return Row(children: [
|
return Row(children: [
|
||||||
Expanded(child: Stack(
|
Expanded(child: Stack(
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"@@last_modified": "2022-09-08T14:02:20.481140",
|
"@@last_modified": "2022-09-08T15:46:55.686024",
|
||||||
"initializing_data": "Initializing data...",
|
"initializing_data": "Initializing data...",
|
||||||
"@initializing_data": {
|
"@initializing_data": {
|
||||||
"type": "text",
|
"type": "text",
|
||||||
@@ -1036,14 +1036,16 @@
|
|||||||
"placeholders_order": [],
|
"placeholders_order": [],
|
||||||
"placeholders": {}
|
"placeholders": {}
|
||||||
},
|
},
|
||||||
"delete_multiple_messages_dialog": "You are about to permanently delete {count} items in Trash . Do you want to continue?",
|
"delete_multiple_messages_dialog": "You are about to permanently delete {count} items in {mailboxName} . Do you want to continue?",
|
||||||
"@delete_multiple_messages_dialog": {
|
"@delete_multiple_messages_dialog": {
|
||||||
"type": "text",
|
"type": "text",
|
||||||
"placeholders_order": [
|
"placeholders_order": [
|
||||||
"count"
|
"count",
|
||||||
|
"mailboxName"
|
||||||
],
|
],
|
||||||
"placeholders": {
|
"placeholders": {
|
||||||
"count": {}
|
"count": {},
|
||||||
|
"mailboxName": {}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
"delete_single_message_dialog": "You are about to permanently delete this message. Do you want to continue?",
|
"delete_single_message_dialog": "You are about to permanently delete this message. Do you want to continue?",
|
||||||
|
|||||||
@@ -1075,11 +1075,11 @@ class AppLocalizations {
|
|||||||
name: 'delete_message_forever');
|
name: 'delete_message_forever');
|
||||||
}
|
}
|
||||||
|
|
||||||
String delete_multiple_messages_dialog(int count) {
|
String delete_multiple_messages_dialog(int count, String mailboxName) {
|
||||||
return Intl.message(
|
return Intl.message(
|
||||||
'You are about to permanently delete $count items in Trash . Do you want to continue?',
|
'You are about to permanently delete $count items in $mailboxName . Do you want to continue?',
|
||||||
name: 'delete_multiple_messages_dialog',
|
name: 'delete_multiple_messages_dialog',
|
||||||
args: [count]);
|
args: [count, mailboxName]);
|
||||||
}
|
}
|
||||||
|
|
||||||
String get delete_single_message_dialog {
|
String get delete_single_message_dialog {
|
||||||
|
|||||||
Reference in New Issue
Block a user