Merge all TextField errors in TextFieldError class

This commit is contained in:
Shinokuni 2024-01-19 22:38:41 +01:00
parent 2631712361
commit a3f78094f1
6 changed files with 47 additions and 57 deletions

View File

@ -1,5 +1,6 @@
package com.readrops.app.compose.feeds package com.readrops.app.compose.feeds
import com.readrops.app.compose.util.components.TextFieldError
import com.readrops.db.entities.Feed import com.readrops.db.entities.Feed
import com.readrops.db.entities.Folder import com.readrops.db.entities.Folder
import com.readrops.db.entities.account.Account import com.readrops.db.entities.account.Account
@ -30,66 +31,34 @@ data class AddFeedDialogState(
val url: String = "", val url: String = "",
val selectedAccount: Account = Account(accountName = ""), val selectedAccount: Account = Account(accountName = ""),
val accounts: List<Account> = listOf(), val accounts: List<Account> = listOf(),
val error: AddFeedError? = null, val error: TextFieldError? = null,
) { ) {
val isError: Boolean get() = error != null val isError: Boolean get() = error != null
val errorText: String
get() = when (error) {
is AddFeedError.EmptyUrl -> "Field can't be empty"
AddFeedError.BadUrl -> "Input is not a valid URL"
AddFeedError.NoConnection -> ""
AddFeedError.NoRSSFeed -> "No RSS feed found"
AddFeedError.UnreachableUrl -> ""
else -> ""
}
sealed class AddFeedError {
object EmptyUrl : AddFeedError()
object BadUrl : AddFeedError()
object UnreachableUrl : AddFeedError()
object NoRSSFeed : AddFeedError()
object NoConnection : AddFeedError()
}
} }
data class UpdateFeedDialogState( data class UpdateFeedDialogState(
val feedName: String = "", val feedName: String = "",
val feedNameError: Error? = null, val feedNameError: TextFieldError? = null,
val feedUrl: String = "", val feedUrl: String = "",
val feedUrlError: Error? = null, val feedUrlError: TextFieldError? = null,
val accountType: AccountType? = null, val accountType: AccountType? = null,
val selectedFolder: Folder? = null, val selectedFolder: Folder? = null,
val folders: List<Folder> = listOf(), val folders: List<Folder> = listOf(),
val isAccountDropDownExpanded: Boolean = false, val isAccountDropDownExpanded: Boolean = false,
) { ) {
sealed class Error {
object EmptyField : Error()
object BadUrl : Error()
object NoRSSUrl : Error()
}
val isFeedNameError val isFeedNameError
get() = feedNameError != null get() = feedNameError != null
val isFeedUrlError val isFeedUrlError
get() = feedUrlError != null get() = feedUrlError != null
fun errorText(error: Error?): String = when (error) {
Error.BadUrl -> "Input is not a valid URL"
Error.EmptyField -> "Field can't be empty"
Error.NoRSSUrl -> "The provided URL is not a valid RSS feed"
else -> ""
}
val isFeedUrlReadOnly: Boolean val isFeedUrlReadOnly: Boolean
get() = accountType != null && !accountType.accountConfig!!.isFeedUrlEditable get() = accountType != null && !accountType.accountConfig!!.isFeedUrlEditable
} }
data class AddFolderState( data class AddFolderState(
val name: String = "", val name: String = "",
val isEmpty: Boolean = false, val nameError: TextFieldError? = null,
val errorText: String = "Field can't be empty" ) {
) val isError = nameError != null
}

View File

@ -6,6 +6,7 @@ import com.readrops.api.localfeed.LocalRSSDataSource
import com.readrops.api.utils.HtmlParser import com.readrops.api.utils.HtmlParser
import com.readrops.app.compose.base.TabViewModel import com.readrops.app.compose.base.TabViewModel
import com.readrops.app.compose.repositories.GetFoldersWithFeeds import com.readrops.app.compose.repositories.GetFoldersWithFeeds
import com.readrops.app.compose.util.components.TextFieldError
import com.readrops.db.Database import com.readrops.db.Database
import com.readrops.db.entities.Feed import com.readrops.db.entities.Feed
import com.readrops.db.entities.Folder import com.readrops.db.entities.Folder
@ -133,7 +134,7 @@ class FeedViewModel(
when { when {
url.isEmpty() -> { url.isEmpty() -> {
_addFeedDialogState.update { _addFeedDialogState.update {
it.copy(error = AddFeedDialogState.AddFeedError.EmptyUrl) it.copy(error = TextFieldError.EmptyField)
} }
return return
@ -141,7 +142,7 @@ class FeedViewModel(
!Patterns.WEB_URL.matcher(url).matches() -> { !Patterns.WEB_URL.matcher(url).matches() -> {
_addFeedDialogState.update { _addFeedDialogState.update {
it.copy(error = AddFeedDialogState.AddFeedError.BadUrl) it.copy(error = TextFieldError.BadUrl)
} }
return return
@ -158,7 +159,7 @@ class FeedViewModel(
if (rssUrls.isEmpty()) { if (rssUrls.isEmpty()) {
_addFeedDialogState.update { _addFeedDialogState.update {
it.copy(error = AddFeedDialogState.AddFeedError.NoRSSFeed) it.copy(error = TextFieldError.NoRSSFeed)
} }
} else { } else {
// TODO add support for all account types // TODO add support for all account types
@ -221,21 +222,21 @@ class FeedViewModel(
when { when {
feedName.isEmpty() -> { feedName.isEmpty() -> {
_updateFeedDialogState.update { _updateFeedDialogState.update {
it.copy(feedNameError = UpdateFeedDialogState.Error.EmptyField) it.copy(feedNameError = TextFieldError.EmptyField)
} }
return return
} }
feedUrl.isEmpty() -> { feedUrl.isEmpty() -> {
_updateFeedDialogState.update { _updateFeedDialogState.update {
it.copy(feedUrlError = UpdateFeedDialogState.Error.EmptyField) it.copy(feedUrlError = TextFieldError.EmptyField)
} }
return return
} }
!Patterns.WEB_URL.matcher(feedUrl).matches() -> { !Patterns.WEB_URL.matcher(feedUrl).matches() -> {
_updateFeedDialogState.update { _updateFeedDialogState.update {
it.copy(feedUrlError = UpdateFeedDialogState.Error.BadUrl) it.copy(feedUrlError = TextFieldError.BadUrl)
} }
return return
} }
@ -257,7 +258,7 @@ class FeedViewModel(
fun setFolderName(name: String) = _addFolderState.update { fun setFolderName(name: String) = _addFolderState.update {
it.copy( it.copy(
name = name, name = name,
isEmpty = false nameError = null,
) )
} }
@ -266,7 +267,7 @@ class FeedViewModel(
if (name.isEmpty()) { if (name.isEmpty()) {
_addFolderState.update { _addFolderState.update {
it.copy(isEmpty = true) it.copy(nameError = TextFieldError.EmptyField)
} }
return return
@ -284,7 +285,7 @@ class FeedViewModel(
_addFolderState.update { _addFolderState.update {
it.copy( it.copy(
name = "", name = "",
isEmpty = false nameError = null,
) )
} }
} }

View File

@ -97,7 +97,7 @@ fun AddFeedDialog(
} }
}, },
isError = state.isError, isError = state.isError,
supportingText = { Text(state.errorText) } supportingText = { Text(state.error?.errorText().orEmpty()) }
) )
ShortSpacer() ShortSpacer()

View File

@ -46,12 +46,8 @@ fun AddFolderDialog(
} }
} }
}, },
isError = state.isEmpty, isError = state.isError,
supportingText = { supportingText = { Text(text = state.nameError?.errorText().orEmpty()) }
if (state.isEmpty) {
Text(text = state.errorText)
}
}
) )
} }
} }

View File

@ -78,7 +78,7 @@ fun UpdateFeedDialog(
supportingText = { supportingText = {
if (state.isFeedNameError) { if (state.isFeedNameError) {
Text( Text(
text = state.errorText(state.feedNameError) text = state.feedNameError?.errorText().orEmpty()
) )
} }
} }
@ -96,7 +96,7 @@ fun UpdateFeedDialog(
supportingText = { supportingText = {
if (state.isFeedUrlError) { if (state.isFeedUrlError) {
Text( Text(
text = state.errorText(state.feedUrlError) text = state.feedUrlError?.errorText().orEmpty()
) )
} }
} }

View File

@ -0,0 +1,24 @@
package com.readrops.app.compose.util.components
import androidx.compose.runtime.Composable
sealed class TextFieldError {
object EmptyField : TextFieldError()
object BadUrl : TextFieldError()
object UnreachableUrl : TextFieldError()
object NoRSSFeed : TextFieldError()
object NoRSSUrl : TextFieldError()
@Composable
fun errorText(): String =
// TODO replace by string resources
when (this) {
BadUrl -> "Input is not a valid URL"
EmptyField -> "Field can't be empty"
NoRSSFeed -> "No RSS feed found"
NoRSSUrl -> "The provided URL is not a valid RSS feed"
UnreachableUrl -> "Unreachable URL"
}
}