TF-2101 Handle restore deleted messages
(cherry picked from commit e675f98a6c85d9c4a90efc686e6ff72d23b4c678)
This commit is contained in:
@@ -1,16 +1,55 @@
|
|||||||
import 'package:core/presentation/state/failure.dart';
|
import 'package:core/presentation/state/failure.dart';
|
||||||
import 'package:core/presentation/state/success.dart';
|
import 'package:core/presentation/state/success.dart';
|
||||||
import 'package:email_recovery/email_recovery/email_recovery_action.dart';
|
import 'package:email_recovery/email_recovery/email_recovery_action.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/core/state.dart' as jmap;
|
||||||
|
import 'package:tmail_ui_user/features/base/state/ui_action_state.dart';
|
||||||
|
|
||||||
class GetRestoredDeletedMessageLoading extends LoadingState {}
|
class GetRestoredDeletedMessageLoading extends LoadingState {}
|
||||||
|
|
||||||
class GetRestoredDeletedMessageSuccess extends UIState {
|
class GetRestoredDeletedMessageSuccess extends UIActionState {
|
||||||
final EmailRecoveryAction emailRecoveryAction;
|
final EmailRecoveryAction emailRecoveryAction;
|
||||||
|
|
||||||
GetRestoredDeletedMessageSuccess(this.emailRecoveryAction);
|
|
||||||
|
GetRestoredDeletedMessageSuccess(
|
||||||
|
this.emailRecoveryAction,
|
||||||
|
{
|
||||||
|
jmap.State? currentMailboxState,
|
||||||
|
}
|
||||||
|
) : super(null, currentMailboxState);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
List<Object> get props => [emailRecoveryAction];
|
List<Object?> get props => [emailRecoveryAction, ...super.props];
|
||||||
|
}
|
||||||
|
|
||||||
|
class GetRestoredDeletedMessageCompleted extends GetRestoredDeletedMessageSuccess {
|
||||||
|
final Mailbox? recoveredMailbox;
|
||||||
|
|
||||||
|
GetRestoredDeletedMessageCompleted(
|
||||||
|
EmailRecoveryAction emailRecoveryAction,
|
||||||
|
{this.recoveredMailbox}
|
||||||
|
) : super(emailRecoveryAction);
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object?> get props => [emailRecoveryAction, recoveredMailbox];
|
||||||
|
}
|
||||||
|
|
||||||
|
class GetRestoredDeletedMessageWaiting extends GetRestoredDeletedMessageSuccess {
|
||||||
|
GetRestoredDeletedMessageWaiting(
|
||||||
|
EmailRecoveryAction emailRecoveryAction,
|
||||||
|
) : super(emailRecoveryAction);
|
||||||
|
}
|
||||||
|
|
||||||
|
class GetRestoredDeletedMessageInProgress extends GetRestoredDeletedMessageSuccess {
|
||||||
|
GetRestoredDeletedMessageInProgress(
|
||||||
|
EmailRecoveryAction emailRecoveryAction,
|
||||||
|
) : super(emailRecoveryAction);
|
||||||
|
}
|
||||||
|
|
||||||
|
class GetRestoredDeletedMessageCanceled extends GetRestoredDeletedMessageSuccess {
|
||||||
|
GetRestoredDeletedMessageCanceled(
|
||||||
|
EmailRecoveryAction emailRecoveryAction,
|
||||||
|
) : super(emailRecoveryAction);
|
||||||
}
|
}
|
||||||
|
|
||||||
class GetRestoredDeletedMessageFailure extends FeatureFailure {
|
class GetRestoredDeletedMessageFailure extends FeatureFailure {
|
||||||
|
|||||||
@@ -1,16 +1,23 @@
|
|||||||
import 'package:core/presentation/state/failure.dart';
|
import 'package:core/presentation/state/failure.dart';
|
||||||
import 'package:core/presentation/state/success.dart';
|
import 'package:core/presentation/state/success.dart';
|
||||||
import 'package:email_recovery/email_recovery/email_recovery_action.dart';
|
import 'package:email_recovery/email_recovery/email_recovery_action.dart';
|
||||||
|
import 'package:tmail_ui_user/features/base/state/ui_action_state.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/core/state.dart' as jmap;
|
||||||
|
|
||||||
class RestoreDeletedMessageLoading extends LoadingState {}
|
class RestoreDeletedMessageLoading extends LoadingState {}
|
||||||
|
|
||||||
class RestoreDeletedMessageSuccess extends UIState {
|
class RestoreDeletedMessageSuccess extends UIActionState {
|
||||||
final EmailRecoveryAction emailRecoveryAction;
|
final EmailRecoveryAction emailRecoveryAction;
|
||||||
|
|
||||||
RestoreDeletedMessageSuccess(this.emailRecoveryAction);
|
RestoreDeletedMessageSuccess(
|
||||||
|
this.emailRecoveryAction,
|
||||||
|
{
|
||||||
|
jmap.State? currentMailboxState,
|
||||||
|
}
|
||||||
|
) : super(null, currentMailboxState);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
List<Object> get props => [emailRecoveryAction];
|
List<Object?> get props => [emailRecoveryAction, ...super.props];
|
||||||
}
|
}
|
||||||
|
|
||||||
class RestoreDeletedMessageFailure extends FeatureFailure {
|
class RestoreDeletedMessageFailure extends FeatureFailure {
|
||||||
|
|||||||
@@ -4,21 +4,56 @@ import 'package:core/presentation/state/failure.dart';
|
|||||||
import 'package:core/presentation/state/success.dart';
|
import 'package:core/presentation/state/success.dart';
|
||||||
import 'package:dartz/dartz.dart';
|
import 'package:dartz/dartz.dart';
|
||||||
import 'package:email_recovery/email_recovery/email_recovery_action_id.dart';
|
import 'package:email_recovery/email_recovery/email_recovery_action_id.dart';
|
||||||
|
import 'package:email_recovery/email_recovery/email_recovery_status.dart.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/account_id.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/core/session/session.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
||||||
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
|
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
|
||||||
import 'package:tmail_ui_user/features/email/domain/state/get_restored_deleted_message_state.dart';
|
import 'package:tmail_ui_user/features/email/domain/state/get_restored_deleted_message_state.dart';
|
||||||
|
import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart';
|
||||||
|
|
||||||
class GetRestoredDeletedMessageInterator {
|
class GetRestoredDeletedMessageInterator {
|
||||||
final EmailRepository _emailRepository;
|
final EmailRepository _emailRepository;
|
||||||
|
final MailboxRepository _mailboxRepository;
|
||||||
|
|
||||||
GetRestoredDeletedMessageInterator(this._emailRepository);
|
GetRestoredDeletedMessageInterator(this._emailRepository, this._mailboxRepository);
|
||||||
|
|
||||||
Stream<Either<Failure, Success>> execute(
|
Stream<Either<Failure, Success>> execute(
|
||||||
|
Session session,
|
||||||
|
AccountId accountId,
|
||||||
EmailRecoveryActionId emailRecoveryActionId,
|
EmailRecoveryActionId emailRecoveryActionId,
|
||||||
) async* {
|
) async* {
|
||||||
try {
|
try {
|
||||||
yield Right<Failure, Success>(GetRestoredDeletedMessageLoading());
|
yield Right<Failure, Success>(GetRestoredDeletedMessageLoading());
|
||||||
|
|
||||||
final emailRecovery = await _emailRepository.getRestoredDeletedMessage(emailRecoveryActionId);
|
final emailRecovery = await _emailRepository.getRestoredDeletedMessage(emailRecoveryActionId);
|
||||||
yield Right<Failure, Success>(GetRestoredDeletedMessageSuccess(emailRecovery));
|
|
||||||
|
switch (emailRecovery.status) {
|
||||||
|
case EmailRecoveryStatus.completed:
|
||||||
|
final getMailboxByRoleResponse = await _mailboxRepository.getMailboxByRole(
|
||||||
|
session,
|
||||||
|
accountId,
|
||||||
|
Role('Restored-Messages')
|
||||||
|
);
|
||||||
|
final recoveredMailbox = getMailboxByRoleResponse.mailbox;
|
||||||
|
|
||||||
|
yield Right<Failure, Success>(GetRestoredDeletedMessageCompleted(emailRecovery, recoveredMailbox: recoveredMailbox));
|
||||||
|
break;
|
||||||
|
case EmailRecoveryStatus.failed:
|
||||||
|
yield Left<Failure, Success>(GetRestoredDeletedMessageFailure(null));
|
||||||
|
break;
|
||||||
|
case EmailRecoveryStatus.inProgress:
|
||||||
|
yield Right<Failure, Success>(GetRestoredDeletedMessageInProgress(emailRecovery));
|
||||||
|
break;
|
||||||
|
case EmailRecoveryStatus.waiting:
|
||||||
|
yield Right<Failure, Success>(GetRestoredDeletedMessageWaiting(emailRecovery));
|
||||||
|
break;
|
||||||
|
case EmailRecoveryStatus.canceled:
|
||||||
|
yield Right<Failure, Success>(GetRestoredDeletedMessageCanceled(emailRecovery));
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
yield Left<Failure, Success>(GetRestoredDeletedMessageFailure(null));
|
||||||
|
}
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
yield Left<Failure, Success>(GetRestoredDeletedMessageFailure(e));
|
yield Left<Failure, Success>(GetRestoredDeletedMessageFailure(e));
|
||||||
}
|
}
|
||||||
|
|||||||
+9
-2
@@ -3,22 +3,29 @@ import 'dart:async';
|
|||||||
import 'package:core/presentation/state/failure.dart';
|
import 'package:core/presentation/state/failure.dart';
|
||||||
import 'package:core/presentation/state/success.dart';
|
import 'package:core/presentation/state/success.dart';
|
||||||
import 'package:dartz/dartz.dart';
|
import 'package:dartz/dartz.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/account_id.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/core/session/session.dart';
|
||||||
import 'package:tmail_ui_user/features/email/domain/model/restore_deleted_message_request.dart';
|
import 'package:tmail_ui_user/features/email/domain/model/restore_deleted_message_request.dart';
|
||||||
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
|
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
|
||||||
import 'package:tmail_ui_user/features/email/domain/state/restore_deleted_message_state.dart';
|
import 'package:tmail_ui_user/features/email/domain/state/restore_deleted_message_state.dart';
|
||||||
|
import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart';
|
||||||
|
|
||||||
class RestoredDeletedMessageInteractor {
|
class RestoredDeletedMessageInteractor {
|
||||||
final EmailRepository _emailRepository;
|
final EmailRepository _emailRepository;
|
||||||
|
final MailboxRepository _mailboxRepository;
|
||||||
|
|
||||||
RestoredDeletedMessageInteractor(this._emailRepository);
|
RestoredDeletedMessageInteractor(this._emailRepository, this._mailboxRepository);
|
||||||
|
|
||||||
Stream<Either<Failure, Success>> execute(
|
Stream<Either<Failure, Success>> execute(
|
||||||
|
Session session,
|
||||||
|
AccountId accountId,
|
||||||
RestoredDeletedMessageRequest newRecoveryRequest,
|
RestoredDeletedMessageRequest newRecoveryRequest,
|
||||||
) async* {
|
) async* {
|
||||||
try {
|
try {
|
||||||
yield Right<Failure, Success>(RestoreDeletedMessageLoading());
|
yield Right<Failure, Success>(RestoreDeletedMessageLoading());
|
||||||
|
final currentMailboxState = await _mailboxRepository.getMailboxState(session, accountId);
|
||||||
final emailRecovery = await _emailRepository.restoreDeletedMessage(newRecoveryRequest);
|
final emailRecovery = await _emailRepository.restoreDeletedMessage(newRecoveryRequest);
|
||||||
yield Right<Failure, Success>(RestoreDeletedMessageSuccess(emailRecovery));
|
yield Right<Failure, Success>(RestoreDeletedMessageSuccess(emailRecovery, currentMailboxState: currentMailboxState));
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
yield Left<Failure, Success>(RestoreDeletedMessageFailure(e));
|
yield Left<Failure, Success>(RestoreDeletedMessageFailure(e));
|
||||||
}
|
}
|
||||||
@@ -297,10 +297,10 @@ class EmailRecoveryController extends BaseController with DateRangePickerMixin {
|
|||||||
void onRestore(BuildContext context) {
|
void onRestore(BuildContext context) {
|
||||||
KeyboardUtils.hideKeyboard(context);
|
KeyboardUtils.hideKeyboard(context);
|
||||||
|
|
||||||
final UTCDate? deletedBefore;
|
UTCDate? deletedBefore;
|
||||||
final UTCDate? deletedAfter;
|
UTCDate? deletedAfter;
|
||||||
final UTCDate? receivedBefore;
|
UTCDate? receivedBefore;
|
||||||
final UTCDate? receivedAfter;
|
UTCDate? receivedAfter;
|
||||||
if (deletionDateFieldSelected.value == EmailRecoveryTimeType.customRange) {
|
if (deletionDateFieldSelected.value == EmailRecoveryTimeType.customRange) {
|
||||||
deletedBefore = endDeletionDate.value?.toUTCDate();
|
deletedBefore = endDeletionDate.value?.toUTCDate();
|
||||||
deletedAfter = startDeletionDate.value?.toUTCDate();
|
deletedAfter = startDeletionDate.value?.toUTCDate();
|
||||||
@@ -343,6 +343,9 @@ class EmailRecoveryController extends BaseController with DateRangePickerMixin {
|
|||||||
focusManager.subjectFieldFocusNode.removeListener(_onSubjectFieldFocusChanged);
|
focusManager.subjectFieldFocusNode.removeListener(_onSubjectFieldFocusChanged);
|
||||||
focusManager.recipientsFieldFocusNode.removeListener(_onRecipientsFieldFocusChanged);
|
focusManager.recipientsFieldFocusNode.removeListener(_onRecipientsFieldFocusChanged);
|
||||||
focusManager.senderFieldFocusNode.removeListener(_onSenderFieldFocusChanged);
|
focusManager.senderFieldFocusNode.removeListener(_onSenderFieldFocusChanged);
|
||||||
|
subjectFieldInputController.dispose();
|
||||||
|
recipientsFieldInputController.dispose();
|
||||||
|
senderFieldInputController.dispose();
|
||||||
focusManager.dispose();
|
focusManager.dispose();
|
||||||
super.dispose();
|
super.dispose();
|
||||||
}
|
}
|
||||||
|
|||||||
-1
@@ -109,7 +109,6 @@ class EmailRecoveryFormDesktopBuilder extends GetWidget<EmailRecoveryController>
|
|||||||
Obx(() => CheckBoxHasAttachmentWidget(
|
Obx(() => CheckBoxHasAttachmentWidget(
|
||||||
hasAttachmentValue: controller.hasAttachment.value,
|
hasAttachmentValue: controller.hasAttachment.value,
|
||||||
currentFocusNode: controller.focusManager.attachmentCheckboxFocusNode,
|
currentFocusNode: controller.focusManager.attachmentCheckboxFocusNode,
|
||||||
nextFocusNode: controller.focusManager.createButtonFocusNode,
|
|
||||||
onChanged: (value) => controller.onChangeHasAttachment(value),
|
onChanged: (value) => controller.onChangeHasAttachment(value),
|
||||||
)),
|
)),
|
||||||
SizedBox(width: controller.responsiveUtils.getDeviceWidth(context) * 0.04),
|
SizedBox(width: controller.responsiveUtils.getDeviceWidth(context) * 0.04),
|
||||||
|
|||||||
-1
@@ -94,7 +94,6 @@ class EmailRecoveryFormMobileBuilder extends GetWidget<EmailRecoveryController>
|
|||||||
Obx(() => CheckBoxHasAttachmentWidget(
|
Obx(() => CheckBoxHasAttachmentWidget(
|
||||||
hasAttachmentValue: controller.hasAttachment.value,
|
hasAttachmentValue: controller.hasAttachment.value,
|
||||||
currentFocusNode: controller.focusManager.attachmentCheckboxFocusNode,
|
currentFocusNode: controller.focusManager.attachmentCheckboxFocusNode,
|
||||||
nextFocusNode: controller.focusManager.deletionDateFieldFocusNode,
|
|
||||||
onChanged: (value) => controller.onChangeHasAttachment(value),
|
onChanged: (value) => controller.onChangeHasAttachment(value),
|
||||||
))
|
))
|
||||||
],
|
],
|
||||||
|
|||||||
-1
@@ -107,7 +107,6 @@ class EmailRecoveryFormTabletBuilder extends GetWidget<EmailRecoveryController>
|
|||||||
Obx(() => CheckBoxHasAttachmentWidget(
|
Obx(() => CheckBoxHasAttachmentWidget(
|
||||||
hasAttachmentValue: controller.hasAttachment.value,
|
hasAttachmentValue: controller.hasAttachment.value,
|
||||||
currentFocusNode: controller.focusManager.attachmentCheckboxFocusNode,
|
currentFocusNode: controller.focusManager.attachmentCheckboxFocusNode,
|
||||||
nextFocusNode: controller.focusManager.deletionDateFieldFocusNode,
|
|
||||||
onChanged: (value) => controller.onChangeHasAttachment(value),
|
onChanged: (value) => controller.onChangeHasAttachment(value),
|
||||||
)),
|
)),
|
||||||
SizedBox(width: controller.responsiveUtils.getDeviceWidth(context) * 0.04),
|
SizedBox(width: controller.responsiveUtils.getDeviceWidth(context) * 0.04),
|
||||||
|
|||||||
+1
-1
@@ -1,5 +1,5 @@
|
|||||||
import 'package:core/core.dart';
|
|
||||||
import 'package:core/presentation/extensions/color_extension.dart';
|
import 'package:core/presentation/extensions/color_extension.dart';
|
||||||
|
import 'package:core/presentation/extensions/string_extension.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.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:model/model.dart';
|
import 'package:model/model.dart';
|
||||||
|
|||||||
+2
-2
@@ -15,7 +15,7 @@ import 'package:tmail_ui_user/features/email_recovery/presentation/styles/text_i
|
|||||||
import 'package:tmail_ui_user/features/email_recovery/presentation/widgets/text_input_field/suggestion_item_widget.dart';
|
import 'package:tmail_ui_user/features/email_recovery/presentation/widgets/text_input_field/suggestion_item_widget.dart';
|
||||||
import 'package:tmail_ui_user/features/email_recovery/presentation/widgets/text_input_field/suggestion_tag_item_widget.dart';
|
import 'package:tmail_ui_user/features/email_recovery/presentation/widgets/text_input_field/suggestion_tag_item_widget.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/suggesstion_email_address.dart';
|
import 'package:tmail_ui_user/features/mailbox_dashboard/presentation/model/search/suggesstion_email_address.dart';
|
||||||
import 'package:tmail_ui_user/main/utils/app_constants.dart';
|
import 'package:tmail_ui_user/main/utils/app_config.dart';
|
||||||
|
|
||||||
typedef OnSuggestionEmailAddress = Future<List<EmailAddress>> Function(String word);
|
typedef OnSuggestionEmailAddress = Future<List<EmailAddress>> Function(String word);
|
||||||
typedef OnUpdateListEmailAddressAction = void Function(EmailRecoveryField field, List<EmailAddress> newDate);
|
typedef OnUpdateListEmailAddressAction = void Function(EmailRecoveryField field, List<EmailAddress> newDate);
|
||||||
@@ -325,7 +325,7 @@ class _TextInputFieldSuggestionWidgetState extends State<TextInputFieldSuggestio
|
|||||||
|
|
||||||
final tmailSuggestion = List<SuggestionEmailAddress>.empty(growable: true);
|
final tmailSuggestion = List<SuggestionEmailAddress>.empty(growable: true);
|
||||||
if (
|
if (
|
||||||
processedQuery.length >= AppConstants.limitCharToStartSearch
|
processedQuery.length >= AppConfig.limitCharToStartSearch
|
||||||
&& widget.onSuggestionEmailAddress != null
|
&& widget.onSuggestionEmailAddress != null
|
||||||
) {
|
) {
|
||||||
final listEmailAddress = await widget.onSuggestionEmailAddress!(processedQuery);
|
final listEmailAddress = await widget.onSuggestionEmailAddress!(processedQuery);
|
||||||
|
|||||||
@@ -14,6 +14,7 @@ import 'package:jmap_dart_client/jmap/mail/email/email.dart';
|
|||||||
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/data/model/mailbox_change_response.dart';
|
import 'package:tmail_ui_user/features/mailbox/data/model/mailbox_change_response.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_request.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_request.dart';
|
||||||
|
import 'package:tmail_ui_user/features/mailbox/domain/model/get_mailbox_by_role_response.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_response.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_response.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/domain/model/move_mailbox_request.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/model/move_mailbox_request.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/domain/model/rename_mailbox_request.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/model/rename_mailbox_request.dart';
|
||||||
@@ -51,4 +52,6 @@ abstract class MailboxDataSource {
|
|||||||
Future<List<Mailbox>> createDefaultMailbox(Session session, AccountId accountId, List<Role> listRole);
|
Future<List<Mailbox>> createDefaultMailbox(Session session, AccountId accountId, List<Role> listRole);
|
||||||
|
|
||||||
Future<void> setRoleDefaultMailbox(Session session, AccountId accountId, List<Mailbox> listMailbox);
|
Future<void> setRoleDefaultMailbox(Session session, AccountId accountId, List<Mailbox> listMailbox);
|
||||||
|
|
||||||
|
Future<GetMailboxByRoleResponse> getMailboxByRole(Session session, AccountId accountId, Role role);
|
||||||
}
|
}
|
||||||
@@ -9,6 +9,7 @@ import 'package:jmap_dart_client/jmap/core/id.dart';
|
|||||||
import 'package:jmap_dart_client/jmap/core/properties/properties.dart';
|
import 'package:jmap_dart_client/jmap/core/properties/properties.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/session/session.dart';
|
import 'package:jmap_dart_client/jmap/core/session/session.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/state.dart';
|
import 'package:jmap_dart_client/jmap/core/state.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/core/unsigned_int.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/user_name.dart';
|
import 'package:jmap_dart_client/jmap/core/user_name.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/mailbox/mailbox.dart';
|
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
||||||
@@ -16,6 +17,7 @@ import 'package:tmail_ui_user/features/mailbox/data/datasource/mailbox_datasourc
|
|||||||
import 'package:tmail_ui_user/features/mailbox/data/local/mailbox_cache_manager.dart';
|
import 'package:tmail_ui_user/features/mailbox/data/local/mailbox_cache_manager.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/data/model/mailbox_change_response.dart';
|
import 'package:tmail_ui_user/features/mailbox/data/model/mailbox_change_response.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_request.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_request.dart';
|
||||||
|
import 'package:tmail_ui_user/features/mailbox/domain/model/get_mailbox_by_role_response.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_response.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_response.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/domain/model/move_mailbox_request.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/model/move_mailbox_request.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/domain/model/rename_mailbox_request.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/model/rename_mailbox_request.dart';
|
||||||
@@ -104,4 +106,9 @@ class MailboxCacheDataSourceImpl extends MailboxDataSource {
|
|||||||
Future<List<MailboxId>> setRoleDefaultMailbox(Session session, AccountId accountId, List<Mailbox> listMailbox) {
|
Future<List<MailboxId>> setRoleDefaultMailbox(Session session, AccountId accountId, List<Mailbox> listMailbox) {
|
||||||
throw UnimplementedError();
|
throw UnimplementedError();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<GetMailboxByRoleResponse> getMailboxByRole(Session session, AccountId accountId, Role role, {UnsignedInt? limit}) {
|
||||||
|
throw UnimplementedError();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -9,6 +9,7 @@ import 'package:jmap_dart_client/jmap/core/id.dart';
|
|||||||
import 'package:jmap_dart_client/jmap/core/properties/properties.dart';
|
import 'package:jmap_dart_client/jmap/core/properties/properties.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/session/session.dart';
|
import 'package:jmap_dart_client/jmap/core/session/session.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/state.dart';
|
import 'package:jmap_dart_client/jmap/core/state.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/core/unsigned_int.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/user_name.dart';
|
import 'package:jmap_dart_client/jmap/core/user_name.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/mailbox/mailbox.dart';
|
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
||||||
@@ -17,6 +18,7 @@ import 'package:tmail_ui_user/features/mailbox/data/model/mailbox_change_respons
|
|||||||
import 'package:tmail_ui_user/features/mailbox/data/network/mailbox_api.dart';
|
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/domain/model/create_new_mailbox_request.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_request.dart';
|
||||||
|
import 'package:tmail_ui_user/features/mailbox/domain/model/get_mailbox_by_role_response.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_response.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_response.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/domain/model/move_mailbox_request.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/model/move_mailbox_request.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/domain/model/rename_mailbox_request.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/model/rename_mailbox_request.dart';
|
||||||
@@ -132,4 +134,11 @@ class MailboxDataSourceImpl extends MailboxDataSource {
|
|||||||
return await mailboxAPI.setRoleDefaultMailbox(session, accountId, listMailbox);
|
return await mailboxAPI.setRoleDefaultMailbox(session, accountId, listMailbox);
|
||||||
}).catchError(_exceptionThrower.throwException);
|
}).catchError(_exceptionThrower.throwException);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<GetMailboxByRoleResponse> getMailboxByRole(Session session, AccountId accountId, Role role, {UnsignedInt? limit}) {
|
||||||
|
return Future.sync(() async {
|
||||||
|
return await mailboxAPI.getMailboxByRole(session, accountId, role);
|
||||||
|
}).catchError(_exceptionThrower.throwException);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -21,6 +21,8 @@ import 'package:jmap_dart_client/jmap/mail/mailbox/changes/changes_mailbox_respo
|
|||||||
import 'package:jmap_dart_client/jmap/mail/mailbox/get/get_mailbox_method.dart';
|
import 'package:jmap_dart_client/jmap/mail/mailbox/get/get_mailbox_method.dart';
|
||||||
import 'package:jmap_dart_client/jmap/mail/mailbox/get/get_mailbox_response.dart';
|
import 'package:jmap_dart_client/jmap/mail/mailbox/get/get_mailbox_response.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/mailbox_filter_condition.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/mail/mailbox/query/query_mailbox_method.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:jmap_dart_client/jmap/mail/mailbox/set/set_mailbox_response.dart';
|
import 'package:jmap_dart_client/jmap/mail/mailbox/set/set_mailbox_response.dart';
|
||||||
import 'package:model/error_type_handler/set_method_error_handler_mixin.dart';
|
import 'package:model/error_type_handler/set_method_error_handler_mixin.dart';
|
||||||
@@ -32,6 +34,7 @@ import 'package:tmail_ui_user/features/mailbox/domain/exceptions/set_mailbox_met
|
|||||||
import 'package:tmail_ui_user/features/mailbox/domain/extensions/list_mailbox_id_extension.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/extensions/list_mailbox_id_extension.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/domain/extensions/role_extension.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/extensions/role_extension.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_request.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_request.dart';
|
||||||
|
import 'package:tmail_ui_user/features/mailbox/domain/model/get_mailbox_by_role_response.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_response.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_response.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_subscribe_state.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_subscribe_state.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/domain/model/move_mailbox_request.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/model/move_mailbox_request.dart';
|
||||||
@@ -499,4 +502,48 @@ class MailboxAPI with HandleSetErrorMixin {
|
|||||||
throw SetMailboxMethodException(mapErrors);
|
throw SetMailboxMethodException(mapErrors);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Future<GetMailboxByRoleResponse> getMailboxByRole(
|
||||||
|
Session session,
|
||||||
|
AccountId accountId,
|
||||||
|
Role role,
|
||||||
|
{
|
||||||
|
UnsignedInt? limit
|
||||||
|
}
|
||||||
|
) async {
|
||||||
|
const int defaultLimit = 1;
|
||||||
|
final processingInvocation = ProcessingInvocation();
|
||||||
|
final requestBuilder = JmapRequestBuilder(httpClient, processingInvocation);
|
||||||
|
final mailboxQueryMethod = QueryMailboxMethod(accountId)..addLimit(limit ?? UnsignedInt(defaultLimit));
|
||||||
|
|
||||||
|
final mailboxFilterCondition = MailboxFilterCondition(role: role);
|
||||||
|
mailboxQueryMethod.addFilters(mailboxFilterCondition);
|
||||||
|
|
||||||
|
final mailboxQueryMethodInvocation = requestBuilder.invocation(mailboxQueryMethod);
|
||||||
|
final getMailBoxMethod = GetMailboxMethod(accountId)
|
||||||
|
..addReferenceIds(processingInvocation.createResultReference(
|
||||||
|
mailboxQueryMethodInvocation.methodCallId,
|
||||||
|
ReferencePath.idsPath,
|
||||||
|
));
|
||||||
|
final getMailboxInvocation = requestBuilder.invocation(getMailBoxMethod);
|
||||||
|
|
||||||
|
final capabilities = getMailBoxMethod.requiredCapabilities
|
||||||
|
.toCapabilitiesSupportTeamMailboxes(session, accountId);
|
||||||
|
|
||||||
|
final result = await (requestBuilder
|
||||||
|
..usings(capabilities))
|
||||||
|
.build()
|
||||||
|
.execute();
|
||||||
|
|
||||||
|
final mailboxResponse = result.parse<GetMailboxResponse>(
|
||||||
|
getMailboxInvocation.methodCallId,
|
||||||
|
GetMailboxResponse.deserialize
|
||||||
|
);
|
||||||
|
|
||||||
|
if (mailboxResponse?.list.isNotEmpty == true) {
|
||||||
|
return GetMailboxByRoleResponse(mailbox: mailboxResponse!.list.first);
|
||||||
|
} else {
|
||||||
|
throw NotFoundMailboxException();
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -11,6 +11,7 @@ import 'package:jmap_dart_client/jmap/core/id.dart';
|
|||||||
import 'package:jmap_dart_client/jmap/core/properties/properties.dart';
|
import 'package:jmap_dart_client/jmap/core/properties/properties.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/session/session.dart';
|
import 'package:jmap_dart_client/jmap/core/session/session.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/state.dart';
|
import 'package:jmap_dart_client/jmap/core/state.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/core/unsigned_int.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/mailbox/mailbox.dart';
|
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
||||||
import 'package:model/extensions/list_mailbox_extension.dart';
|
import 'package:model/extensions/list_mailbox_extension.dart';
|
||||||
@@ -20,6 +21,7 @@ import 'package:tmail_ui_user/features/mailbox/data/datasource/state_datasource.
|
|||||||
import 'package:tmail_ui_user/features/mailbox/data/extensions/state_extension.dart';
|
import 'package:tmail_ui_user/features/mailbox/data/extensions/state_extension.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/data/model/state_type.dart';
|
import 'package:tmail_ui_user/features/mailbox/data/model/state_type.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_request.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_request.dart';
|
||||||
|
import 'package:tmail_ui_user/features/mailbox/domain/model/get_mailbox_by_role_response.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_response.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_response.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/domain/model/move_mailbox_request.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/model/move_mailbox_request.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/domain/model/rename_mailbox_request.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/model/rename_mailbox_request.dart';
|
||||||
@@ -219,4 +221,9 @@ class MailboxRepositoryImpl extends MailboxRepository {
|
|||||||
Future<void> setRoleDefaultMailbox(Session session, AccountId accountId, List<Mailbox> listMailbox) {
|
Future<void> setRoleDefaultMailbox(Session session, AccountId accountId, List<Mailbox> listMailbox) {
|
||||||
return mapDataSource[DataSourceType.network]!.setRoleDefaultMailbox(session, accountId, listMailbox);
|
return mapDataSource[DataSourceType.network]!.setRoleDefaultMailbox(session, accountId, listMailbox);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<GetMailboxByRoleResponse> getMailboxByRole(Session session, AccountId accountId, Role role, {UnsignedInt? limit}) {
|
||||||
|
return mapDataSource[DataSourceType.network]!.getMailboxByRole(session, accountId, role);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -11,4 +11,6 @@ class SetMailboxMethodException implements Exception {
|
|||||||
|
|
||||||
class NotFoundMailboxCreatedException implements Exception {}
|
class NotFoundMailboxCreatedException implements Exception {}
|
||||||
|
|
||||||
class NotFoundMailboxUpdatedRoleException implements Exception {}
|
class NotFoundMailboxUpdatedRoleException implements Exception {}
|
||||||
|
|
||||||
|
class NotFoundMailboxException implements Exception {}
|
||||||
@@ -0,0 +1,15 @@
|
|||||||
|
import 'package:equatable/equatable.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
||||||
|
|
||||||
|
class GetMailboxByRoleResponse with EquatableMixin {
|
||||||
|
final Mailbox? mailbox;
|
||||||
|
|
||||||
|
GetMailboxByRoleResponse({
|
||||||
|
this.mailbox,
|
||||||
|
});
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object?> get props => [
|
||||||
|
mailbox,
|
||||||
|
];
|
||||||
|
}
|
||||||
@@ -9,9 +9,11 @@ import 'package:jmap_dart_client/jmap/core/id.dart';
|
|||||||
import 'package:jmap_dart_client/jmap/core/properties/properties.dart';
|
import 'package:jmap_dart_client/jmap/core/properties/properties.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/session/session.dart';
|
import 'package:jmap_dart_client/jmap/core/session/session.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/state.dart';
|
import 'package:jmap_dart_client/jmap/core/state.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/core/unsigned_int.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/mailbox/mailbox.dart';
|
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_request.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_request.dart';
|
||||||
|
import 'package:tmail_ui_user/features/mailbox/domain/model/get_mailbox_by_role_response.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_response.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_response.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/domain/model/move_mailbox_request.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/model/move_mailbox_request.dart';
|
||||||
import 'package:tmail_ui_user/features/mailbox/domain/model/rename_mailbox_request.dart';
|
import 'package:tmail_ui_user/features/mailbox/domain/model/rename_mailbox_request.dart';
|
||||||
@@ -47,4 +49,6 @@ abstract class MailboxRepository {
|
|||||||
Future<List<Mailbox>> createDefaultMailbox(Session session, AccountId accountId, List<Role> listRole);
|
Future<List<Mailbox>> createDefaultMailbox(Session session, AccountId accountId, List<Role> listRole);
|
||||||
|
|
||||||
Future<void> setRoleDefaultMailbox(Session session, AccountId accountId, List<Mailbox> listMailbox);
|
Future<void> setRoleDefaultMailbox(Session session, AccountId accountId, List<Mailbox> listMailbox);
|
||||||
|
|
||||||
|
Future<GetMailboxByRoleResponse> getMailboxByRole(Session session, AccountId accountId, Role role, {UnsignedInt? limit});
|
||||||
}
|
}
|
||||||
@@ -0,0 +1,20 @@
|
|||||||
|
import 'package:core/presentation/state/failure.dart';
|
||||||
|
import 'package:core/presentation/state/success.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
||||||
|
|
||||||
|
class GetMailboxByRoleLoading extends LoadingState {}
|
||||||
|
|
||||||
|
class GetMailboxByRoleSuccess extends UIState {
|
||||||
|
final Mailbox mailbox;
|
||||||
|
|
||||||
|
GetMailboxByRoleSuccess(this.mailbox);
|
||||||
|
|
||||||
|
@override
|
||||||
|
List<Object> get props => [mailbox];
|
||||||
|
}
|
||||||
|
|
||||||
|
class InvalidMailboxRole extends FeatureFailure {}
|
||||||
|
|
||||||
|
class GetMailboxByRoleFailure extends FeatureFailure {
|
||||||
|
GetMailboxByRoleFailure(dynamic exception) : super(exception: exception);
|
||||||
|
}
|
||||||
@@ -0,0 +1,42 @@
|
|||||||
|
import 'package:core/presentation/state/failure.dart';
|
||||||
|
import 'package:core/presentation/state/success.dart';
|
||||||
|
import 'package:dartz/dartz.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/account_id.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/core/session/session.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/core/unsigned_int.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
||||||
|
import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart';
|
||||||
|
import 'package:tmail_ui_user/features/mailbox/domain/state/get_mailbox_by_role_state.dart';
|
||||||
|
|
||||||
|
class GetMailboxByRoleInteractor {
|
||||||
|
final MailboxRepository _mailboxRepository;
|
||||||
|
|
||||||
|
GetMailboxByRoleInteractor(this._mailboxRepository);
|
||||||
|
|
||||||
|
Stream<Either<Failure, Success>> execute(
|
||||||
|
Session session,
|
||||||
|
AccountId accountId,
|
||||||
|
Role role,
|
||||||
|
{
|
||||||
|
UnsignedInt? limit,
|
||||||
|
}
|
||||||
|
) async* {
|
||||||
|
try {
|
||||||
|
yield Right(GetMailboxByRoleLoading());
|
||||||
|
final response = await _mailboxRepository.getMailboxByRole(
|
||||||
|
session,
|
||||||
|
accountId,
|
||||||
|
role,
|
||||||
|
limit: limit
|
||||||
|
);
|
||||||
|
final mailbox = response.mailbox;
|
||||||
|
if (mailbox != null) {
|
||||||
|
yield Right(GetMailboxByRoleSuccess(mailbox));
|
||||||
|
} else {
|
||||||
|
yield Left(InvalidMailboxRole());
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
yield Left(GetMailboxByRoleFailure(e));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
@@ -25,6 +25,7 @@ import 'package:tmail_ui_user/features/composer/domain/state/update_email_drafts
|
|||||||
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/state/delete_email_permanently_state.dart';
|
import 'package:tmail_ui_user/features/email/domain/state/delete_email_permanently_state.dart';
|
||||||
import 'package:tmail_ui_user/features/email/domain/state/delete_multiple_emails_permanently_state.dart';
|
import 'package:tmail_ui_user/features/email/domain/state/delete_multiple_emails_permanently_state.dart';
|
||||||
|
import 'package:tmail_ui_user/features/email/domain/state/get_restored_deleted_message_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_read_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/presentation/model/composer_arguments.dart';
|
import 'package:tmail_ui_user/features/email/presentation/model/composer_arguments.dart';
|
||||||
@@ -265,6 +266,8 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM
|
|||||||
_refreshMailboxChanges(currentMailboxState: success.currentMailboxState);
|
_refreshMailboxChanges(currentMailboxState: success.currentMailboxState);
|
||||||
} else if (success is EmptySpamFolderSuccess) {
|
} else if (success is EmptySpamFolderSuccess) {
|
||||||
_refreshMailboxChanges(currentMailboxState: success.currentMailboxState);
|
_refreshMailboxChanges(currentMailboxState: success.currentMailboxState);
|
||||||
|
} else if (success is GetRestoredDeletedMessageSuccess) {
|
||||||
|
_refreshMailboxChanges(properties: MailboxConstants.propertiesDefault);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -33,7 +33,8 @@ mixin MailboxWidgetMixin {
|
|||||||
return [
|
return [
|
||||||
if (PlatformInfo.isWeb)
|
if (PlatformInfo.isWeb)
|
||||||
MailboxActions.openInNewTab,
|
MailboxActions.openInNewTab,
|
||||||
MailboxActions.newSubfolder,
|
if (!mailbox.isRecovered)
|
||||||
|
MailboxActions.newSubfolder,
|
||||||
if (mailbox.isTrash)
|
if (mailbox.isTrash)
|
||||||
...[
|
...[
|
||||||
MailboxActions.emptyTrash,
|
MailboxActions.emptyTrash,
|
||||||
|
|||||||
@@ -20,9 +20,11 @@ import 'package:tmail_ui_user/features/email/data/repository/email_repository_im
|
|||||||
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
|
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
|
||||||
import 'package:tmail_ui_user/features/email/domain/usecases/delete_email_permanently_interactor.dart';
|
import 'package:tmail_ui_user/features/email/domain/usecases/delete_email_permanently_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/email/domain/usecases/delete_multiple_emails_permanently_interactor.dart';
|
import 'package:tmail_ui_user/features/email/domain/usecases/delete_multiple_emails_permanently_interactor.dart';
|
||||||
|
import 'package:tmail_ui_user/features/email/domain/usecases/get_restored_deleted_message_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_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/restore_deleted_message_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/email/domain/usecases/unsubscribe_email_interactor.dart';
|
import 'package:tmail_ui_user/features/email/domain/usecases/unsubscribe_email_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/email/presentation/bindings/email_bindings.dart';
|
import 'package:tmail_ui_user/features/email/presentation/bindings/email_bindings.dart';
|
||||||
import 'package:tmail_ui_user/features/home/domain/repository/session_repository.dart';
|
import 'package:tmail_ui_user/features/home/domain/repository/session_repository.dart';
|
||||||
@@ -162,6 +164,8 @@ class MailboxDashBoardBindings extends BaseBindings {
|
|||||||
Get.find<UpdateEmailDraftsInteractor>(),
|
Get.find<UpdateEmailDraftsInteractor>(),
|
||||||
Get.find<DeleteSendingEmailInteractor>(),
|
Get.find<DeleteSendingEmailInteractor>(),
|
||||||
Get.find<UnsubscribeEmailInteractor>(),
|
Get.find<UnsubscribeEmailInteractor>(),
|
||||||
|
Get.find<RestoredDeletedMessageInteractor>(),
|
||||||
|
Get.find<GetRestoredDeletedMessageInterator>(),
|
||||||
));
|
));
|
||||||
Get.put(AdvancedFilterController());
|
Get.put(AdvancedFilterController());
|
||||||
}
|
}
|
||||||
@@ -176,6 +180,8 @@ class MailboxDashBoardBindings extends BaseBindings {
|
|||||||
Get.lazyPut<MailboxDataSource>(() => Get.find<MailboxDataSourceImpl>());
|
Get.lazyPut<MailboxDataSource>(() => Get.find<MailboxDataSourceImpl>());
|
||||||
Get.lazyPut<SessionStorageComposerDatasource>(() => Get.find<SessionStorageComposerDatasourceImpl>());
|
Get.lazyPut<SessionStorageComposerDatasource>(() => Get.find<SessionStorageComposerDatasourceImpl>());
|
||||||
Get.lazyPut<SpamReportDataSource>(() => Get.find<SpamReportDataSourceImpl>());
|
Get.lazyPut<SpamReportDataSource>(() => Get.find<SpamReportDataSourceImpl>());
|
||||||
|
Get.lazyPut<MailboxDataSource>(() => Get.find<MailboxDataSourceImpl>());
|
||||||
|
Get.lazyPut<MailboxCacheDataSourceImpl>(() => Get.find<MailboxCacheDataSourceImpl>());
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -307,6 +313,14 @@ class MailboxDashBoardBindings extends BaseBindings {
|
|||||||
Get.find<MailboxRepository>()
|
Get.find<MailboxRepository>()
|
||||||
));
|
));
|
||||||
Get.lazyPut(() => UnsubscribeEmailInteractor(Get.find<EmailRepository>()));
|
Get.lazyPut(() => UnsubscribeEmailInteractor(Get.find<EmailRepository>()));
|
||||||
|
Get.lazyPut(() => RestoredDeletedMessageInteractor(
|
||||||
|
Get.find<EmailRepository>(),
|
||||||
|
Get.find<MailboxRepository>()
|
||||||
|
));
|
||||||
|
Get.lazyPut(() => GetRestoredDeletedMessageInterator(
|
||||||
|
Get.find<EmailRepository>(),
|
||||||
|
Get.find<MailboxRepository>()
|
||||||
|
));
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -318,6 +332,7 @@ class MailboxDashBoardBindings extends BaseBindings {
|
|||||||
Get.lazyPut<MailboxRepository>(() => Get.find<MailboxRepositoryImpl>());
|
Get.lazyPut<MailboxRepository>(() => Get.find<MailboxRepositoryImpl>());
|
||||||
Get.lazyPut<ComposerCacheRepository>(() => Get.find<ComposerCacheRepositoryImpl>());
|
Get.lazyPut<ComposerCacheRepository>(() => Get.find<ComposerCacheRepositoryImpl>());
|
||||||
Get.lazyPut<SpamReportRepository>(() => Get.find<SpamReportRepositoryImpl>());
|
Get.lazyPut<SpamReportRepository>(() => Get.find<SpamReportRepositoryImpl>());
|
||||||
|
Get.lazyPut<MailboxRepository>(() => Get.find<MailboxRepositoryImpl>());
|
||||||
}
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -353,5 +368,12 @@ class MailboxDashBoardBindings extends BaseBindings {
|
|||||||
DataSourceType.hiveCache: Get.find<HiveSpamReportDataSourceImpl>()
|
DataSourceType.hiveCache: Get.find<HiveSpamReportDataSourceImpl>()
|
||||||
},
|
},
|
||||||
));
|
));
|
||||||
|
Get.lazyPut(() => MailboxRepositoryImpl(
|
||||||
|
{
|
||||||
|
DataSourceType.network: Get.find<MailboxDataSource>(),
|
||||||
|
DataSourceType.local: Get.find<MailboxCacheDataSourceImpl>()
|
||||||
|
},
|
||||||
|
Get.find<StateDataSource>(),
|
||||||
|
));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
+101
-10
@@ -4,6 +4,8 @@ import 'dart:convert';
|
|||||||
import 'package:back_button_interceptor/back_button_interceptor.dart';
|
import 'package:back_button_interceptor/back_button_interceptor.dart';
|
||||||
import 'package:core/core.dart';
|
import 'package:core/core.dart';
|
||||||
import 'package:dartz/dartz.dart';
|
import 'package:dartz/dartz.dart';
|
||||||
|
import 'package:email_recovery/email_recovery/email_recovery_action.dart';
|
||||||
|
import 'package:email_recovery/email_recovery/email_recovery_action_id.dart';
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
|
import 'package:flutter_local_notifications/flutter_local_notifications.dart';
|
||||||
import 'package:flutter_svg/flutter_svg.dart';
|
import 'package:flutter_svg/flutter_svg.dart';
|
||||||
@@ -12,6 +14,7 @@ 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/capability/capability_identifier.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/capability/mail_capability.dart';
|
import 'package:jmap_dart_client/jmap/core/capability/mail_capability.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/error/set_error.dart';
|
import 'package:jmap_dart_client/jmap/core/error/set_error.dart';
|
||||||
|
import 'package:jmap_dart_client/jmap/core/id.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/session/session.dart';
|
import 'package:jmap_dart_client/jmap/core/session/session.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/state.dart' as jmap;
|
import 'package:jmap_dart_client/jmap/core/state.dart' as jmap;
|
||||||
import 'package:jmap_dart_client/jmap/core/unsigned_int.dart';
|
import 'package:jmap_dart_client/jmap/core/unsigned_int.dart';
|
||||||
@@ -45,18 +48,23 @@ import 'package:tmail_ui_user/features/destination_picker/presentation/model/des
|
|||||||
import 'package:tmail_ui_user/features/email/domain/model/mark_read_action.dart';
|
import 'package:tmail_ui_user/features/email/domain/model/mark_read_action.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/restore_deleted_message_request.dart';
|
||||||
import 'package:tmail_ui_user/features/email/domain/state/delete_email_permanently_state.dart';
|
import 'package:tmail_ui_user/features/email/domain/state/delete_email_permanently_state.dart';
|
||||||
import 'package:tmail_ui_user/features/email/domain/state/delete_multiple_emails_permanently_state.dart';
|
import 'package:tmail_ui_user/features/email/domain/state/delete_multiple_emails_permanently_state.dart';
|
||||||
import 'package:tmail_ui_user/features/email/domain/state/delete_sending_email_state.dart';
|
import 'package:tmail_ui_user/features/email/domain/state/delete_sending_email_state.dart';
|
||||||
|
import 'package:tmail_ui_user/features/email/domain/state/get_restored_deleted_message_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_read_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/restore_deleted_message_state.dart';
|
||||||
import 'package:tmail_ui_user/features/email/domain/state/store_sending_email_state.dart';
|
import 'package:tmail_ui_user/features/email/domain/state/store_sending_email_state.dart';
|
||||||
import 'package:tmail_ui_user/features/email/domain/state/unsubscribe_email_state.dart';
|
import 'package:tmail_ui_user/features/email/domain/state/unsubscribe_email_state.dart';
|
||||||
import 'package:tmail_ui_user/features/email/domain/usecases/delete_email_permanently_interactor.dart';
|
import 'package:tmail_ui_user/features/email/domain/usecases/delete_email_permanently_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/email/domain/usecases/delete_multiple_emails_permanently_interactor.dart';
|
import 'package:tmail_ui_user/features/email/domain/usecases/delete_multiple_emails_permanently_interactor.dart';
|
||||||
|
import 'package:tmail_ui_user/features/email/domain/usecases/get_restored_deleted_message_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_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/restore_deleted_message_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/email/domain/usecases/unsubscribe_email_interactor.dart';
|
import 'package:tmail_ui_user/features/email/domain/usecases/unsubscribe_email_interactor.dart';
|
||||||
import 'package:tmail_ui_user/features/email/presentation/action/email_ui_action.dart';
|
import 'package:tmail_ui_user/features/email/presentation/action/email_ui_action.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';
|
||||||
@@ -147,6 +155,7 @@ import 'package:tmail_ui_user/main/routes/navigation_router.dart';
|
|||||||
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
|
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
|
||||||
import 'package:tmail_ui_user/main/routes/route_utils.dart';
|
import 'package:tmail_ui_user/main/routes/route_utils.dart';
|
||||||
import 'package:tmail_ui_user/main/utils/email_receive_manager.dart';
|
import 'package:tmail_ui_user/main/utils/email_receive_manager.dart';
|
||||||
|
import 'package:uuid/uuid.dart';
|
||||||
import 'package:workmanager/workmanager.dart' as work_manager;
|
import 'package:workmanager/workmanager.dart' as work_manager;
|
||||||
|
|
||||||
class MailboxDashBoardController extends ReloadableController {
|
class MailboxDashBoardController extends ReloadableController {
|
||||||
@@ -181,6 +190,8 @@ class MailboxDashBoardController extends ReloadableController {
|
|||||||
final UpdateEmailDraftsInteractor _updateEmailDraftsInteractor;
|
final UpdateEmailDraftsInteractor _updateEmailDraftsInteractor;
|
||||||
final DeleteSendingEmailInteractor _deleteSendingEmailInteractor;
|
final DeleteSendingEmailInteractor _deleteSendingEmailInteractor;
|
||||||
final UnsubscribeEmailInteractor _unsubscribeEmailInteractor;
|
final UnsubscribeEmailInteractor _unsubscribeEmailInteractor;
|
||||||
|
final RestoredDeletedMessageInteractor _restoreDeletedMessageInteractor;
|
||||||
|
final GetRestoredDeletedMessageInterator _getRestoredDeletedMessageInteractor;
|
||||||
|
|
||||||
GetAllVacationInteractor? _getAllVacationInteractor;
|
GetAllVacationInteractor? _getAllVacationInteractor;
|
||||||
UpdateVacationInteractor? _updateVacationInteractor;
|
UpdateVacationInteractor? _updateVacationInteractor;
|
||||||
@@ -212,6 +223,7 @@ class MailboxDashBoardController extends ReloadableController {
|
|||||||
final listSendingEmails = RxList<SendingEmail>();
|
final listSendingEmails = RxList<SendingEmail>();
|
||||||
final refreshingMailboxState = Rx<Either<Failure, Success>>(Right(UIState.idle));
|
final refreshingMailboxState = Rx<Either<Failure, Success>>(Right(UIState.idle));
|
||||||
final draggableAppState = Rxn<DraggableAppState>();
|
final draggableAppState = Rxn<DraggableAppState>();
|
||||||
|
final isRecoveringDeletedMessage = RxBool(false);
|
||||||
|
|
||||||
Session? sessionCurrent;
|
Session? sessionCurrent;
|
||||||
Map<Role, MailboxId> mapDefaultMailboxIdByRole = {};
|
Map<Role, MailboxId> mapDefaultMailboxIdByRole = {};
|
||||||
@@ -258,6 +270,8 @@ class MailboxDashBoardController extends ReloadableController {
|
|||||||
this._updateEmailDraftsInteractor,
|
this._updateEmailDraftsInteractor,
|
||||||
this._deleteSendingEmailInteractor,
|
this._deleteSendingEmailInteractor,
|
||||||
this._unsubscribeEmailInteractor,
|
this._unsubscribeEmailInteractor,
|
||||||
|
this._restoreDeletedMessageInteractor,
|
||||||
|
this._getRestoredDeletedMessageInteractor,
|
||||||
);
|
);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -353,6 +367,11 @@ class MailboxDashBoardController extends ReloadableController {
|
|||||||
getAllSendingEmails();
|
getAllSendingEmails();
|
||||||
} else if (success is UnsubscribeEmailSuccess) {
|
} else if (success is UnsubscribeEmailSuccess) {
|
||||||
_handleUnsubscribeMailSuccess(success.newEmail);
|
_handleUnsubscribeMailSuccess(success.newEmail);
|
||||||
|
} else if (success is RestoreDeletedMessageSuccess) {
|
||||||
|
dispatchMailboxUIAction(RefreshChangeMailboxAction(success.currentMailboxState));
|
||||||
|
_handleRestoreDeletedMessageSuccess(success.emailRecoveryAction.id!);
|
||||||
|
} else if (success is GetRestoredDeletedMessageSuccess) {
|
||||||
|
_handleGetRestoredDeletedMessageSuccess(success);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -373,6 +392,10 @@ class MailboxDashBoardController extends ReloadableController {
|
|||||||
_markAsReadMailboxFailure(failure);
|
_markAsReadMailboxFailure(failure);
|
||||||
} else if (failure is GetEmailByIdFailure) {
|
} else if (failure is GetEmailByIdFailure) {
|
||||||
_handleGetEmailDetailedFailed(failure);
|
_handleGetEmailDetailedFailed(failure);
|
||||||
|
} else if (failure is RestoreDeletedMessageFailure) {
|
||||||
|
_handleRestoreDeletedMessageFailed();
|
||||||
|
} else if (failure is GetRestoredDeletedMessageFailure) {
|
||||||
|
_handleRestoreDeletedMessageFailed();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -2427,28 +2450,96 @@ class MailboxDashBoardController extends ReloadableController {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void _handleRestoreDeletedMessageSuccess(EmailRecoveryActionId emailRecoveryActionId) async {
|
||||||
|
log('MailboxDashBoardController::_handleRestoreDeletedMessageSuccess():emailRecoveryActionId: $emailRecoveryActionId');
|
||||||
|
_getRestoredDeletedMessage(emailRecoveryActionId);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _getRestoredDeletedMessage(EmailRecoveryActionId emailRecoveryActionId) {
|
||||||
|
consumeState(_getRestoredDeletedMessageInteractor.execute(sessionCurrent!, accountId.value!, emailRecoveryActionId));
|
||||||
|
}
|
||||||
|
|
||||||
|
void _handleRestoreDeletedMessageFailed() {
|
||||||
|
appToast.showToastErrorMessage(
|
||||||
|
currentOverlayContext!,
|
||||||
|
AppLocalizations.of(currentOverlayContext!).restoreDeletedMessageFailed
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
void _handleGetRestoredDeletedMessageSuccess(GetRestoredDeletedMessageSuccess success) async {
|
||||||
|
if (selectedMailbox.value != null && selectedMailbox.value!.isRecovered) {
|
||||||
|
dispatchEmailUIAction(RefreshChangeEmailAction(null));
|
||||||
|
}
|
||||||
|
|
||||||
|
if (success is GetRestoredDeletedMessageCompleted) {
|
||||||
|
isRecoveringDeletedMessage.value = false;
|
||||||
|
if (success.recoveredMailbox != null) {
|
||||||
|
appToast.showToastMessage(
|
||||||
|
currentOverlayContext!,
|
||||||
|
AppLocalizations.of(currentContext!).restoreDeletedMessageSuccess,
|
||||||
|
actionName: AppLocalizations.of(currentContext!).open,
|
||||||
|
onActionClick: () => openMailboxAction(success.recoveredMailbox!.toPresentationMailbox()),
|
||||||
|
leadingSVGIcon: imagePaths.icRecoverDeletedMessages,
|
||||||
|
leadingSVGIconColor: Colors.white,
|
||||||
|
backgroundColor: AppColor.toastSuccessBackgroundColor,
|
||||||
|
textColor: Colors.white,
|
||||||
|
actionIcon: SvgPicture.asset(
|
||||||
|
imagePaths.icFolderMailbox,
|
||||||
|
colorFilter: Colors.white.asFilter(),
|
||||||
|
)
|
||||||
|
);
|
||||||
|
} else {
|
||||||
|
appToast.showToastSuccessMessage(
|
||||||
|
currentOverlayContext!,
|
||||||
|
AppLocalizations.of(currentContext!).restoreDeletedMessageSuccess
|
||||||
|
);
|
||||||
|
}
|
||||||
|
} else if (success is GetRestoredDeletedMessageInProgress || success is GetRestoredDeletedMessageWaiting) {
|
||||||
|
await Future.delayed(const Duration(seconds: 2));
|
||||||
|
_getRestoredDeletedMessage(success.emailRecoveryAction.id!);
|
||||||
|
} else if (success is GetRestoredDeletedMessageCanceled) {
|
||||||
|
isRecoveringDeletedMessage.value = false;
|
||||||
|
appToast.showToastMessage(
|
||||||
|
currentOverlayContext!,
|
||||||
|
AppLocalizations.of(currentContext!).restoreDeletedMessageCanceled,
|
||||||
|
leadingSVGIcon: imagePaths.icRecoverDeletedMessages,
|
||||||
|
leadingSVGIconColor: Colors.white,
|
||||||
|
backgroundColor: AppColor.primaryColor,
|
||||||
|
textColor: Colors.white,
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void gotoEmailRecovery() async {
|
void gotoEmailRecovery() async {
|
||||||
closeMailboxMenuDrawer();
|
closeMailboxMenuDrawer();
|
||||||
|
|
||||||
final currentAccountId = accountId.value;
|
final currentAccountId = accountId.value;
|
||||||
final currentSession = sessionCurrent;
|
final currentSession = sessionCurrent;
|
||||||
if (currentAccountId != null && currentSession != null) {
|
if (currentAccountId != null && currentSession != null) {
|
||||||
final arguments = EmailRecoveryArguments(currentAccountId, currentSession);
|
final arguments = EmailRecoveryArguments(currentAccountId, currentSession);
|
||||||
|
|
||||||
if (PlatformInfo.isWeb) {
|
final result = PlatformInfo.isWeb
|
||||||
await DialogRouter.pushGeneralDialog(
|
? await DialogRouter.pushGeneralDialog(
|
||||||
routeName: AppRoutes.emailRecovery,
|
routeName: AppRoutes.emailRecovery,
|
||||||
arguments: arguments,
|
arguments: arguments,
|
||||||
);
|
)
|
||||||
} else {
|
: await push(AppRoutes.emailRecovery, arguments: arguments);
|
||||||
await push(
|
|
||||||
AppRoutes.emailRecovery,
|
if (result is EmailRecoveryAction) {
|
||||||
arguments: arguments
|
log('MailboxDashBoardController::gotoEmailRecovery():result: $result');
|
||||||
);
|
handleRestoreEmailAction(result);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void handleRestoreEmailAction(EmailRecoveryAction emailRecoveryAction) {
|
||||||
|
log('MailboxController::_handleRestoreEmailAction');
|
||||||
|
final generateId = Id(const Uuid().v4());
|
||||||
|
final restoreDeletedMessageRequest = RestoredDeletedMessageRequest(generateId, emailRecoveryAction);
|
||||||
|
|
||||||
|
consumeState(_restoreDeletedMessageInteractor.execute(sessionCurrent!, accountId.value!, restoreDeletedMessageRequest));
|
||||||
|
isRecoveringDeletedMessage.value = true;
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
void onClose() {
|
void onClose() {
|
||||||
_emailReceiveManager.closeEmailReceiveManagerStream();
|
_emailReceiveManager.closeEmailReceiveManagerStream();
|
||||||
|
|||||||
@@ -155,7 +155,7 @@ class MailboxDashBoardView extends BaseMailboxDashBoardView {
|
|||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
Obx(() => RecoverDeletedMessageLoadingBannerWidget(
|
Obx(() => RecoverDeletedMessageLoadingBannerWidget(
|
||||||
viewState: controller.viewStateRestoreDeletedMessage.value,
|
isLoading: controller.isRecoveringDeletedMessage.value,
|
||||||
horizontalLoadingWidget: horizontalLoadingWidget,
|
horizontalLoadingWidget: horizontalLoadingWidget,
|
||||||
responsiveUtils: controller.responsiveUtils,
|
responsiveUtils: controller.responsiveUtils,
|
||||||
)),
|
)),
|
||||||
|
|||||||
+42
-60
@@ -1,81 +1,63 @@
|
|||||||
import 'package:core/presentation/extensions/color_extension.dart';
|
import 'package:core/presentation/extensions/color_extension.dart';
|
||||||
import 'package:core/presentation/state/failure.dart';
|
|
||||||
import 'package:core/presentation/state/success.dart';
|
|
||||||
import 'package:core/presentation/utils/responsive_utils.dart';
|
import 'package:core/presentation/utils/responsive_utils.dart';
|
||||||
import 'package:core/utils/app_logger.dart';
|
|
||||||
import 'package:dartz/dartz.dart';
|
|
||||||
import 'package:flutter/material.dart';
|
import 'package:flutter/material.dart';
|
||||||
import 'package:tmail_ui_user/features/email/domain/state/get_restored_deleted_message_state.dart';
|
|
||||||
import 'package:tmail_ui_user/features/email/domain/state/restore_deleted_message_state.dart';
|
|
||||||
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
import 'package:tmail_ui_user/main/localizations/app_localizations.dart';
|
||||||
|
|
||||||
class RecoverDeletedMessageLoadingBannerWidget extends StatelessWidget {
|
class RecoverDeletedMessageLoadingBannerWidget extends StatelessWidget {
|
||||||
final Either<Failure, Success> viewState;
|
final bool isLoading;
|
||||||
final Widget horizontalLoadingWidget;
|
final Widget horizontalLoadingWidget;
|
||||||
final ResponsiveUtils responsiveUtils;
|
final ResponsiveUtils responsiveUtils;
|
||||||
|
|
||||||
const RecoverDeletedMessageLoadingBannerWidget({
|
const RecoverDeletedMessageLoadingBannerWidget({
|
||||||
super.key,
|
super.key,
|
||||||
required this.viewState,
|
required this.isLoading,
|
||||||
required this.horizontalLoadingWidget,
|
required this.horizontalLoadingWidget,
|
||||||
required this.responsiveUtils,
|
required this.responsiveUtils,
|
||||||
});
|
});
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Widget build(BuildContext context) {
|
Widget build(BuildContext context) {
|
||||||
return viewState.fold(
|
if (isLoading) {
|
||||||
(failure) {
|
return Padding(
|
||||||
log('RecoverDeletedMessageLoadingBannerWidget:: failure $failure');
|
padding: EdgeInsetsDirectional.only(
|
||||||
return const SizedBox.shrink();
|
top: responsiveUtils.isDesktop(context) ? 16 : 0,
|
||||||
|
end: 16,
|
||||||
},
|
bottom: responsiveUtils.isDesktop(context) ? 0 : 16,
|
||||||
(success) {
|
),
|
||||||
if (success is RestoreDeletedMessageLoading
|
child: Container(
|
||||||
|| success is RestoreDeletedMessageSuccess
|
padding: const EdgeInsets.symmetric(
|
||||||
|| success is GetRestoredDeletedMessageLoading
|
horizontal: 16,
|
||||||
) {
|
vertical: 12,
|
||||||
return Padding(
|
),
|
||||||
padding: EdgeInsets.only(
|
decoration: const ShapeDecoration(
|
||||||
top: responsiveUtils.isDesktop(context) ? 16 : 0,
|
color: Colors.white,
|
||||||
right: 16,
|
shape: RoundedRectangleBorder(
|
||||||
bottom: responsiveUtils.isDesktop(context) ? 0 : 16,
|
side: BorderSide(
|
||||||
),
|
width: 1,
|
||||||
child: Container(
|
color: AppColor.colorBorderBodyThread,
|
||||||
padding: const EdgeInsets.symmetric(
|
|
||||||
horizontal: 16,
|
|
||||||
vertical: 12,
|
|
||||||
),
|
),
|
||||||
decoration: const ShapeDecoration(
|
borderRadius: BorderRadius.all(Radius.circular(14)),
|
||||||
color: Colors.white,
|
)
|
||||||
shape: RoundedRectangleBorder(
|
),
|
||||||
side: BorderSide(
|
child: Column(
|
||||||
width: 1,
|
crossAxisAlignment: CrossAxisAlignment.start,
|
||||||
color: AppColor.colorBorderBodyThread,
|
children: [
|
||||||
),
|
Text(
|
||||||
borderRadius: BorderRadius.all(Radius.circular(14)),
|
AppLocalizations.of(context).bannerProgressingRecoveryMessage,
|
||||||
)
|
style: const TextStyle(
|
||||||
|
fontSize: 15,
|
||||||
|
fontWeight: FontWeight.w400,
|
||||||
|
color: AppColor.primaryColor,
|
||||||
|
),
|
||||||
),
|
),
|
||||||
child: Column(
|
const SizedBox(height: 12),
|
||||||
crossAxisAlignment: CrossAxisAlignment.start,
|
horizontalLoadingWidget
|
||||||
children: [
|
],
|
||||||
Text(
|
),
|
||||||
AppLocalizations.of(context).bannerProgressingRecoveryMessage,
|
),
|
||||||
style: const TextStyle(
|
);
|
||||||
fontSize: 15,
|
} else {
|
||||||
fontWeight: FontWeight.w400,
|
return const SizedBox.shrink();
|
||||||
color: AppColor.primaryColor,
|
}
|
||||||
),
|
|
||||||
),
|
|
||||||
const SizedBox(height: 12),
|
|
||||||
horizontalLoadingWidget
|
|
||||||
],
|
|
||||||
),
|
|
||||||
),
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
return const SizedBox.shrink();
|
|
||||||
}
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -138,7 +138,7 @@ class ThreadView extends GetWidget<ThreadController>
|
|||||||
}
|
}
|
||||||
}),
|
}),
|
||||||
Obx(() => RecoverDeletedMessageLoadingBannerWidget(
|
Obx(() => RecoverDeletedMessageLoadingBannerWidget(
|
||||||
viewState: controller.mailboxDashBoardController.viewStateRestoreDeletedMessage.value,
|
isLoading: controller.mailboxDashBoardController.isRecoveringDeletedMessage.value,
|
||||||
horizontalLoadingWidget: horizontalLoadingWidget,
|
horizontalLoadingWidget: horizontalLoadingWidget,
|
||||||
responsiveUtils: controller.responsiveUtils,
|
responsiveUtils: controller.responsiveUtils,
|
||||||
)),
|
)),
|
||||||
|
|||||||
@@ -1,5 +1,5 @@
|
|||||||
{
|
{
|
||||||
"@@last_modified": "2023-12-19T16:58:54.709520",
|
"@@last_modified": "2024-01-07T14:01:28.226469",
|
||||||
"initializing_data": "Initializing data...",
|
"initializing_data": "Initializing data...",
|
||||||
"@initializing_data": {
|
"@initializing_data": {
|
||||||
"type": "text",
|
"type": "text",
|
||||||
@@ -3618,10 +3618,16 @@
|
|||||||
"placeholders_order": [],
|
"placeholders_order": [],
|
||||||
"placeholders": {}
|
"placeholders": {}
|
||||||
},
|
},
|
||||||
"bannerProgressingRecoveryMessage": "The recovery is in progress. You can continue using TeamMail",
|
"bannerProgressingRecoveryMessage": "The recovery is in progress. You can continue using Twake Mail",
|
||||||
"@bannerProgressingRecoveryMessage": {
|
"@bannerProgressingRecoveryMessage": {
|
||||||
"type": "text",
|
"type": "text",
|
||||||
"placeholders_order": [],
|
"placeholders_order": [],
|
||||||
"placeholders": {}
|
"placeholders": {}
|
||||||
|
},
|
||||||
|
"restoreDeletedMessageCanceled": "Restore deleted message canceled",
|
||||||
|
"@restoreDeletedMessageCanceled": {
|
||||||
|
"type": "text",
|
||||||
|
"placeholders_order": [],
|
||||||
|
"placeholders": {}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -3768,8 +3768,15 @@ class AppLocalizations {
|
|||||||
|
|
||||||
String get bannerProgressingRecoveryMessage {
|
String get bannerProgressingRecoveryMessage {
|
||||||
return Intl.message(
|
return Intl.message(
|
||||||
'The recovery is in progress. You can continue using TwakeMail',
|
'The recovery is in progress. You can continue using Twake Mail',
|
||||||
name: 'bannerProgressingRecoveryMessage',
|
name: 'bannerProgressingRecoveryMessage',
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
String get restoreDeletedMessageCanceled {
|
||||||
|
return Intl.message(
|
||||||
|
'Restore deleted message canceled',
|
||||||
|
name: 'restoreDeletedMessageCanceled',
|
||||||
|
);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
@@ -45,6 +45,8 @@ extension PresentationMailboxExtension on PresentationMailbox {
|
|||||||
|
|
||||||
bool get isArchive => role == PresentationMailbox.roleArchive;
|
bool get isArchive => role == PresentationMailbox.roleArchive;
|
||||||
|
|
||||||
|
bool get isRecovered => role == PresentationMailbox.roleRecovered;
|
||||||
|
|
||||||
bool get isSubscribedMailbox => isSubscribed != null && isSubscribed?.value == true;
|
bool get isSubscribedMailbox => isSubscribed != null && isSubscribed?.value == true;
|
||||||
|
|
||||||
bool get allowedToDisplayCountOfUnreadEmails => !(isTrash || isSpam || isDrafts || isTemplates || isSent) && countUnreadEmails > 0;
|
bool get allowedToDisplayCountOfUnreadEmails => !(isTrash || isSpam || isDrafts || isTemplates || isSent) && countUnreadEmails > 0;
|
||||||
|
|||||||
Reference in New Issue
Block a user