Skip to content

Commit a0ac118

Browse files
committed
refactor: Split navigation and error handling of LoginOutcome
1 parent 4b8abae commit a0ac118

File tree

2 files changed

+27
-27
lines changed

2 files changed

+27
-27
lines changed

app/src/main/java/com/infomaniak/mail/ui/login/LoginFragment.kt

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -269,13 +269,10 @@ class LoginFragment : Fragment() {
269269
}
270270
}
271271

272-
val loginOutcomes = fetchMailboxes(users)
273-
loginOutcomes.forEachIndexed { index, outcome ->
274-
val preventNavigation = index != loginOutcomes.lastIndex
275-
if (preventNavigation && outcome.needsNavigation) outcome.handle(
276-
requireContext(),
277-
loginActivity.infomaniakLogin,
278-
)
272+
val context = requireContext()
273+
fetchMailboxes(users).forEachIndexed { index, outcome ->
274+
outcome.handleErrors(context, loginActivity.infomaniakLogin)
275+
if (index == fetchMailboxes(users).lastIndex) outcome.handleNavigation(context)
279276
}
280277
}
281278
}

app/src/main/java/com/infomaniak/mail/utils/LoginUtils.kt

Lines changed: 23 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)