From deb0b8be6122fd32a95740da815e3704db971a8f Mon Sep 17 00:00:00 2001 From: Stefano Pigozzi Date: Tue, 30 Jan 2024 03:29:02 +0100 Subject: [PATCH] Refactor `LocalizableError` to be immutable --- .../errorhandling/LocalizableError.kt | 65 +++++-------------- .../twom/composables/login/LoginForm.kt | 23 +++---- .../twom/composables/main/RoomListItem.kt | 6 +- .../composables/viewroom/InviteUserForm.kt | 9 +-- .../twom/composables/viewroom/ViewRoomForm.kt | 11 ++-- 5 files changed, 44 insertions(+), 70 deletions(-) diff --git a/app/src/main/java/eu/steffo/twom/composables/errorhandling/LocalizableError.kt b/app/src/main/java/eu/steffo/twom/composables/errorhandling/LocalizableError.kt index 4f05014..75aad02 100644 --- a/app/src/main/java/eu/steffo/twom/composables/errorhandling/LocalizableError.kt +++ b/app/src/main/java/eu/steffo/twom/composables/errorhandling/LocalizableError.kt @@ -4,53 +4,24 @@ import androidx.annotation.StringRes import androidx.compose.runtime.Composable import androidx.compose.ui.res.stringResource -class LocalizableError { - @StringRes - var stringResourceId: Int? = null - private set +data class LocalizableError( + @StringRes val stringResourceId: Int, + val throwable: Throwable? = null, +) - var throwable: Throwable? = null - private set - - fun set(stringResourceId: Int) { - this.stringResourceId = stringResourceId - this.throwable = null +@Composable +fun LocalizableError?.render(): String? { + return if (this == null) { + null + } else if (this.throwable == null) { + stringResource(stringResourceId) + } else { + stringResource(stringResourceId, throwable.toString()) } +} - fun set(stringResourceId: Int, throwable: Throwable) { - this.stringResourceId = stringResourceId - this.throwable = throwable - } - - fun clear() { - this.stringResourceId = null - this.throwable = null - } - - fun occurred(): Boolean { - return stringResourceId != null - } - - @Composable - fun renderString(): String? { - val stringResourceId = this.stringResourceId - val throwable = this.throwable - - return if (stringResourceId == null) { - null - } else if (throwable == null) { - stringResource(stringResourceId) - } else { - stringResource(stringResourceId, throwable.toString()) - } - } - - @Composable - fun Show(contents: @Composable (rendered: String) -> Unit) { - val rendered = renderString() - - if (rendered != null) { - contents(rendered) - } - } -} \ No newline at end of file +@Composable +fun LocalizableError?.Display(contents: @Composable (rendered: String) -> Unit) { + val rendered = this.render() ?: return + contents(rendered) +} diff --git a/app/src/main/java/eu/steffo/twom/composables/login/LoginForm.kt b/app/src/main/java/eu/steffo/twom/composables/login/LoginForm.kt index ad197e6..c38f62b 100644 --- a/app/src/main/java/eu/steffo/twom/composables/login/LoginForm.kt +++ b/app/src/main/java/eu/steffo/twom/composables/login/LoginForm.kt @@ -21,6 +21,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalContext import androidx.compose.ui.tooling.preview.Preview import eu.steffo.twom.R +import eu.steffo.twom.composables.errorhandling.Display import eu.steffo.twom.composables.errorhandling.ErrorText import eu.steffo.twom.composables.errorhandling.LocalizableError import eu.steffo.twom.composables.fields.PasswordField @@ -58,10 +59,10 @@ fun LoginForm( var password by rememberSaveable { mutableStateOf("") } var loginStep by rememberSaveable { mutableStateOf(LoginStep.NONE) } - val error by remember { mutableStateOf(LocalizableError()) } + var error by remember { mutableStateOf(null) } suspend fun doLogin() { - error.clear() + error = null Log.d("Login", "Getting authentication service...") loginStep = LoginStep.SERVICE @@ -81,7 +82,7 @@ fun LoginForm( "User seems to have input an invalid Matrix ID: $username", e ) - error.set(R.string.login_error_username_invalid) + error = LocalizableError(R.string.login_error_username_invalid) return } catch (e: Throwable) { Log.e( @@ -89,7 +90,7 @@ fun LoginForm( "Something went wrong while retrieving .well-known data for: $username", e ) - error.set(R.string.login_error_wellknown_generic, e) + error = LocalizableError(R.string.login_error_wellknown_generic, e) return } if (wellKnown !is WellknownResult.Prompt) { @@ -97,7 +98,7 @@ fun LoginForm( "Login", "Data is not .well-known for: $username" ) - error.set(R.string.login_error_wellknown_missing) + error = LocalizableError(R.string.login_error_wellknown_missing) return } @@ -119,7 +120,7 @@ fun LoginForm( "Something went wrong while retrieving login flows for: ${wellKnown.homeServerUrl}", e ) - error.set(R.string.login_error_flows_generic, e) + error = LocalizableError(R.string.login_error_flows_generic, e) return } @@ -134,7 +135,7 @@ fun LoginForm( "Something went wrong while setting up the login wizard.", e ) - error.set(R.string.login_error_wizard_generic, e) + error = LocalizableError(R.string.login_error_wizard_generic, e) return } @@ -153,7 +154,7 @@ fun LoginForm( "Something went wrong while logging in as: $username", e ) - error.set(R.string.login_error_login_generic, e) + error = LocalizableError(R.string.login_error_login_generic, e) return } @@ -170,7 +171,7 @@ fun LoginForm( LinearProgressIndicator( modifier = Modifier.fillMaxWidth(), progress = loginStep.step.toFloat() / LoginStep.DONE.step.toFloat(), - color = if (error.occurred()) MaterialTheme.colorScheme.error else ProgressIndicatorDefaults.linearColor + color = if (error != null) MaterialTheme.colorScheme.error else ProgressIndicatorDefaults.linearColor ) Row(Modifier.basePadding()) { Text(LocalContext.current.getString(R.string.login_text)) @@ -211,7 +212,7 @@ fun LoginForm( Row(Modifier.basePadding()) { Button( modifier = Modifier.fillMaxWidth(), - enabled = (username != "" && (loginStep == LoginStep.NONE || error.occurred())), + enabled = (username != "" && (loginStep == LoginStep.NONE || error != null)), onClick = { scope.launch { doLogin() } }, @@ -219,7 +220,7 @@ fun LoginForm( Text(LocalContext.current.getString(R.string.login_complete_text)) } } - error.Show { + error.Display { Row(Modifier.basePadding()) { ErrorText( text = it diff --git a/app/src/main/java/eu/steffo/twom/composables/main/RoomListItem.kt b/app/src/main/java/eu/steffo/twom/composables/main/RoomListItem.kt index 1b5a7e9..5615475 100644 --- a/app/src/main/java/eu/steffo/twom/composables/main/RoomListItem.kt +++ b/app/src/main/java/eu/steffo/twom/composables/main/RoomListItem.kt @@ -52,7 +52,7 @@ fun RoomListItem( } var expanded by rememberSaveable { mutableStateOf(false) } - val error by remember { mutableStateOf(LocalizableError()) } + var error by remember { mutableStateOf(null) } // TODO: Display a running indicator @@ -65,7 +65,7 @@ fun RoomListItem( session.roomService().joinRoom(roomId, "Opened the invite") } catch (e: Throwable) { Log.e("Main", "Failed to open invite to room `$roomId`: $error") - error.set(R.string.main_error_join_generic, e) + error = LocalizableError(R.string.main_error_join_generic, e) return } Log.d("Main", "Successfully opened invite to room `$roomId`!") @@ -81,7 +81,7 @@ fun RoomListItem( session.roomService().leaveRoom(roomId, "Decided to leave the room") } catch (e: Throwable) { Log.e("Main", "Failed to leave room `$roomId`: $error") - error.set(R.string.main_error_leave_generic, e) + error = LocalizableError(R.string.main_error_leave_generic, e) return } Log.d("Main", "Successfully left room `$roomId`!") diff --git a/app/src/main/java/eu/steffo/twom/composables/viewroom/InviteUserForm.kt b/app/src/main/java/eu/steffo/twom/composables/viewroom/InviteUserForm.kt index 9158f1a..35df895 100644 --- a/app/src/main/java/eu/steffo/twom/composables/viewroom/InviteUserForm.kt +++ b/app/src/main/java/eu/steffo/twom/composables/viewroom/InviteUserForm.kt @@ -15,6 +15,7 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import eu.steffo.twom.R +import eu.steffo.twom.composables.errorhandling.Display import eu.steffo.twom.composables.errorhandling.ErrorText import eu.steffo.twom.composables.errorhandling.LoadingText import eu.steffo.twom.composables.errorhandling.LocalizableError @@ -67,7 +68,7 @@ fun InviteUserForm( ) var busy by rememberSaveable { mutableStateOf(false) } - val error by remember { mutableStateOf(LocalizableError()) } + var error by remember { mutableStateOf(null) } Button( modifier = Modifier @@ -78,7 +79,7 @@ fun InviteUserForm( onClick = { scope.launch SendInvite@{ busy = true - error.clear() + error = null Log.d("Room", "Sending invite to `$userId`...") @@ -86,7 +87,7 @@ fun InviteUserForm( room.membershipService().invite(userId) } catch (e: Throwable) { Log.e("Room", "Failed to send invite to `$userId`: $error") - error.set(R.string.room_error_invite_generic, e) + error = LocalizableError(R.string.room_error_invite_generic, e) busy = false return@SendInvite } @@ -103,7 +104,7 @@ fun InviteUserForm( ) } - error.Show { + error.Display { ErrorText( modifier = Modifier .basePadding() diff --git a/app/src/main/java/eu/steffo/twom/composables/viewroom/ViewRoomForm.kt b/app/src/main/java/eu/steffo/twom/composables/viewroom/ViewRoomForm.kt index 29c3944..245087e 100644 --- a/app/src/main/java/eu/steffo/twom/composables/viewroom/ViewRoomForm.kt +++ b/app/src/main/java/eu/steffo/twom/composables/viewroom/ViewRoomForm.kt @@ -14,6 +14,7 @@ import androidx.compose.runtime.setValue import androidx.compose.ui.Modifier import androidx.compose.ui.res.stringResource import eu.steffo.twom.R +import eu.steffo.twom.composables.errorhandling.Display import eu.steffo.twom.composables.errorhandling.ErrorText import eu.steffo.twom.composables.errorhandling.LoadingText import eu.steffo.twom.composables.errorhandling.LocalizableError @@ -76,13 +77,13 @@ fun ViewRoomForm() { val published = observeRSVP(room = room, member = member)!! var isPublishRunning by rememberSaveable { mutableStateOf(false) } - val publishError by remember { mutableStateOf(LocalizableError()) } + var publishError by remember { mutableStateOf(null) } RSVPForm( published = published, onRequestPublish = { answer, comment -> isPublishRunning = true - publishError.clear() + publishError = null scope.launch Publish@{ Log.d( @@ -100,7 +101,7 @@ fun ViewRoomForm() { ) } catch (e: Throwable) { Log.e("Room", "Failed to update eu.steffo.twom.rsvp: $publishError") - publishError.set(R.string.room_error_publish_generic, e) + publishError = LocalizableError(R.string.room_error_publish_generic, e) isPublishRunning = false return@Publish } @@ -122,7 +123,7 @@ fun ViewRoomForm() { "Room", "Failed to redact old RSVP: $publishError" ) - publishError.set(R.string.room_error_redact_generic, e) + publishError = LocalizableError(R.string.room_error_redact_generic, e) isPublishRunning = false return@Publish } @@ -139,7 +140,7 @@ fun ViewRoomForm() { isPublishRunning = isPublishRunning, ) - publishError.Show { + publishError.Display { Row(Modifier.basePadding()) { ErrorText( text = it