enhance: Rework ViewModel structure

This commit is contained in:
ziro 2024-01-13 08:26:23 +07:00
parent 534642ea57
commit 067621cd51
Signed by: null2264
GPG key ID: BA64F8B60AF3EFB6
3 changed files with 54 additions and 32 deletions

View file

@ -0,0 +1,7 @@
package dev.yokai.domain
sealed class Result<out T> {
data class Success<out T>(val data: T? = null) : Result<T>()
data class Error(val message: String? = null) : Result<Nothing>()
data object Loading : Result<Nothing>()
}

View file

@ -0,0 +1,28 @@
package dev.yokai.domain.extension.repo
import dev.yokai.domain.source.SourcePreferences
import dev.yokai.domain.Result
import eu.kanade.tachiyomi.data.preference.minusAssign
import eu.kanade.tachiyomi.data.preference.plusAssign
import kotlinx.coroutines.flow.map
class ExtensionRepoRepository(private val sourcePreferences: SourcePreferences) {
fun addRepo(url: String): Result<Nothing> {
if (!url.matches(repoRegex))
return Result.Error("Invalid URL")
sourcePreferences.extensionRepos() += url.substringBeforeLast("/index.min.json")
return Result.Success()
}
fun deleteRepo(repo: String) {
sourcePreferences.extensionRepos() -= repo
}
fun getRepo() =
sourcePreferences.extensionRepos().changes()
.map { it.sortedWith(String.CASE_INSENSITIVE_ORDER) }
}
private val repoRegex = """^https://.*/index\.min\.json$""".toRegex()

View file

@ -3,55 +3,44 @@ package dev.yokai.presentation.extension.repo
import androidx.compose.runtime.Immutable import androidx.compose.runtime.Immutable
import androidx.lifecycle.ViewModel import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewModelScope
import dev.yokai.domain.source.SourcePreferences import dev.yokai.domain.Result
import eu.kanade.tachiyomi.data.preference.minusAssign import dev.yokai.domain.extension.repo.ExtensionRepoRepository
import eu.kanade.tachiyomi.data.preference.plusAssign
import eu.kanade.tachiyomi.util.system.launchIO import eu.kanade.tachiyomi.util.system.launchIO
import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.flow.collectLatest import kotlinx.coroutines.flow.collectLatest
import kotlinx.coroutines.flow.map
import okhttp3.internal.toImmutableList import okhttp3.internal.toImmutableList
import uy.kohesive.injekt.injectLazy import uy.kohesive.injekt.Injekt
import uy.kohesive.injekt.api.get
class ExtensionRepoViewModel : class ExtensionRepoViewModel :
ViewModel() { ViewModel() {
private val sourcePreferences: SourcePreferences by injectLazy() private val repository = ExtensionRepoRepository(Injekt.get())
private val _repoState: MutableStateFlow<ExtensionRepoState> = MutableStateFlow(ExtensionRepoState.Loading) private val _repoState: MutableStateFlow<ExtensionRepoState> = MutableStateFlow(ExtensionRepoState.Loading)
val repoState: StateFlow<ExtensionRepoState> = _repoState.asStateFlow() val repoState: StateFlow<ExtensionRepoState> = _repoState.asStateFlow()
init { init {
refresh()
}
fun addRepo(url: String) {
viewModelScope.launchIO { viewModelScope.launchIO {
getRepo().collectLatest { repos -> val result = repository.addRepo(url)
if (result is Result.Error) return@launchIO
refresh()
}
}
fun refresh() {
viewModelScope.launchIO {
repository.getRepo().collectLatest { repos ->
_repoState.value = ExtensionRepoState.Success(repos = repos.toImmutableList()) _repoState.value = ExtensionRepoState.Success(repos = repos.toImmutableList())
} }
} }
} }
/*
fun addRepo(url: String): Result {
viewModelScope.launchIO {
if (!url.matches(repoRegex))
return Result.InvalidUrl
sourcePreferences.extensionRepos() += url.substringBeforeLast("/index.min.json")
return Result.Success
}
}
*/
fun deleteRepo(repo: String) {
viewModelScope.launchIO {
sourcePreferences.extensionRepos() -= repo
}
}
fun getRepo() =
sourcePreferences.extensionRepos().changes()
.map { it.sortedWith(String.CASE_INSENSITIVE_ORDER) }
} }
sealed class ExtensionRepoState { sealed class ExtensionRepoState {
@ -68,5 +57,3 @@ sealed class ExtensionRepoState {
get() = repos.isEmpty() get() = repos.isEmpty()
} }
} }
private val repoRegex = """^https://.*/index\.min\.json$""".toRegex()