Merge all TextField errors in TextFieldError class
This commit is contained in:
parent
2631712361
commit
a3f78094f1
@ -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
|
||||||
|
}
|
@ -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,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -97,7 +97,7 @@ fun AddFeedDialog(
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
isError = state.isError,
|
isError = state.isError,
|
||||||
supportingText = { Text(state.errorText) }
|
supportingText = { Text(state.error?.errorText().orEmpty()) }
|
||||||
)
|
)
|
||||||
|
|
||||||
ShortSpacer()
|
ShortSpacer()
|
||||||
|
@ -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)
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
@ -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()
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -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"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
x
Reference in New Issue
Block a user