TF-3189 new option to enable/disable subaddressing for a personal folder

This commit is contained in:
Florent Azavant
2024-10-21 16:29:26 +02:00
committed by Dat H. Pham
parent f8f248fc3c
commit 89d80fe142
36 changed files with 455 additions and 4 deletions
@@ -0,0 +1,17 @@
import 'package:tmail_ui_user/features/base/upgradeable/upgrade_database_steps.dart';
import 'package:tmail_ui_user/features/caching/caching_manager.dart';
class UpgradeHiveDatabaseStepsV13 extends UpgradeDatabaseSteps {
final CachingManager _cachingManager;
UpgradeHiveDatabaseStepsV13(this._cachingManager);
@override
Future<void> onUpgrade(int oldVersion, int newVersion) async {
if (oldVersion > 0 && oldVersion < newVersion && newVersion == 13) {
await _cachingManager.clearMailboxCache();
}
}
}
@@ -118,6 +118,12 @@ class CachingManager {
], eagerError: true);
}
Future<void> clearMailboxCache() {
return Future.wait([
_mailboxCacheClient.clearAllData(),
], eagerError: true);
}
Future<bool> storeCacheVersion(int newVersion) async {
log('CachingManager::storeCacheVersion():newVersion = $newVersion');
return _hiveCacheVersionClient.storeVersion(newVersion);
@@ -9,6 +9,7 @@ import 'package:path_provider/path_provider.dart' as path_provider;
import 'package:tmail_ui_user/features/base/upgradeable/upgrade_hive_database_steps_v10.dart';
import 'package:tmail_ui_user/features/base/upgradeable/upgrade_hive_database_steps_v11.dart';
import 'package:tmail_ui_user/features/base/upgradeable/upgrade_hive_database_steps_v12.dart';
import 'package:tmail_ui_user/features/base/upgradeable/upgrade_hive_database_steps_v13.dart';
import 'package:tmail_ui_user/features/base/upgradeable/upgrade_hive_database_steps_v7.dart';
import 'package:tmail_ui_user/features/caching/caching_manager.dart';
import 'package:tmail_ui_user/features/caching/config/cache_version.dart';
@@ -70,6 +71,7 @@ class HiveCacheConfig {
await UpgradeHiveDatabaseStepsV10(cachingManager).onUpgrade(oldVersion, newVersion);
await UpgradeHiveDatabaseStepsV11(cachingManager).onUpgrade(oldVersion, newVersion);
await UpgradeHiveDatabaseStepsV12(cachingManager).onUpgrade(oldVersion, newVersion);
await UpgradeHiveDatabaseStepsV13(cachingManager).onUpgrade(oldVersion, newVersion);
if (oldVersion != newVersion) {
await cachingManager.storeCacheVersion(newVersion);
@@ -18,6 +18,7 @@ import 'package:tmail_ui_user/features/mailbox/domain/model/get_mailbox_by_role_
import 'package:tmail_ui_user/features/mailbox/domain/model/jmap_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/rename_mailbox_request.dart';
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_right_request.dart';
import 'package:tmail_ui_user/features/mailbox/domain/model/subscribe_mailbox_request.dart';
import 'package:tmail_ui_user/features/mailbox/domain/model/subscribe_multiple_mailbox_request.dart';
@@ -49,6 +50,8 @@ abstract class MailboxDataSource {
Future<List<MailboxId>> subscribeMultipleMailbox(Session session, AccountId accountId, SubscribeMultipleMailboxRequest subscribeRequest);
Future<bool> handleMailboxRightRequest(Session session, AccountId accountId, MailboxRightRequest request);
Future<List<Mailbox>> createDefaultMailbox(Session session, AccountId accountId, List<Role> listRole);
Future<void> setRoleDefaultMailbox(Session session, AccountId accountId, List<Mailbox> listMailbox);
@@ -23,6 +23,7 @@ import 'package:tmail_ui_user/features/mailbox/domain/model/get_mailbox_by_role_
import 'package:tmail_ui_user/features/mailbox/domain/model/jmap_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/rename_mailbox_request.dart';
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_right_request.dart';
import 'package:tmail_ui_user/features/mailbox/domain/model/subscribe_mailbox_request.dart';
import 'package:tmail_ui_user/features/mailbox/domain/model/subscribe_multiple_mailbox_request.dart';
import 'package:tmail_ui_user/main/exceptions/exception_thrower.dart';
@@ -134,6 +135,11 @@ class MailboxCacheDataSourceImpl extends MailboxDataSource {
throw UnimplementedError();
}
@override
Future<bool> handleMailboxRightRequest(Session session, AccountId accountId, MailboxRightRequest request) {
throw UnimplementedError();
}
@override
Future<List<Mailbox>> createDefaultMailbox(Session session, AccountId accountId, List<Role> listRole) {
throw UnimplementedError();
@@ -22,6 +22,7 @@ import 'package:tmail_ui_user/features/mailbox/domain/model/get_mailbox_by_role_
import 'package:tmail_ui_user/features/mailbox/domain/model/jmap_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/rename_mailbox_request.dart';
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_right_request.dart';
import 'package:tmail_ui_user/features/mailbox/domain/model/subscribe_mailbox_request.dart';
import 'package:tmail_ui_user/features/mailbox/domain/model/subscribe_multiple_mailbox_request.dart';
import 'package:tmail_ui_user/main/exceptions/exception_thrower.dart';
@@ -121,6 +122,13 @@ class MailboxDataSourceImpl extends MailboxDataSource {
}).catchError(_exceptionThrower.throwException);
}
@override
Future<bool> handleMailboxRightRequest(Session session, AccountId accountId, MailboxRightRequest request) {
return Future.sync(() async {
return await mailboxAPI.handleMailboxRightRequest(session, accountId, request);
}).catchError(_exceptionThrower.throwException);
}
@override
Future<List<Mailbox>> createDefaultMailbox(Session session, AccountId accountId, List<Role> listRole) {
return Future.sync(() async {
@@ -20,7 +20,8 @@ extension MailboxCacheExtension on MailboxCache {
unreadThreads: unreadThreads != null ? UnreadThreads(UnsignedInt(unreadThreads!)) : null,
myRights: myRights?.toMailboxRights(),
isSubscribed: isSubscribed != null ? IsSubscribed(isSubscribed!) : null,
namespace: namespace != null ? Namespace(namespace!) : null
namespace: namespace != null ? Namespace(namespace!) : null,
rights: rights != null ? Map<String, List<String>?>.from(rights!) : null,
);
}
}
@@ -17,7 +17,8 @@ extension MailboxExtension on Mailbox {
unreadThreads: unreadThreads?.value.value.round(),
myRights: myRights?.toMailboxRightsCache(),
isSubscribed: isSubscribed?.value,
namespace: namespace?.value
namespace: namespace?.value,
rights: rights?.map((key, value) => MapEntry(key, value)),
);
}
}
@@ -48,6 +48,9 @@ class MailboxCache extends HiveObject with EquatableMixin {
@HiveField(12)
final String? namespace;
@HiveField(13)
final Map<String, List<String>?>? rights;
MailboxCache(
this.id,
{
@@ -63,6 +66,7 @@ class MailboxCache extends HiveObject with EquatableMixin {
this.isSubscribed,
this.lastOpened,
this.namespace,
this.rights
}
);
@@ -80,5 +84,6 @@ class MailboxCache extends HiveObject with EquatableMixin {
myRights,
isSubscribed,
namespace,
rights
];
}
@@ -2,6 +2,8 @@ import 'dart:async';
import 'package:collection/collection.dart';
import 'package:core/utils/app_logger.dart';
import 'package:flutter/material.dart' hide State;
import 'package:get/get.dart';
import 'package:jmap_dart_client/http/http_client.dart';
import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/core/capability/capability_identifier.dart';
@@ -26,20 +28,24 @@ import 'package:jmap_dart_client/jmap/mail/mailbox/query/query_mailbox_method.da
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:model/error_type_handler/set_method_error_handler_mixin.dart';
import 'package:model/mailbox/mailbox_constants.dart';
import 'package:model/model.dart';
import 'package:tmail_ui_user/features/base/mixin/handle_error_mixin.dart';
import 'package:tmail_ui_user/features/composer/domain/exceptions/set_method_exception.dart';
import 'package:tmail_ui_user/features/mailbox/data/model/mailbox_change_response.dart';
import 'package:tmail_ui_user/features/mailbox/domain/exceptions/mailbox_exception.dart';
import 'package:tmail_ui_user/features/mailbox/domain/exceptions/set_mailbox_method_exception.dart';
import 'package:tmail_ui_user/features/mailbox/domain/exceptions/set_mailbox_rights_exception.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/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/jmap_mailbox_response.dart';
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_subaddressing_action.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/rename_mailbox_request.dart';
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_right_request.dart';
import 'package:tmail_ui_user/features/mailbox/domain/model/subscribe_mailbox_request.dart';
import 'package:tmail_ui_user/features/mailbox/domain/model/subscribe_multiple_mailbox_request.dart';
import 'package:tmail_ui_user/main/error/capability_validator.dart';
@@ -401,6 +407,53 @@ class MailboxAPI with HandleSetErrorMixin {
return listMailboxIdSubscribe ?? [];
}
List<String> _updateRightsForSubaddressing(MailboxSubaddressingAction action, List<String>? currentRights) {
final updatedRights = List<String>.from(currentRights ?? []);
if (action == MailboxSubaddressingAction.allow) {
updatedRights.addIf(!updatedRights.contains(postingRight), postingRight);
} else {
updatedRights.remove(postingRight);
}
return updatedRights;
}
@visibleForTesting
List<String> updateRightsForSubaddressing(MailboxSubaddressingAction action, List<String>? currentRights)
=> _updateRightsForSubaddressing(action, currentRights);
Future<bool> handleMailboxRightRequest(Session session, AccountId accountId, MailboxRightRequest request) async {
final setMailboxMethod = SetMailboxMethod(accountId)
..addUpdates({
request.mailboxId.id : PatchObject({
'sharedWith/$anyoneIdentifier': _updateRightsForSubaddressing(request.subaddressingAction, request.currentRights?[anyoneIdentifier])
})
});
final requestBuilder = JmapRequestBuilder(httpClient, ProcessingInvocation());
final setMailboxInvocation = requestBuilder.invocation(setMailboxMethod);
final capabilities = setMailboxMethod.requiredCapabilities
.toCapabilitiesSupportTeamMailboxes(session, accountId);
final response = await (requestBuilder
..usings(capabilities))
.build()
.execute();
final setMailboxResponse = response.parse<SetMailboxResponse>(
setMailboxInvocation.methodCallId,
SetMailboxResponse.deserialize);
if (setMailboxResponse?.updated?.containsKey(request.mailboxId.id) ?? false) {
return true;
} else {
throw SetMailboxRightsException();
}
}
Future<List<Mailbox>> createDefaultMailbox(
Session session,
AccountId accountId,
@@ -30,6 +30,7 @@ import 'package:tmail_ui_user/features/mailbox/domain/model/jmap_mailbox_respons
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/rename_mailbox_request.dart';
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_right_request.dart';
import 'package:tmail_ui_user/features/mailbox/domain/model/subscribe_mailbox_request.dart';
import 'package:tmail_ui_user/features/mailbox/domain/model/subscribe_multiple_mailbox_request.dart';
import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart';
@@ -285,6 +286,11 @@ class MailboxRepositoryImpl extends MailboxRepository {
return mapDataSource[DataSourceType.network]!.subscribeMultipleMailbox(session, accountId, subscribeRequest);
}
@override
Future<bool> handleMailboxRightRequest(Session session, AccountId accountId, MailboxRightRequest request) {
return mapDataSource[DataSourceType.network]!.handleMailboxRightRequest(session, accountId, request);
}
@override
Future<List<Mailbox>> createDefaultMailbox(Session session, AccountId accountId, List<Role> listRole) {
return mapDataSource[DataSourceType.network]!.createDefaultMailbox(session, accountId, listRole);
@@ -16,7 +16,8 @@ class MailboxConstants {
MailboxProperty.unreadEmails,
MailboxProperty.unreadThreads,
MailboxProperty.myRights,
MailboxProperty.namespace
MailboxProperty.namespace,
MailboxProperty.rights
});
static final List<Role> defaultMailboxRoles = [
@@ -0,0 +1,8 @@
class NullSessionOrAccountIdException implements Exception {
NullSessionOrAccountIdException();
@override
String toString() => 'NullSessionOrAccountIdException: session and accountId should not be null';
}
@@ -0,0 +1,8 @@
class SetMailboxRightsException implements Exception {
SetMailboxRightsException();
@override
String toString() => 'Failed to update mailbox rights.';
}
@@ -0,0 +1,23 @@
import 'package:equatable/equatable.dart';
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_subaddressing_action.dart';
class MailboxRightRequest with EquatableMixin {
final MailboxSubaddressingAction subaddressingAction;
final MailboxId mailboxId;
final Map<String, List<String>?>? currentRights;
MailboxRightRequest(
this.mailboxId,
this.currentRights,
this.subaddressingAction
);
@override
List<Object?> get props => [
mailboxId,
currentRights,
subaddressingAction,
];
}
@@ -0,0 +1,4 @@
enum MailboxSubaddressingAction {
allow,
disallow,
}
@@ -19,6 +19,7 @@ import 'package:tmail_ui_user/features/mailbox/domain/model/move_mailbox_request
import 'package:tmail_ui_user/features/mailbox/domain/model/rename_mailbox_request.dart';
import 'package:tmail_ui_user/features/mailbox/domain/model/subscribe_mailbox_request.dart';
import 'package:tmail_ui_user/features/mailbox/domain/model/subscribe_multiple_mailbox_request.dart';
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_right_request.dart';
abstract class MailboxRepository {
Stream<MailboxResponse> getAllMailbox(Session session, AccountId accountId, {Properties? properties});
@@ -46,6 +47,8 @@ abstract class MailboxRepository {
Future<List<MailboxId>> subscribeMultipleMailbox(Session session, AccountId accountId, SubscribeMultipleMailboxRequest subscribeRequest);
Future<bool> handleMailboxRightRequest(Session session, AccountId accountId, MailboxRightRequest request);
Future<List<Mailbox>> createDefaultMailbox(Session session, AccountId accountId, List<Role> listRole);
Future<void> setRoleDefaultMailbox(Session session, AccountId accountId, List<Mailbox> listMailbox);
@@ -0,0 +1,37 @@
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.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:tmail_ui_user/features/mailbox/domain/model/mailbox_subaddressing_action.dart';
class LoadingSubaddressingMailbox extends LoadingState {}
class SubaddressingSuccess extends UIActionState {
final MailboxId mailboxId;
final MailboxSubaddressingAction subaddressingAction;
SubaddressingSuccess(
this.mailboxId,
this.subaddressingAction,
{
jmap.State? currentEmailState,
jmap.State? currentMailboxState,
}
) : super(currentEmailState, currentMailboxState);
@override
List<Object?> get props => [
mailboxId,
subaddressingAction,
...super.props
];
}
class SubaddressingFailure extends FeatureFailure {
SubaddressingFailure(dynamic exception) : super(exception: exception);
SubaddressingFailure.withException(Exception exception)
: super(exception: exception);
}
@@ -0,0 +1,36 @@
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:tmail_ui_user/features/mailbox/domain/model/mailbox_right_request.dart';
import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart';
import 'package:tmail_ui_user/features/mailbox/domain/state/subaddressing_mailbox_state.dart';
class SubaddressingInteractor {
final MailboxRepository _mailboxRepository;
SubaddressingInteractor(this._mailboxRepository);
Stream<Either<Failure, Success>> execute(Session session, AccountId accountId, MailboxRightRequest mailboxRightRequest) async* {
try {
yield Right<Failure, Success>(LoadingSubaddressingMailbox());
final currentMailboxState = await _mailboxRepository.getMailboxState(session, accountId);
final result = await _mailboxRepository.handleMailboxRightRequest(session, accountId, mailboxRightRequest);
if (result) {
yield Right<Failure, Success>(SubaddressingSuccess(
mailboxRightRequest.mailboxId,
currentMailboxState: currentMailboxState,
mailboxRightRequest.subaddressingAction));
} else {
yield Left<Failure, Success>(SubaddressingFailure(null));
}
} catch (exception) {
yield Left<Failure, Success>(SubaddressingFailure(exception));
}
}
}
@@ -23,6 +23,7 @@ import 'package:tmail_ui_user/features/mailbox/domain/usecases/get_all_mailbox_i
import 'package:tmail_ui_user/features/mailbox/domain/usecases/move_mailbox_interactor.dart';
import 'package:tmail_ui_user/features/mailbox/domain/usecases/refresh_all_mailbox_interactor.dart';
import 'package:tmail_ui_user/features/mailbox/domain/usecases/rename_mailbox_interactor.dart';
import 'package:tmail_ui_user/features/mailbox/domain/usecases/subaddressing_interactor.dart';
import 'package:tmail_ui_user/features/mailbox/domain/usecases/subscribe_mailbox_interactor.dart';
import 'package:tmail_ui_user/features/mailbox/domain/usecases/subscribe_multiple_mailbox_interactor.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/mailbox_controller.dart';
@@ -57,6 +58,7 @@ class MailboxBindings extends BaseBindings {
Get.find<MoveMailboxInteractor>(),
Get.find<SubscribeMailboxInteractor>(),
Get.find<SubscribeMultipleMailboxInteractor>(),
Get.find<SubaddressingInteractor>(),
Get.find<CreateDefaultMailboxInteractor>(),
Get.find<TreeBuilder>(),
Get.find<VerifyNameInteractor>(),
@@ -107,6 +109,7 @@ class MailboxBindings extends BaseBindings {
Get.lazyPut(() => MoveMailboxInteractor(Get.find<MailboxRepository>()));
Get.lazyPut(() => SubscribeMailboxInteractor(Get.find<MailboxRepository>()));
Get.lazyPut(() => SubscribeMultipleMailboxInteractor(Get.find<MailboxRepository>()));
Get.lazyPut(() => SubaddressingInteractor(Get.find<MailboxRepository>()));
Get.lazyPut(() => CreateDefaultMailboxInteractor(Get.find<MailboxRepository>()));
}
@@ -31,11 +31,14 @@ import 'package:tmail_ui_user/features/home/data/exceptions/session_exceptions.d
import 'package:tmail_ui_user/features/home/domain/extensions/session_extensions.dart';
import 'package:tmail_ui_user/features/mailbox/domain/constants/mailbox_constants.dart';
import 'package:tmail_ui_user/features/mailbox/domain/exceptions/set_mailbox_name_exception.dart';
import 'package:tmail_ui_user/features/mailbox/domain/exceptions/null_session_or_accountid_exception.dart';
import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_request.dart';
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_subaddressing_action.dart';
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_subscribe_action_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/rename_mailbox_request.dart';
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_right_request.dart';
import 'package:tmail_ui_user/features/mailbox/domain/model/subscribe_mailbox_request.dart';
import 'package:tmail_ui_user/features/mailbox/domain/model/subscribe_multiple_mailbox_request.dart';
import 'package:tmail_ui_user/features/mailbox/domain/model/subscribe_request.dart';
@@ -47,6 +50,7 @@ import 'package:tmail_ui_user/features/mailbox/domain/state/move_mailbox_state.d
import 'package:tmail_ui_user/features/mailbox/domain/state/refresh_all_mailboxes_state.dart';
import 'package:tmail_ui_user/features/mailbox/domain/state/refresh_changes_all_mailboxes_state.dart';
import 'package:tmail_ui_user/features/mailbox/domain/state/rename_mailbox_state.dart';
import 'package:tmail_ui_user/features/mailbox/domain/state/subaddressing_mailbox_state.dart';
import 'package:tmail_ui_user/features/mailbox/domain/state/subscribe_mailbox_state.dart';
import 'package:tmail_ui_user/features/mailbox/domain/state/subscribe_multiple_mailbox_state.dart';
import 'package:tmail_ui_user/features/mailbox/domain/usecases/create_new_default_mailbox_interactor.dart';
@@ -56,6 +60,7 @@ import 'package:tmail_ui_user/features/mailbox/domain/usecases/get_all_mailbox_i
import 'package:tmail_ui_user/features/mailbox/domain/usecases/move_mailbox_interactor.dart';
import 'package:tmail_ui_user/features/mailbox/domain/usecases/refresh_all_mailbox_interactor.dart';
import 'package:tmail_ui_user/features/mailbox/domain/usecases/rename_mailbox_interactor.dart';
import 'package:tmail_ui_user/features/mailbox/domain/usecases/subaddressing_interactor.dart';
import 'package:tmail_ui_user/features/mailbox/domain/usecases/subscribe_mailbox_interactor.dart';
import 'package:tmail_ui_user/features/mailbox/domain/usecases/subscribe_multiple_mailbox_interactor.dart';
import 'package:tmail_ui_user/features/mailbox/presentation/action/mailbox_ui_action.dart';
@@ -101,6 +106,7 @@ class MailboxController extends BaseMailboxController
final MoveMailboxInteractor _moveMailboxInteractor;
final SubscribeMailboxInteractor _subscribeMailboxInteractor;
final SubscribeMultipleMailboxInteractor _subscribeMultipleMailboxInteractor;
final SubaddressingInteractor _subaddressingInteractor;
final CreateDefaultMailboxInteractor _createDefaultMailboxInteractor;
IOSSharingManager? _iosSharingManager;
@@ -131,6 +137,7 @@ class MailboxController extends BaseMailboxController
this._moveMailboxInteractor,
this._subscribeMailboxInteractor,
this._subscribeMultipleMailboxInteractor,
this._subaddressingInteractor,
this._createDefaultMailboxInteractor,
TreeBuilder treeBuilder,
VerifyNameInteractor verifyNameInteractor,
@@ -190,6 +197,8 @@ class MailboxController extends BaseMailboxController
_handleUnsubscribeMultipleMailboxAllSuccess(success);
} else if (success is SubscribeMultipleMailboxHasSomeSuccess) {
_handleUnsubscribeMultipleMailboxHasSomeSuccess(success);
} else if (success is SubaddressingSuccess) {
_handleSubaddressingSuccess(success);
}
}
@@ -202,6 +211,8 @@ class MailboxController extends BaseMailboxController
_renameMailboxFailure(failure);
} else if (failure is DeleteMultipleMailboxFailure) {
_deleteMailboxFailure(failure);
} else if (failure is SubaddressingFailure) {
_handleSubaddressingFailure(failure);
}
}
@@ -1244,6 +1255,10 @@ class MailboxController extends BaseMailboxController
case MailboxActions.disableMailbox:
_unsubscribeMailboxAction(mailbox.id);
break;
case MailboxActions.allowSubaddressing:
case MailboxActions.disallowSubaddressing:
_handleSubaddressingAction(mailbox.id, mailbox.rights, actions);
break;
case MailboxActions.emptyTrash:
emptyTrashAction(context, mailbox, mailboxDashBoardController);
break;
@@ -1495,6 +1510,41 @@ class MailboxController extends BaseMailboxController
}
}
void _handleSubaddressingAction(MailboxId mailboxId, Map<String, List<String>?>? currentRights, MailboxActions subaddressingAction) {
final accountId = mailboxDashBoardController.accountId.value;
final session = mailboxDashBoardController.sessionCurrent;
if (session != null && accountId != null) {
final allowSubaddressingRequest = MailboxRightRequest(
mailboxId,
currentRights,
subaddressingAction == MailboxActions.allowSubaddressing ? MailboxSubaddressingAction.allow : MailboxSubaddressingAction.disallow
);
consumeState(_subaddressingInteractor.execute(session, accountId, allowSubaddressingRequest));
} else {
_handleSubaddressingFailure(SubaddressingFailure.withException(NullSessionOrAccountIdException()));
}
popBack();
}
void _handleSubaddressingFailure(SubaddressingFailure failure) {
if (currentOverlayContext != null && currentContext != null) {
final messageError = AppLocalizations.of(currentContext!).toastMessageSubaddressingFailure;
appToast.showToastErrorMessage(currentOverlayContext!, messageError);
}
}
void _handleSubaddressingSuccess(SubaddressingSuccess success) {
appToast.showToastSuccessMessage(
currentOverlayContext!,
success.subaddressingAction == MailboxSubaddressingAction.allow
? AppLocalizations.of(currentContext!).toastMessageAllowSubaddressingSuccess
: AppLocalizations.of(currentContext!).toastMessageDisallowSubaddressingSuccess,
);
}
void _mailboxListScrollControllerListener() {
_handleScrollTop();
_handleScrollBottom();
@@ -62,6 +62,10 @@ mixin MailboxWidgetMixin {
MailboxActions.markAsRead,
MailboxActions.move,
MailboxActions.rename,
if (mailbox.isSubaddressingAllowed)
MailboxActions.disallowSubaddressing
else
MailboxActions.allowSubaddressing,
if (mailbox.isSubscribedMailbox)
MailboxActions.disableMailbox
else
@@ -24,7 +24,9 @@ enum MailboxActions {
emptySpam,
newSubfolder,
confirmMailSpam,
recoverDeletedMessages;
recoverDeletedMessages,
allowSubaddressing,
disallowSubaddressing;
}
extension MailboxActionsExtension on MailboxActions {
@@ -74,6 +76,10 @@ extension MailboxActionsExtension on MailboxActions {
return AppLocalizations.of(context).confirmAllEmailHereAreSpam;
case MailboxActions.recoverDeletedMessages:
return AppLocalizations.of(context).recoverDeletedMessages;
case MailboxActions.allowSubaddressing:
return AppLocalizations.of(context).allowSubaddressing;
case MailboxActions.disallowSubaddressing:
return AppLocalizations.of(context).disallowSubaddressing;
default:
return '';
}
@@ -109,6 +115,10 @@ extension MailboxActionsExtension on MailboxActions {
return imagePaths.icMarkAsRead;
case MailboxActions.recoverDeletedMessages:
return imagePaths.icRecoverDeletedMessages;
case MailboxActions.allowSubaddressing:
return imagePaths.icSubaddressingAllow;
case MailboxActions.disallowSubaddressing:
return imagePaths.icSubaddressingDisallow;
default:
return '';
}
@@ -183,6 +193,8 @@ extension MailboxActionsExtension on MailboxActions {
case MailboxActions.emptySpam:
case MailboxActions.confirmMailSpam:
case MailboxActions.recoverDeletedMessages:
case MailboxActions.allowSubaddressing:
case MailboxActions.disallowSubaddressing:
return ContextMenuItemState.activated;
case MailboxActions.markAsRead:
return mailbox.countUnReadEmailsAsString.isNotEmpty