TF-3189 new option to enable/disable subaddressing for a personal folder
This commit is contained in:
committed by
Dat H. Pham
parent
f8f248fc3c
commit
89d80fe142
@@ -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
|
||||
|
||||
@@ -2352,6 +2352,36 @@
|
||||
"placeholders_order": [],
|
||||
"placeholders": {}
|
||||
},
|
||||
"allowSubaddressing": "Allow subaddressing",
|
||||
"@allowSubaddressing": {
|
||||
"type": "text",
|
||||
"placeholders_order": [],
|
||||
"placeholders": {}
|
||||
},
|
||||
"disallowSubaddressing": "Disallow subaddressing",
|
||||
"@disallowSubaddressing": {
|
||||
"type": "text",
|
||||
"placeholders_order": [],
|
||||
"placeholders": {}
|
||||
},
|
||||
"toastMessageAllowSubaddressingSuccess": "You have successfully allowed subaddressing for this folder",
|
||||
"@toastMessageAllowSubaddressingSuccess": {
|
||||
"type": "text",
|
||||
"placeholders_order": [],
|
||||
"placeholders": {}
|
||||
},
|
||||
"toastMessageDisallowSubaddressingSuccess": "You have successfully disallowed subaddressing for this folder",
|
||||
"@toastMessageDisallowSubaddressingSuccess": {
|
||||
"type": "text",
|
||||
"placeholders_order": [],
|
||||
"placeholders": {}
|
||||
},
|
||||
"toastMessageSubaddressingFailure": "There was an error dealing with the request",
|
||||
"@toastMessageSubaddressingFailure": {
|
||||
"type": "text",
|
||||
"placeholders_order": [],
|
||||
"placeholders": {}
|
||||
},
|
||||
"requestReadReceipt": "Request read receipt",
|
||||
"@requestReadReceipt": {
|
||||
"type": "text",
|
||||
|
||||
@@ -2422,6 +2422,36 @@ class AppLocalizations {
|
||||
name: 'selectParentFolder');
|
||||
}
|
||||
|
||||
String get allowSubaddressing {
|
||||
return Intl.message(
|
||||
'Allow subaddressing',
|
||||
name: 'allowSubaddressing');
|
||||
}
|
||||
|
||||
String get disallowSubaddressing {
|
||||
return Intl.message(
|
||||
'Disallow subaddressing',
|
||||
name: 'disallowSubaddressing');
|
||||
}
|
||||
|
||||
String get toastMessageAllowSubaddressingSuccess {
|
||||
return Intl.message(
|
||||
'You have successfully allowed subaddressing for this folder',
|
||||
name: 'toastMessageAllowSubaddressingSuccess');
|
||||
}
|
||||
|
||||
String get toastMessageDisallowSubaddressingSuccess {
|
||||
return Intl.message(
|
||||
'You have successfully disallowed subaddressing for this folder',
|
||||
name: 'toastMessageDisallowSubaddressingSuccess');
|
||||
}
|
||||
|
||||
String get toastMessageSubaddressingFailure {
|
||||
return Intl.message(
|
||||
'There was an error dealing with the request',
|
||||
name: 'toastMessageSubaddressingFailure');
|
||||
}
|
||||
|
||||
String get requestReadReceipt {
|
||||
return Intl.message(
|
||||
'Request read receipt',
|
||||
@@ -2798,6 +2828,7 @@ class AppLocalizations {
|
||||
'This folder is already displayed in your primary folder',
|
||||
name: 'toastMessageShowFolderSuccess');
|
||||
}
|
||||
|
||||
String get folderVisibility {
|
||||
return Intl.message(
|
||||
'Folder visibility',
|
||||
|
||||
Reference in New Issue
Block a user