From 067621cd51ab0241cc741eda95a1afc4ca6b203d Mon Sep 17 00:00:00 2001 From: ziro Date: Sat, 13 Jan 2024 08:26:23 +0700 Subject: [PATCH] enhance: Rework ViewModel structure --- app/src/main/java/dev/yokai/domain/Result.kt | 7 +++ .../extension/repo/ExtensionRepoRepository.kt | 28 ++++++++++ .../extension/repo/ExtensionRepoViewModel.kt | 51 +++++++------------ 3 files changed, 54 insertions(+), 32 deletions(-) create mode 100644 app/src/main/java/dev/yokai/domain/Result.kt create mode 100644 app/src/main/java/dev/yokai/domain/extension/repo/ExtensionRepoRepository.kt diff --git a/app/src/main/java/dev/yokai/domain/Result.kt b/app/src/main/java/dev/yokai/domain/Result.kt new file mode 100644 index 0000000000..5267482aac --- /dev/null +++ b/app/src/main/java/dev/yokai/domain/Result.kt @@ -0,0 +1,7 @@ +package dev.yokai.domain + +sealed class Result { + data class Success(val data: T? = null) : Result() + data class Error(val message: String? = null) : Result() + data object Loading : Result() +} diff --git a/app/src/main/java/dev/yokai/domain/extension/repo/ExtensionRepoRepository.kt b/app/src/main/java/dev/yokai/domain/extension/repo/ExtensionRepoRepository.kt new file mode 100644 index 0000000000..5613a26646 --- /dev/null +++ b/app/src/main/java/dev/yokai/domain/extension/repo/ExtensionRepoRepository.kt @@ -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 { + 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() diff --git a/app/src/main/java/dev/yokai/presentation/extension/repo/ExtensionRepoViewModel.kt b/app/src/main/java/dev/yokai/presentation/extension/repo/ExtensionRepoViewModel.kt index caf1d35b49..2c2de3d235 100644 --- a/app/src/main/java/dev/yokai/presentation/extension/repo/ExtensionRepoViewModel.kt +++ b/app/src/main/java/dev/yokai/presentation/extension/repo/ExtensionRepoViewModel.kt @@ -3,55 +3,44 @@ package dev.yokai.presentation.extension.repo import androidx.compose.runtime.Immutable import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import dev.yokai.domain.source.SourcePreferences -import eu.kanade.tachiyomi.data.preference.minusAssign -import eu.kanade.tachiyomi.data.preference.plusAssign +import dev.yokai.domain.Result +import dev.yokai.domain.extension.repo.ExtensionRepoRepository import eu.kanade.tachiyomi.util.system.launchIO import kotlinx.coroutines.flow.MutableStateFlow import kotlinx.coroutines.flow.StateFlow import kotlinx.coroutines.flow.asStateFlow import kotlinx.coroutines.flow.collectLatest -import kotlinx.coroutines.flow.map import okhttp3.internal.toImmutableList -import uy.kohesive.injekt.injectLazy +import uy.kohesive.injekt.Injekt +import uy.kohesive.injekt.api.get class ExtensionRepoViewModel : ViewModel() { - private val sourcePreferences: SourcePreferences by injectLazy() + private val repository = ExtensionRepoRepository(Injekt.get()) private val _repoState: MutableStateFlow = MutableStateFlow(ExtensionRepoState.Loading) val repoState: StateFlow = _repoState.asStateFlow() init { + refresh() + } + + fun addRepo(url: String) { 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()) } } } - - /* - 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 { @@ -68,5 +57,3 @@ sealed class ExtensionRepoState { get() = repos.isEmpty() } } - -private val repoRegex = """^https://.*/index\.min\.json$""".toRegex()