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
+3
View File
@@ -0,0 +1,3 @@
<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M6.08301 23.1221H21.2443C22.1466 23.1221 22.8453 22.862 23.3403 22.3419C23.8416 21.8281 24.0923 21.0699 24.0923 20.0673V12.5102C23.8228 12.6229 23.5409 12.7044 23.2463 12.7545C22.9581 12.8047 22.6636 12.8235 22.3628 12.8109V20.0109C22.3628 20.4621 22.2437 20.8036 22.0056 21.0354C21.7738 21.261 21.4416 21.3738 21.0093 21.3738H6.08301C5.64437 21.3738 5.30912 21.261 5.07727 21.0354C4.84542 20.8036 4.72949 20.4589 4.72949 20.0015V9.73731C4.72949 9.28613 4.84542 8.94775 5.07727 8.72217C5.30912 8.49032 5.64437 8.37439 6.08301 8.37439H17.9075C17.8824 8.07361 17.8949 7.77596 17.9451 7.48145C17.9952 7.18067 18.0735 6.89555 18.1801 6.6261H5.84802C4.94568 6.6261 4.24386 6.88615 3.74255 7.40625C3.24752 7.92009 3 8.67517 3 9.67151V20.0673C3 21.0699 3.26005 21.8281 3.78015 22.3419C4.30025 22.862 5.06787 23.1221 6.08301 23.1221ZM13.5649 17.4354C13.9159 17.4354 14.2574 17.3603 14.5895 17.2099C14.9216 17.0532 15.2568 16.8088 15.5952 16.4767L20.0223 12.1248C19.7968 11.9807 19.5837 11.8177 19.3832 11.636C19.1889 11.4543 19.0135 11.2569 18.8568 11.0438L14.6365 15.2078C14.436 15.402 14.248 15.543 14.0725 15.6308C13.9033 15.7185 13.7341 15.7623 13.5649 15.7623C13.3832 15.7623 13.2046 15.7185 13.0292 15.6308C12.86 15.543 12.6783 15.402 12.484 15.2078L5.06787 7.87622L3.94934 9.02295L11.5253 16.4767C11.8574 16.8088 12.1926 17.0532 12.531 17.2099C12.8694 17.3603 13.214 17.4354 13.5649 17.4354ZM22.0244 21.825L23.1617 20.6876L16.6198 14.2114L15.4918 15.3488L22.0244 21.825ZM5.20886 21.7122L11.4595 15.5086L10.3315 14.3806L4.07153 20.5842L5.20886 21.7122ZM22.4662 11.5044C23.0489 11.5044 23.5847 11.3572 24.0735 11.0626C24.5685 10.7681 24.9633 10.3733 25.2578 9.8783C25.5523 9.38326 25.6996 8.84123 25.6996 8.2522C25.6996 7.6569 25.5523 7.11487 25.2578 6.6261C24.9633 6.13106 24.5685 5.73629 24.0735 5.44177C23.5847 5.14726 23.0489 5 22.4662 5C21.8646 5 21.3195 5.14726 20.8307 5.44177C20.3419 5.73629 19.9503 6.13106 19.6558 6.6261C19.3612 7.11487 19.214 7.6569 19.214 8.2522C19.214 8.84123 19.3612 9.38326 19.6558 9.8783C19.9503 10.3733 20.3419 10.7681 20.8307 11.0626C21.3195 11.3572 21.8646 11.5044 22.4662 11.5044Z" fill="#007AFF"/>
</svg>

After

Width:  |  Height:  |  Size: 2.2 KiB

@@ -0,0 +1,8 @@
<svg width="28" height="28" viewBox="0 0 28 28" fill="none" xmlns="http://www.w3.org/2000/svg">
<path d="M22.5875 25.2075C22.3375 25.2075 22.0775 25.1175 21.8875 24.9175L2.29755 5.70755C1.90755 5.31755 1.89755 4.68755 2.28755 4.29755C2.67755 3.90755 3.30755 3.89755 3.69755 4.28755L23.2875 23.4975C23.6775 23.8875 23.6875 24.5175 23.2975 24.9075C23.0975 25.1075 22.8375 25.2075 22.5875 25.2075Z" fill="#007AFF"/>
<path d="M20.6175 11.1475C20.3875 11.0075 20.1775 10.8375 19.9775 10.6575C19.7875 10.4775 19.6075 10.2775 19.4475 10.0675L15.9575 13.5175L17.1175 14.6575L17.8475 13.8675L20.6075 11.1475H20.6175Z" fill="#007AFF"/>
<path d="M23.1375 11.8375C23.0775 11.8375 23.0175 11.8375 22.9575 11.8375V17.1375L22.9775 20.4075L23.9475 21.3575C24.4375 20.8475 24.6875 20.0875 24.6875 19.0975V11.5375C24.4175 11.6475 24.1375 11.7275 23.8375 11.7775C23.6075 11.8175 23.3775 11.8375 23.1375 11.8375Z" fill="#007AFF"/>
<path d="M6.67755 20.3975C6.49755 20.3975 6.33755 20.3775 6.19755 20.3475L11.5975 14.9875L12.1175 15.4975C12.4475 15.8275 12.7875 16.0775 13.1275 16.2275C13.4675 16.3775 13.8075 16.4575 14.1575 16.4575C14.5075 16.4575 14.8475 16.3775 15.1775 16.2275C15.3175 16.1575 15.4575 16.0675 15.6075 15.9675L14.3675 14.7475C14.2975 14.7575 14.2275 14.7775 14.1575 14.7775C13.9775 14.7775 13.7975 14.7375 13.6175 14.6475C13.4475 14.5575 13.2675 14.4175 13.0775 14.2275L6.21755 7.44755C6.35755 7.41755 6.50755 7.39755 6.67755 7.39755H6.86755L5.27755 5.83755C4.91755 5.96755 4.59755 6.16755 4.33755 6.42755C3.84755 6.93755 3.59755 7.69755 3.59755 8.68755V19.0875C3.59755 20.0875 3.85755 20.8475 4.37755 21.3575C4.89755 21.8775 5.66755 22.1375 6.67755 22.1375H21.8375C21.8375 22.1375 21.8775 22.1375 21.8975 22.1375L20.1175 20.3975H6.67755ZM5.32755 8.81755L10.4675 13.8675L5.32755 18.9575V8.81755Z" fill="#007AFF"/>
<path d="M25.8575 5.64755C25.5675 5.14755 25.1675 4.75755 24.6775 4.46755C24.1875 4.17755 23.6575 4.02755 23.0675 4.02755C22.4775 4.02755 21.9175 4.17755 21.4375 4.46755C20.9475 4.75755 20.5575 5.15755 20.2675 5.64755C19.9775 6.13755 19.8275 6.67755 19.8275 7.27755C19.8275 7.87755 19.9775 8.40755 20.2675 8.90755C20.5575 9.40755 20.9575 9.79755 21.4375 10.0875C21.9275 10.3775 22.4675 10.5275 23.0675 10.5275C23.6675 10.5275 24.1875 10.3775 24.6775 10.0875C25.1775 9.79755 25.5675 9.39755 25.8575 8.90755C26.1475 8.41755 26.2975 7.86755 26.2975 7.27755C26.2975 6.68755 26.1475 6.13755 25.8575 5.64755Z" fill="#007AFF"/>
<path d="M18.5075 7.39755C18.4875 7.09755 18.4975 6.79755 18.5475 6.50755C18.5975 6.20755 18.6775 5.91755 18.7775 5.64755H7.93755L9.71755 7.39755H18.5075Z" fill="#007AFF"/>
</svg>

After

Width:  |  Height:  |  Size: 2.6 KiB

@@ -223,6 +223,8 @@ class ImagePaths {
String get icLogoTwakeWelcome => _getImagePath('ic_logo_twake_welcome.svg');
String get icHelp => _getImagePath('ic_help.svg');
String get icDownloadAll => _getImagePath('ic_download_all.svg');
String get icSubaddressingAllow => _getImagePath('ic_subaddressing_allow.svg');
String get icSubaddressingDisallow => _getImagePath('ic_subaddressing_disallow.svg');
String _getImagePath(String imageName) {
return AssetsPaths.images + imageName;
@@ -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
+30
View File
@@ -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',
@@ -34,6 +34,7 @@ extension MailboxExtension on Mailbox {
myRights: myRights,
isSubscribed: isSubscribed,
namespace: namespace,
rights: rights
);
}
@@ -51,6 +52,7 @@ extension MailboxExtension on Mailbox {
myRights: updatedProperties.contain(MailboxProperty.myRights) ? newMailbox.myRights : myRights,
isSubscribed: updatedProperties.contain(MailboxProperty.isSubscribed) ? newMailbox.isSubscribed : isSubscribed,
namespace: updatedProperties.contain(MailboxProperty.namespace) ? newMailbox.namespace : namespace,
rights: updatedProperties.contain(MailboxProperty.rights) ? newMailbox.rights : rights,
);
}
@@ -68,6 +70,7 @@ extension MailboxExtension on Mailbox {
myRights: myRights,
isSubscribed: isSubscribed,
namespace: namespace,
rights: rights
);
}
@@ -2,6 +2,7 @@ import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
import 'package:jmap_dart_client/jmap/mail/mailbox/namespace.dart';
import 'package:model/mailbox/mailbox_state.dart';
import 'package:model/mailbox/presentation_mailbox.dart';
import 'package:model/mailbox/mailbox_constants.dart';
import 'package:model/mailbox/select_mode.dart';
extension PresentationMailboxExtension on PresentationMailbox {
@@ -49,6 +50,8 @@ extension PresentationMailboxExtension on PresentationMailbox {
bool get isSubscribedMailbox => isSubscribed != null && isSubscribed?.value == true;
bool get isSubaddressingAllowed => rights != null && rights?[anyoneIdentifier]?.contains(postingRight) == true;
bool get allowedToDisplayCountOfUnreadEmails => !(isTrash || isSpam || isDrafts || isTemplates || isSent) && countUnreadEmails > 0;
bool get allowedToDisplayCountOfTotalEmails => (isTrash || isSpam || isDrafts) && countTotalEmails > 0;
@@ -100,6 +103,7 @@ extension PresentationMailboxExtension on PresentationMailbox {
state: state,
namespace: namespace,
displayName: displayName,
rights: rights
);
}
@@ -121,6 +125,7 @@ extension PresentationMailboxExtension on PresentationMailbox {
state: state,
namespace: namespace,
displayName: displayName,
rights: rights
);
}
@@ -142,6 +147,7 @@ extension PresentationMailboxExtension on PresentationMailbox {
state: newMailboxState,
namespace: namespace,
displayName: displayName,
rights: rights
);
}
@@ -159,6 +165,7 @@ extension PresentationMailboxExtension on PresentationMailbox {
myRights: myRights,
isSubscribed: isSubscribed,
namespace: namespace,
rights: rights
);
}
@@ -180,6 +187,7 @@ extension PresentationMailboxExtension on PresentationMailbox {
state: state,
namespace: namespace,
displayName: displayName,
rights: rights
);
}
@@ -201,6 +209,7 @@ extension PresentationMailboxExtension on PresentationMailbox {
state: state,
namespace: namespace,
displayName: displayName,
rights: rights
);
}
}
+2
View File
@@ -0,0 +1,2 @@
const String anyoneIdentifier = 'anyone';
const String postingRight = 'p';
+1
View File
@@ -12,4 +12,5 @@ class MailboxProperty {
static const String myRights = 'myRights';
static const String isSubscribed = 'isSubscribed';
static const String namespace = 'namespace';
static const String rights = 'rights';
}
@@ -48,6 +48,7 @@ class PresentationMailbox with EquatableMixin {
final MailboxState? state;
final Namespace? namespace;
final String? displayName;
final Map<String, List<String>?>? rights;
PresentationMailbox(
this.id,
@@ -67,6 +68,7 @@ class PresentationMailbox with EquatableMixin {
this.state = MailboxState.activated,
this.namespace,
this.displayName,
this.rights
}
);
@@ -88,6 +90,7 @@ class PresentationMailbox with EquatableMixin {
state,
namespace,
displayName,
rights
];
PresentationMailbox copyWith({
@@ -0,0 +1,54 @@
import 'package:dio/dio.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:jmap_dart_client/http/http_client.dart';
import 'package:tmail_ui_user/features/mailbox/data/network/mailbox_api.dart';
import 'package:tmail_ui_user/features/mailbox/domain/model/mailbox_subaddressing_action.dart';
import 'package:uuid/uuid.dart';
void main() {
group('MailboxAPI.updateRightsForSubaddressing tests', () {
const postingRight = 'p';
final mailboxAPI = MailboxAPI(HttpClient(Dio()), const Uuid());
test('should add postingRight when action is allow and currentRights is empty', () {
final result = mailboxAPI.updateRightsForSubaddressing(MailboxSubaddressingAction.allow, []);
expect(result, contains(postingRight));
expect(result.length, 1);
});
test('should add postingRight when action is allow and currentRights does not contain postingRight', () {
final result = mailboxAPI.updateRightsForSubaddressing(MailboxSubaddressingAction.allow, ['r', 'w']);
expect(result, contains(postingRight));
expect(result.length, 3);
});
test('should not add postingRight if action is allow and postingRight already present', () {
final result = mailboxAPI.updateRightsForSubaddressing(MailboxSubaddressingAction.allow, ['r', postingRight, 'w']);
expect(result.where((right) => right == postingRight).length, 1);
expect(result.length, 3);
});
test('should remove postingRight if present and action is disallow', () {
final result = mailboxAPI.updateRightsForSubaddressing(MailboxSubaddressingAction.disallow, ['r', postingRight, 'w']);
expect(result, isNot(contains(postingRight)));
expect(result.length, 2);
});
test('should do nothing if postingRight is not present and action is disallow', () {
final result = mailboxAPI.updateRightsForSubaddressing(MailboxSubaddressingAction.disallow, ['r', 'w']);
expect(result, isNot(contains(postingRight)));
expect(result.length, 2);
});
test('should return empty list if action is disallow and currentRights is null', () {
final result = mailboxAPI.updateRightsForSubaddressing(MailboxSubaddressingAction.disallow, null);
expect(result, isEmpty);
});
test('should return list with only postingRight if action is allow and currentRights is null', () {
final result = mailboxAPI.updateRightsForSubaddressing(MailboxSubaddressingAction.allow, null);
expect(result, contains(postingRight));
expect(result.length, 1);
});
});
}
@@ -44,6 +44,7 @@ import 'package:tmail_ui_user/features/mailbox/domain/usecases/mark_as_mailbox_r
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';
@@ -147,6 +148,7 @@ const fallbackGenerators = {
MockSpec<MoveMailboxInteractor>(),
MockSpec<SubscribeMailboxInteractor>(),
MockSpec<SubscribeMultipleMailboxInteractor>(),
MockSpec<SubaddressingInteractor>(),
MockSpec<CreateDefaultMailboxInteractor>(),
MockSpec<TreeBuilder>(),
MockSpec<VerifyNameInteractor>(),
@@ -251,6 +253,7 @@ void main() {
final moveMailboxInteractor = MockMoveMailboxInteractor();
final subscribeMailboxInteractor = MockSubscribeMailboxInteractor();
final subscribeMultipleMailboxInteractor = MockSubscribeMultipleMailboxInteractor();
final subaddressingInteractor = MockSubaddressingInteractor();
final createDefaultMailboxInteractor = MockCreateDefaultMailboxInteractor();
final treeBuilder = MockTreeBuilder();
final verifyNameInteractor = MockVerifyNameInteractor();
@@ -363,6 +366,7 @@ void main() {
moveMailboxInteractor,
subscribeMailboxInteractor,
subscribeMultipleMailboxInteractor,
subaddressingInteractor,
createDefaultMailboxInteractor,
treeBuilder,
verifyNameInteractor,
@@ -44,6 +44,7 @@ import 'package:tmail_ui_user/features/mailbox/domain/usecases/mark_as_mailbox_r
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';
@@ -151,6 +152,7 @@ const fallbackGenerators = {
MockSpec<MoveMailboxInteractor>(),
MockSpec<SubscribeMailboxInteractor>(),
MockSpec<SubscribeMultipleMailboxInteractor>(),
MockSpec<SubaddressingInteractor>(),
MockSpec<CreateDefaultMailboxInteractor>(),
MockSpec<TreeBuilder>(),
MockSpec<VerifyNameInteractor>(),
@@ -240,6 +242,7 @@ void main() {
final moveMailboxInteractor = MockMoveMailboxInteractor();
final subscribeMailboxInteractor = MockSubscribeMailboxInteractor();
final subscribeMultipleMailboxInteractor = MockSubscribeMultipleMailboxInteractor();
final subaddressingInteractor = MockSubaddressingInteractor();
final createDefaultMailboxInteractor = MockCreateDefaultMailboxInteractor();
final treeBuilder = MockTreeBuilder();
final verifyNameInteractor = MockVerifyNameInteractor();
@@ -356,6 +359,7 @@ void main() {
moveMailboxInteractor,
subscribeMailboxInteractor,
subscribeMultipleMailboxInteractor,
subaddressingInteractor,
createDefaultMailboxInteractor,
treeBuilder,
verifyNameInteractor,