From 8ceda0c4e6ed7fe2038662caef26822039aeb8fe Mon Sep 17 00:00:00 2001 From: Infi Date: Tue, 22 Oct 2024 18:22:20 +0200 Subject: [PATCH] feat: graceful server unavailability handling in login screen Signed-off-by: Infi --- .../main/java/chat/revolt/screens/login/LoginScreen.kt | 10 +++++++++- .../revolt/screens/register/RegisterDetailsScreen.kt | 10 +++++++++- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/chat/revolt/screens/login/LoginScreen.kt b/app/src/main/java/chat/revolt/screens/login/LoginScreen.kt index 895cddbf..4db3450b 100644 --- a/app/src/main/java/chat/revolt/screens/login/LoginScreen.kt +++ b/app/src/main/java/chat/revolt/screens/login/LoginScreen.kt @@ -38,6 +38,7 @@ import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope import androidx.navigation.NavController import chat.revolt.R +import chat.revolt.RevoltApplication import chat.revolt.api.REVOLT_SUPPORT import chat.revolt.api.RevoltAPI import chat.revolt.api.routes.account.EmailPasswordAssessment @@ -79,7 +80,14 @@ class LoginViewModel @Inject constructor( _error = null viewModelScope.launch { - val response = negotiateAuthentication(_email, _password) + val response = try { + negotiateAuthentication(_email, _password) + } catch (e: Exception) { + _error = if (e.message?.startsWith("Unexpected JSON token") == true) { + RevoltApplication.instance.getString(R.string.service_health_alert_body_default) + } else e.message ?: "Unknown error" + return@launch + } if (response.error != null) { _error = response.error.type } else { diff --git a/app/src/main/java/chat/revolt/screens/register/RegisterDetailsScreen.kt b/app/src/main/java/chat/revolt/screens/register/RegisterDetailsScreen.kt index 5edd4c0c..41863c23 100644 --- a/app/src/main/java/chat/revolt/screens/register/RegisterDetailsScreen.kt +++ b/app/src/main/java/chat/revolt/screens/register/RegisterDetailsScreen.kt @@ -35,6 +35,7 @@ import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewmodel.compose.viewModel import androidx.navigation.NavController import chat.revolt.R +import chat.revolt.RevoltApplication import chat.revolt.api.routes.account.RegistrationBody import chat.revolt.api.routes.account.register import chat.revolt.api.routes.misc.getRootRoute @@ -53,7 +54,14 @@ class RegisterDetailsScreenViewModel : ViewModel() { fun initCaptcha(context: Context, onSuccess: () -> Unit) { viewModelScope.launch { - val root = getRootRoute() + val root = try { + getRootRoute() + } catch (e: Exception) { + error = if (e.message?.startsWith("Expected response body of the type") == true) { + RevoltApplication.instance.getString(R.string.service_health_alert_body_default) + } else e.message + return@launch + } if (!root.features.captcha.enabled) { onSuccess()