TF-2871 Block notification on folders Sent, Outbox, Drafts, Spam and Trash
This commit is contained in:
@@ -34,13 +34,17 @@ abstract class ReloadableController extends BaseController {
|
||||
void handleFailureViewState(Failure failure) {
|
||||
if (failure is GetCredentialFailure ||
|
||||
failure is GetStoredTokenOidcFailure ||
|
||||
failure is GetAuthenticatedAccountFailure ||
|
||||
failure is UpdateAccountCacheFailure) {
|
||||
failure is GetAuthenticatedAccountFailure) {
|
||||
logError('$runtimeType::handleFailureViewState():Failure = $failure');
|
||||
goToLogin();
|
||||
} else if (failure is GetSessionFailure) {
|
||||
logError('$runtimeType::handleFailureViewState():Failure = $failure');
|
||||
_handleGetSessionFailure(failure.exception);
|
||||
} else if (failure is UpdateAccountCacheFailure) {
|
||||
logError('$runtimeType::handleFailureViewState():Failure = $failure');
|
||||
_handleUpdateAccountCacheCompleted(
|
||||
session: failure.session,
|
||||
apiUrl: failure.apiUrl);
|
||||
} else {
|
||||
super.handleFailureViewState(failure);
|
||||
}
|
||||
@@ -50,25 +54,20 @@ abstract class ReloadableController extends BaseController {
|
||||
void handleSuccessViewState(Success success) {
|
||||
if (success is GetCredentialViewState) {
|
||||
log('$runtimeType::handleSuccessViewState:Success = ${success.runtimeType}');
|
||||
_setDataToInterceptors(
|
||||
baseUrl: success.baseUrl.origin,
|
||||
userName: success.userName,
|
||||
password: success.password);
|
||||
getSessionAction();
|
||||
_handleGetCredentialSuccess(success);
|
||||
} else if (success is GetStoredTokenOidcSuccess) {
|
||||
log('$runtimeType::handleSuccessViewState:Success = ${success.runtimeType}');
|
||||
_setDataToInterceptors(
|
||||
baseUrl: success.baseUrl.toString(),
|
||||
tokenOIDC: success.tokenOidc,
|
||||
oidcConfiguration: success.oidcConfiguration);
|
||||
getSessionAction();
|
||||
_handleGetStoredTokenOidcSuccess(success);
|
||||
} else if (success is GetSessionSuccess) {
|
||||
log('$runtimeType::handleSuccessViewState:Success = ${success.runtimeType}');
|
||||
updateAccountCache(success.session);
|
||||
updateAccountCache(
|
||||
session: success.session,
|
||||
baseUrl: dynamicUrlInterceptors.baseUrl);
|
||||
} else if (success is UpdateAccountCacheSuccess) {
|
||||
log('$runtimeType::handleSuccessViewState:Success = ${success.runtimeType}');
|
||||
dynamicUrlInterceptors.changeBaseUrl(success.apiUrl);
|
||||
handleReloaded(success.session);
|
||||
_handleUpdateAccountCacheCompleted(
|
||||
session: success.session,
|
||||
apiUrl: success.apiUrl);
|
||||
} else {
|
||||
super.handleSuccessViewState(success);
|
||||
}
|
||||
@@ -85,6 +84,27 @@ abstract class ReloadableController extends BaseController {
|
||||
consumeState(_getAuthenticatedAccountInteractor.execute());
|
||||
}
|
||||
|
||||
void _handleGetCredentialSuccess(GetCredentialViewState success) {
|
||||
_setDataToInterceptors(
|
||||
baseUrl: success.baseUrl.origin,
|
||||
userName: success.userName,
|
||||
password: success.password);
|
||||
getSessionAction();
|
||||
}
|
||||
|
||||
void _handleGetStoredTokenOidcSuccess(GetStoredTokenOidcSuccess success) {
|
||||
_setDataToInterceptors(
|
||||
baseUrl: success.baseUrl.toString(),
|
||||
tokenOIDC: success.tokenOidc,
|
||||
oidcConfiguration: success.oidcConfiguration);
|
||||
getSessionAction();
|
||||
}
|
||||
|
||||
void _handleUpdateAccountCacheCompleted({required Session session, String? apiUrl}) {
|
||||
dynamicUrlInterceptors.changeBaseUrl(apiUrl);
|
||||
handleReloaded(session);
|
||||
}
|
||||
|
||||
void _setDataToInterceptors({
|
||||
required String baseUrl,
|
||||
UserName? userName,
|
||||
@@ -131,7 +151,13 @@ abstract class ReloadableController extends BaseController {
|
||||
}
|
||||
}
|
||||
|
||||
void updateAccountCache(Session session) {
|
||||
consumeState(_updateAccountCacheInteractor.execute(session));
|
||||
void updateAccountCache({
|
||||
required Session session,
|
||||
String? baseUrl
|
||||
}) {
|
||||
consumeState(_updateAccountCacheInteractor.execute(
|
||||
session: session,
|
||||
baseUrl: baseUrl
|
||||
));
|
||||
}
|
||||
}
|
||||
@@ -48,11 +48,11 @@ class AuthorizationInterceptors extends QueuedInterceptorsWrapper {
|
||||
_token = newToken;
|
||||
_configOIDC = newConfig;
|
||||
_authenticationType = AuthenticationType.oidc;
|
||||
log('AuthorizationInterceptors::setTokenAndAuthorityOidc: TokenId = ${newToken?.tokenIdHash}');
|
||||
log('AuthorizationInterceptors::setTokenAndAuthorityOidc: INITIAL_TOKEN = ${newToken?.token} | EXPIRED_TIME = ${newToken?.expiredTime}');
|
||||
}
|
||||
|
||||
void _updateNewToken(TokenOIDC newToken) {
|
||||
log('AuthorizationInterceptors::_updateNewToken: TokenId = ${newToken.tokenIdHash}');
|
||||
log('AuthorizationInterceptors::_updateNewToken: NEW_TOKEN = ${newToken.token} | EXPIRED_TIME = ${newToken.expiredTime}');
|
||||
_token = newToken;
|
||||
}
|
||||
|
||||
|
||||
@@ -17,6 +17,15 @@ class UpdateAccountCacheSuccess extends UIState {
|
||||
}
|
||||
|
||||
class UpdateAccountCacheFailure extends FeatureFailure {
|
||||
final Session session;
|
||||
final String apiUrl;
|
||||
|
||||
UpdateAccountCacheFailure(dynamic exception) : super(exception: exception);
|
||||
UpdateAccountCacheFailure({
|
||||
required this.session,
|
||||
required this.apiUrl,
|
||||
dynamic exception,
|
||||
}) : super(exception: exception);
|
||||
|
||||
@override
|
||||
List<Object?> get props => [session, apiUrl, ...super.props];
|
||||
}
|
||||
@@ -1,39 +1,26 @@
|
||||
import 'package:core/presentation/state/failure.dart';
|
||||
import 'package:core/presentation/state/success.dart';
|
||||
import 'package:core/utils/app_logger.dart';
|
||||
import 'package:dartz/dartz.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/session/session.dart';
|
||||
import 'package:model/account/authentication_type.dart';
|
||||
import 'package:model/account/personal_account.dart';
|
||||
import 'package:model/extensions/personal_account_extension.dart';
|
||||
import 'package:model/extensions/session_extension.dart';
|
||||
import 'package:tmail_ui_user/features/home/domain/extensions/session_extensions.dart';
|
||||
import 'package:tmail_ui_user/features/login/domain/repository/account_repository.dart';
|
||||
import 'package:tmail_ui_user/features/login/domain/repository/credential_repository.dart';
|
||||
import 'package:tmail_ui_user/features/login/domain/state/update_authentication_account_state.dart';
|
||||
|
||||
class UpdateAccountCacheInteractor {
|
||||
final AccountRepository _accountRepository;
|
||||
final CredentialRepository _credentialRepository;
|
||||
|
||||
UpdateAccountCacheInteractor(
|
||||
this._accountRepository,
|
||||
this._credentialRepository);
|
||||
UpdateAccountCacheInteractor(this._accountRepository);
|
||||
|
||||
Stream<Either<Failure, Success>> execute(Session session) async* {
|
||||
Stream<Either<Failure, Success>> execute({required Session session, String? baseUrl}) async* {
|
||||
final apiUrl = _getQualifiedApiUrl(session: session, baseUrl: baseUrl);
|
||||
log('UpdateAccountCacheInteractor::execute: ApiUrl = $apiUrl');
|
||||
try{
|
||||
yield Right(UpdatingAccountCache());
|
||||
|
||||
final futureValue = await Future.wait([
|
||||
_credentialRepository.getBaseUrl(),
|
||||
_accountRepository.getCurrentAccount(),
|
||||
], eagerError: true);
|
||||
|
||||
final baseUrl = futureValue[0] as Uri;
|
||||
final currentAccount = futureValue[1] as PersonalAccount;
|
||||
final apiUrl = session.getQualifiedApiUrl(
|
||||
baseUrl: currentAccount.authenticationType == AuthenticationType.basic
|
||||
? baseUrl.origin
|
||||
: baseUrl.toString());
|
||||
final currentAccount = await _accountRepository.getCurrentAccount();
|
||||
|
||||
await _accountRepository.setCurrentAccount(
|
||||
currentAccount.fromAccount(
|
||||
@@ -46,7 +33,20 @@ class UpdateAccountCacheInteractor {
|
||||
session: session,
|
||||
apiUrl: apiUrl));
|
||||
} catch(e) {
|
||||
yield Left(UpdateAccountCacheFailure(e));
|
||||
yield Left(UpdateAccountCacheFailure(
|
||||
session: session,
|
||||
apiUrl: apiUrl,
|
||||
exception: e
|
||||
));
|
||||
}
|
||||
}
|
||||
|
||||
String _getQualifiedApiUrl({required Session session, String? baseUrl}) {
|
||||
try {
|
||||
return session.getQualifiedApiUrl(baseUrl: baseUrl);
|
||||
} catch (e) {
|
||||
logError('UpdateAccountCacheInteractor::_getQualifiedApiUrl:Exception = $e');
|
||||
return '';
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -84,6 +84,7 @@ import 'package:tmail_ui_user/main/routes/dialog_router.dart';
|
||||
import 'package:tmail_ui_user/main/routes/navigation_router.dart';
|
||||
import 'package:tmail_ui_user/main/routes/route_navigation.dart';
|
||||
import 'package:tmail_ui_user/main/routes/route_utils.dart';
|
||||
import 'package:tmail_ui_user/main/utils/ios_sharing_manager.dart';
|
||||
|
||||
class MailboxController extends BaseMailboxController with MailboxActionHandlerMixin {
|
||||
|
||||
@@ -97,6 +98,8 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM
|
||||
final SubscribeMultipleMailboxInteractor _subscribeMultipleMailboxInteractor;
|
||||
final CreateDefaultMailboxInteractor _createDefaultMailboxInteractor;
|
||||
|
||||
IOSSharingManager? _iosSharingManager;
|
||||
|
||||
final currentSelectMode = SelectMode.INACTIVE.obs;
|
||||
final _activeScrollTop = RxBool(false);
|
||||
final _activeScrollBottom = RxBool(true);
|
||||
@@ -206,6 +209,9 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM
|
||||
_handleCreateDefaultFolderIfMissing(mailboxDashBoardController.mapDefaultMailboxIdByRole);
|
||||
_handleDataFromNavigationRouter();
|
||||
mailboxDashBoardController.getSpamReportBanner();
|
||||
if (PlatformInfo.isIOS) {
|
||||
_updateMailboxIdsBlockNotificationToKeychain(success.mailboxList);
|
||||
}
|
||||
} else if (success is RefreshChangesAllMailboxSuccess) {
|
||||
_selectSelectedMailboxDefault();
|
||||
mailboxDashBoardController.refreshSpamReportBanner();
|
||||
@@ -1115,7 +1121,7 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM
|
||||
curve: Curves.fastOutSlowIn);
|
||||
}
|
||||
|
||||
void _handleGetAllMailboxSuccess(GetAllMailboxSuccess success) async {
|
||||
Future<void> _handleGetAllMailboxSuccess(GetAllMailboxSuccess success) async {
|
||||
currentMailboxState = success.currentMailboxState;
|
||||
log('MailboxController::_handleGetAllMailboxSuccess:currentMailboxState: $currentMailboxState');
|
||||
final listMailboxDisplayed = success.mailboxList.listSubscribedMailboxesAndDefaultMailboxes;
|
||||
@@ -1127,6 +1133,28 @@ class MailboxController extends BaseMailboxController with MailboxActionHandlerM
|
||||
_setOutboxMailbox();
|
||||
}
|
||||
|
||||
Future<void> _updateMailboxIdsBlockNotificationToKeychain(List<PresentationMailbox> mailboxes) async {
|
||||
_iosSharingManager = getBinding<IOSSharingManager>();
|
||||
final accountId = mailboxDashBoardController.accountId.value;
|
||||
if (accountId == null || _iosSharingManager == null || mailboxes.isEmpty) {
|
||||
logError('MailboxController::_updateMailboxIdsBlockNotificationToKeychain: AccountId = $accountId | IosSharingManager = $_iosSharingManager | Mailboxes = ${mailboxes.length}');
|
||||
return;
|
||||
}
|
||||
|
||||
if (await _iosSharingManager!.isExistMailboxIdsBlockNotificationInKeyChain(accountId)) {
|
||||
return;
|
||||
}
|
||||
|
||||
final mailboxIdsBlockNotification = mailboxes
|
||||
.where((presentationMailbox) => presentationMailbox.pushNotificationDeactivated && presentationMailbox.mailboxId != null)
|
||||
.map((presentationMailbox) => presentationMailbox.mailboxId!)
|
||||
.toList();
|
||||
log('MailboxController::_updateMailboxIdsBlockNotificationToKeychain:MailboxIdsBlockNotification = $mailboxIdsBlockNotification');
|
||||
_iosSharingManager!.updateMailboxIdsBlockNotificationInKeyChain(
|
||||
accountId: accountId,
|
||||
mailboxIds: mailboxIdsBlockNotification);
|
||||
}
|
||||
|
||||
void _handleRefreshChangesAllMailboxSuccess(RefreshChangesAllMailboxSuccess success) async {
|
||||
currentMailboxState = success.currentMailboxState;
|
||||
log('MailboxController::_handleRefreshChangesAllMailboxSuccess:currentMailboxState: $currentMailboxState');
|
||||
|
||||
-2
@@ -517,8 +517,6 @@ class MailboxDashBoardController extends ReloadableController {
|
||||
|
||||
void _handleSessionFromArguments(Session session) {
|
||||
log('MailboxDashBoardController::_handleSession:');
|
||||
updateAccountCache(session);
|
||||
|
||||
_setUpComponentsFromSession(session);
|
||||
|
||||
if (PlatformInfo.isWeb) {
|
||||
|
||||
+4
-2
@@ -1,20 +1,22 @@
|
||||
|
||||
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
||||
import 'package:tmail_ui_user/features/push_notification/data/keychain/keychain_sharing_session.dart';
|
||||
|
||||
extension KeychainSharingSessionExtension on KeychainSharingSession {
|
||||
|
||||
KeychainSharingSession updating({String? emailState}) {
|
||||
KeychainSharingSession updating({String? emailState, List<MailboxId>? mailboxIdsBlockNotification}) {
|
||||
return KeychainSharingSession(
|
||||
accountId: accountId,
|
||||
userName: userName,
|
||||
authenticationType: authenticationType,
|
||||
apiUrl: apiUrl,
|
||||
emailState: emailState ?? emailState,
|
||||
emailState: emailState ?? this.emailState,
|
||||
emailDeliveryState: emailDeliveryState,
|
||||
tokenOIDC: tokenOIDC,
|
||||
basicAuth: basicAuth,
|
||||
tokenEndpoint: tokenEndpoint,
|
||||
oidcScopes: oidcScopes,
|
||||
mailboxIdsBlockNotification: mailboxIdsBlockNotification ?? this.mailboxIdsBlockNotification,
|
||||
);
|
||||
}
|
||||
}
|
||||
@@ -1,14 +1,17 @@
|
||||
import 'package:equatable/equatable.dart';
|
||||
import 'package:jmap_dart_client/http/converter/account_id_converter.dart';
|
||||
import 'package:jmap_dart_client/http/converter/mailbox_id_converter.dart';
|
||||
import 'package:jmap_dart_client/http/converter/user_name_converter.dart';
|
||||
import 'package:jmap_dart_client/jmap/account_id.dart';
|
||||
import 'package:jmap_dart_client/jmap/core/user_name.dart';
|
||||
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
|
||||
import 'package:json_annotation/json_annotation.dart';
|
||||
import 'package:model/account/authentication_type.dart';
|
||||
import 'package:model/oidc/token_oidc.dart';
|
||||
|
||||
part 'keychain_sharing_session.g.dart';
|
||||
|
||||
@MailboxIdConverter()
|
||||
@UserNameConverter()
|
||||
@AccountIdConverter()
|
||||
@JsonSerializable(includeIfNull: false, explicitToJson: true)
|
||||
@@ -23,6 +26,7 @@ class KeychainSharingSession with EquatableMixin {
|
||||
String? basicAuth;
|
||||
String? tokenEndpoint;
|
||||
List<String>? oidcScopes;
|
||||
List<MailboxId>? mailboxIdsBlockNotification;
|
||||
|
||||
KeychainSharingSession({
|
||||
required this.accountId,
|
||||
@@ -35,6 +39,7 @@ class KeychainSharingSession with EquatableMixin {
|
||||
this.basicAuth,
|
||||
this.tokenEndpoint,
|
||||
this.oidcScopes,
|
||||
this.mailboxIdsBlockNotification,
|
||||
});
|
||||
|
||||
factory KeychainSharingSession.fromJson(Map<String, dynamic> json) => _$KeychainSharingSessionFromJson(json);
|
||||
@@ -53,5 +58,6 @@ class KeychainSharingSession with EquatableMixin {
|
||||
basicAuth,
|
||||
tokenEndpoint,
|
||||
oidcScopes,
|
||||
mailboxIdsBlockNotification,
|
||||
];
|
||||
}
|
||||
Reference in New Issue
Block a user