TF-3278 Handle open tmail app deep link but it was installed but signed in with the other account

This commit is contained in:
dab246
2024-12-10 15:21:48 +07:00
committed by Dat H. Pham
parent a4bb5b9ddf
commit c6ed9f7c2b
11 changed files with 453 additions and 54 deletions
@@ -0,0 +1,21 @@
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:model/oidc/oidc_configuration.dart';
import 'package:model/oidc/token_oidc.dart';
class AutoSignInViaDeepLinkLoading extends LoadingState {}
class AutoSignInViaDeepLinkSuccess extends Success {
final TokenOIDC tokenOIDC;
final Uri baseUri;
final OIDCConfiguration oidcConfiguration;
AutoSignInViaDeepLinkSuccess(this.tokenOIDC, this.baseUri, this.oidcConfiguration);
@override
List<Object> get props => [tokenOIDC, baseUri, oidcConfiguration];
}
class AutoSignInViaDeepLinkFailure extends FeatureFailure {
AutoSignInViaDeepLinkFailure(dynamic exception) : super(exception: exception);
}
@@ -0,0 +1,55 @@
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:dartz/dartz.dart';
import 'package:model/account/authentication_type.dart';
import 'package:model/account/personal_account.dart';
import 'package:model/oidc/oidc_configuration.dart';
import 'package:model/oidc/token_oidc.dart';
import 'package:tmail_ui_user/features/home/domain/state/auto_sign_in_via_deep_link_state.dart';
import 'package:tmail_ui_user/features/login/domain/repository/account_repository.dart';
import 'package:tmail_ui_user/features/login/domain/repository/authentication_oidc_repository.dart';
import 'package:tmail_ui_user/features/login/domain/repository/credential_repository.dart';
class AutoSignInViaDeepLinkInteractor {
final AuthenticationOIDCRepository _authenticationOIDCRepository;
final AccountRepository _accountRepository;
final CredentialRepository _credentialRepository;
const AutoSignInViaDeepLinkInteractor(
this._authenticationOIDCRepository,
this._accountRepository,
this._credentialRepository
);
Stream<Either<Failure, Success>> execute({
required Uri baseUri,
required TokenOIDC tokenOIDC,
required OIDCConfiguration oidcConfiguration
}) async* {
try {
yield Right<Failure, Success>(AutoSignInViaDeepLinkLoading());
await Future.wait([
_credentialRepository.saveBaseUrl(baseUri),
_authenticationOIDCRepository.persistTokenOIDC(tokenOIDC),
_authenticationOIDCRepository.persistAuthorityOidc(oidcConfiguration.authority),
]);
await _accountRepository.setCurrentAccount(
PersonalAccount(
tokenOIDC.tokenIdHash,
AuthenticationType.oidc,
isSelected: true
)
);
yield Right<Failure, Success>(AutoSignInViaDeepLinkSuccess(
tokenOIDC,
baseUri,
oidcConfiguration,
));
} catch (e) {
yield Left<Failure, Success>(AutoSignInViaDeepLinkFailure(e));
}
}
}