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
import com.readrops.app.compose.util.components.TextFieldError
import com.readrops.db.entities.Feed
import com.readrops.db.entities.Folder
import com.readrops.db.entities.account.Account
@ -30,66 +31,34 @@ data class AddFeedDialogState(
val url: String = "",
val selectedAccount: Account = Account(accountName = ""),
val accounts: List<Account> = listOf(),
val error: AddFeedError? = null,
val error: TextFieldError? = 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(
val feedName: String = "",
val feedNameError: Error? = null,
val feedNameError: TextFieldError? = null,
val feedUrl: String = "",
val feedUrlError: Error? = null,
val feedUrlError: TextFieldError? = null,
val accountType: AccountType? = null,
val selectedFolder: Folder? = null,
val folders: List<Folder> = listOf(),
val isAccountDropDownExpanded: Boolean = false,
) {
sealed class Error {
object EmptyField : Error()
object BadUrl : Error()
object NoRSSUrl : Error()
}
val isFeedNameError
get() = feedNameError != null
val isFeedUrlError
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
get() = accountType != null && !accountType.accountConfig!!.isFeedUrlEditable
}
data class AddFolderState(
val name: String = "",
val isEmpty: Boolean = false,
val errorText: String = "Field can't be empty"
)
val nameError: TextFieldError? = null,
) {
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.app.compose.base.TabViewModel
import com.readrops.app.compose.repositories.GetFoldersWithFeeds
import com.readrops.app.compose.util.components.TextFieldError
import com.readrops.db.Database
import com.readrops.db.entities.Feed
import com.readrops.db.entities.Folder
@ -133,7 +134,7 @@ class FeedViewModel(
when {
url.isEmpty() -> {
_addFeedDialogState.update {
it.copy(error = AddFeedDialogState.AddFeedError.EmptyUrl)
it.copy(error = TextFieldError.EmptyField)
}
return
@ -141,7 +142,7 @@ class FeedViewModel(
!Patterns.WEB_URL.matcher(url).matches() -> {
_addFeedDialogState.update {
it.copy(error = AddFeedDialogState.AddFeedError.BadUrl)
it.copy(error = TextFieldError.BadUrl)
}
return
@ -158,7 +159,7 @@ class FeedViewModel(
if (rssUrls.isEmpty()) {
_addFeedDialogState.update {
it.copy(error = AddFeedDialogState.AddFeedError.NoRSSFeed)
it.copy(error = TextFieldError.NoRSSFeed)
}
} else {
// TODO add support for all account types
@ -221,21 +222,21 @@ class FeedViewModel(
when {
feedName.isEmpty() -> {
_updateFeedDialogState.update {
it.copy(feedNameError = UpdateFeedDialogState.Error.EmptyField)
it.copy(feedNameError = TextFieldError.EmptyField)
}
return
}
feedUrl.isEmpty() -> {
_updateFeedDialogState.update {
it.copy(feedUrlError = UpdateFeedDialogState.Error.EmptyField)
it.copy(feedUrlError = TextFieldError.EmptyField)
}
return
}
!Patterns.WEB_URL.matcher(feedUrl).matches() -> {
_updateFeedDialogState.update {
it.copy(feedUrlError = UpdateFeedDialogState.Error.BadUrl)
it.copy(feedUrlError = TextFieldError.BadUrl)
}
return
}
@ -257,7 +258,7 @@ class FeedViewModel(
fun setFolderName(name: String) = _addFolderState.update {
it.copy(
name = name,
isEmpty = false
nameError = null,
)
}
@ -266,7 +267,7 @@ class FeedViewModel(
if (name.isEmpty()) {
_addFolderState.update {
it.copy(isEmpty = true)
it.copy(nameError = TextFieldError.EmptyField)
}
return
@ -284,7 +285,7 @@ class FeedViewModel(
_addFolderState.update {
it.copy(
name = "",
isEmpty = false
nameError = null,
)
}
}

View File

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

View File

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

View File

@ -78,7 +78,7 @@ fun UpdateFeedDialog(
supportingText = {
if (state.isFeedNameError) {
Text(
text = state.errorText(state.feedNameError)
text = state.feedNameError?.errorText().orEmpty()
)
}
}
@ -96,7 +96,7 @@ fun UpdateFeedDialog(
supportingText = {
if (state.isFeedUrlError) {
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"
}
}