@@ -78,7 +78,11 @@ class LoginUtils @Inject constructor(
7878 )
7979
8080 when (userResult) {
81- is UserLoginResult .Success -> fetchMailboxes(listOf (userResult.user)).single().handle(context, infomaniakLogin)
81+ is UserLoginResult .Success -> {
82+ val loginOutcome = fetchMailboxes(listOf (userResult.user)).single()
83+ loginOutcome.handleErrors(context, infomaniakLogin)
84+ loginOutcome.handleNavigation(context)
85+ }
8286 is UserLoginResult .Failure -> showError(userResult.errorMessage)
8387 null -> Unit // User closed the webview without going through
8488 }
@@ -132,15 +136,22 @@ class LoginUtils @Inject constructor(
132136 }
133137 }
134138
135- suspend fun LoginOutcome.handle (context : Context , infomaniakLogin : InfomaniakLogin ) {
139+ suspend fun LoginOutcome.handleErrors (context : Context , infomaniakLogin : InfomaniakLogin ) {
136140 when (this ) {
137- is LoginOutcome .Success -> return loginSuccess(user)
138- is LoginOutcome .Failure .NoMailbox -> context.mailboxError(errorCode)
141+ is LoginOutcome .Success , is LoginOutcome .Failure .NoMailbox -> Unit
139142 is LoginOutcome .Failure .ApiError -> context.apiError(apiResponse)
140143 is LoginOutcome .Failure .Other -> context.otherError()
141144 }
142145
143- logout(infomaniakLogin, apiToken)
146+ if (this is LoginOutcome .Failure ) logout(infomaniakLogin, apiToken)
147+ }
148+
149+ suspend fun LoginOutcome.handleNavigation (context : Context ) {
150+ when (this ) {
151+ is LoginOutcome .Success -> return loginSuccess(user)
152+ is LoginOutcome .Failure .NoMailbox -> context.mailboxError(errorCode)
153+ is LoginOutcome .Failure .ApiError , is LoginOutcome .Failure .Other -> Unit
154+ }
144155 }
145156
146157 private suspend fun loginSuccess (user : User ) {
@@ -182,22 +193,14 @@ class LoginUtils @Inject constructor(
182193 }
183194}
184195
185- sealed class LoginOutcome (val needsNavigation : Boolean ) {
186- abstract val apiToken: ApiToken
187-
188- data class Success (val user : User , override val apiToken : ApiToken ) : LoginOutcome(needsNavigation = true )
189-
190- sealed class Failure (initiatesNavigation : Boolean ) : LoginOutcome(initiatesNavigation) {
191- data class NoMailbox (
192- val errorCode : MailboxErrorCode ,
193- override val apiToken : ApiToken ,
194- ) : Failure(initiatesNavigation = true )
196+ sealed interface LoginOutcome {
197+ val apiToken: ApiToken
195198
196- data class ApiError (
197- val apiResponse : ApiResponse <* >,
198- override val apiToken : ApiToken ,
199- ) : Failure(initiatesNavigation = false )
199+ data class Success (val user : User , override val apiToken : ApiToken ) : LoginOutcome
200200
201- data class Other (override val apiToken : ApiToken ) : Failure(initiatesNavigation = false )
201+ sealed interface Failure : LoginOutcome {
202+ data class NoMailbox (val errorCode : MailboxErrorCode , override val apiToken : ApiToken ) : Failure
203+ data class ApiError (val apiResponse : ApiResponse <* >, override val apiToken : ApiToken ) : Failure
204+ data class Other (override val apiToken : ApiToken ) : Failure
202205 }
203206}
0 commit comments