Handle unknown manga sources
This commit is contained in:
@@ -42,7 +42,7 @@ class BookmarksViewModel @Inject constructor(
|
|||||||
BookmarksGroup(manga, bookmarks)
|
BookmarksGroup(manga, bookmarks)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
.catch { e -> e.toErrorState(canRetry = false) }
|
.catch { e -> emit(listOf(e.toErrorState(canRetry = false))) }
|
||||||
.asLiveDataDistinct(viewModelScope.coroutineContext + Dispatchers.Default, listOf(LoadingState))
|
.asLiveDataDistinct(viewModelScope.coroutineContext + Dispatchers.Default, listOf(LoadingState))
|
||||||
|
|
||||||
fun removeBookmarks(ids: Map<Manga, Set<Long>>) {
|
fun removeBookmarks(ids: Map<Manga, Set<Long>>) {
|
||||||
|
|||||||
@@ -1,5 +1,6 @@
|
|||||||
package org.koitharu.kotatsu.core.db.entity
|
package org.koitharu.kotatsu.core.db.entity
|
||||||
|
|
||||||
|
import org.koitharu.kotatsu.core.model.MangaSource
|
||||||
import org.koitharu.kotatsu.parsers.model.*
|
import org.koitharu.kotatsu.parsers.model.*
|
||||||
import org.koitharu.kotatsu.parsers.util.mapToSet
|
import org.koitharu.kotatsu.parsers.util.mapToSet
|
||||||
import org.koitharu.kotatsu.parsers.util.toTitleCase
|
import org.koitharu.kotatsu.parsers.util.toTitleCase
|
||||||
@@ -10,7 +11,7 @@ import org.koitharu.kotatsu.utils.ext.longHashCode
|
|||||||
fun TagEntity.toMangaTag() = MangaTag(
|
fun TagEntity.toMangaTag() = MangaTag(
|
||||||
key = this.key,
|
key = this.key,
|
||||||
title = this.title.toTitleCase(),
|
title = this.title.toTitleCase(),
|
||||||
source = MangaSource.valueOf(this.source),
|
source = MangaSource(this.source) ?: MangaSource.DUMMY,
|
||||||
)
|
)
|
||||||
|
|
||||||
fun Collection<TagEntity>.toMangaTags() = mapToSet(TagEntity::toMangaTag)
|
fun Collection<TagEntity>.toMangaTags() = mapToSet(TagEntity::toMangaTag)
|
||||||
@@ -19,7 +20,7 @@ fun MangaEntity.toManga(tags: Set<MangaTag>) = Manga(
|
|||||||
id = this.id,
|
id = this.id,
|
||||||
title = this.title,
|
title = this.title,
|
||||||
altTitle = this.altTitle,
|
altTitle = this.altTitle,
|
||||||
state = this.state?.let { MangaState.valueOf(it) },
|
state = this.state?.let { MangaState(it) },
|
||||||
rating = this.rating,
|
rating = this.rating,
|
||||||
isNsfw = this.isNsfw,
|
isNsfw = this.isNsfw,
|
||||||
url = this.url,
|
url = this.url,
|
||||||
@@ -27,8 +28,8 @@ fun MangaEntity.toManga(tags: Set<MangaTag>) = Manga(
|
|||||||
coverUrl = this.coverUrl,
|
coverUrl = this.coverUrl,
|
||||||
largeCoverUrl = this.largeCoverUrl,
|
largeCoverUrl = this.largeCoverUrl,
|
||||||
author = this.author,
|
author = this.author,
|
||||||
source = MangaSource.valueOf(this.source),
|
source = MangaSource(this.source) ?: MangaSource.DUMMY,
|
||||||
tags = tags
|
tags = tags,
|
||||||
)
|
)
|
||||||
|
|
||||||
fun MangaWithTags.toManga() = manga.toManga(tags.toMangaTags())
|
fun MangaWithTags.toManga() = manga.toManga(tags.toMangaTags())
|
||||||
@@ -54,14 +55,18 @@ fun MangaTag.toEntity() = TagEntity(
|
|||||||
title = title,
|
title = title,
|
||||||
key = key,
|
key = key,
|
||||||
source = source.name,
|
source = source.name,
|
||||||
id = "${key}_${source.name}".longHashCode()
|
id = "${key}_${source.name}".longHashCode(),
|
||||||
)
|
)
|
||||||
|
|
||||||
fun Collection<MangaTag>.toEntities() = map(MangaTag::toEntity)
|
fun Collection<MangaTag>.toEntities() = map(MangaTag::toEntity)
|
||||||
|
|
||||||
// Other
|
// Other
|
||||||
|
|
||||||
@Suppress("FunctionName")
|
|
||||||
fun SortOrder(name: String, fallback: SortOrder): SortOrder = runCatching {
|
fun SortOrder(name: String, fallback: SortOrder): SortOrder = runCatching {
|
||||||
SortOrder.valueOf(name)
|
SortOrder.valueOf(name)
|
||||||
}.getOrDefault(fallback)
|
}.getOrDefault(fallback)
|
||||||
|
|
||||||
|
@Suppress("FunctionName")
|
||||||
|
fun MangaState(name: String): MangaState? = runCatching {
|
||||||
|
MangaState.valueOf(name)
|
||||||
|
}.getOrNull()
|
||||||
|
|||||||
@@ -28,4 +28,4 @@ fun MangaChapter.toListItem(
|
|||||||
uploadDateMs = uploadDate,
|
uploadDateMs = uploadDate,
|
||||||
dateFormat = dateFormat,
|
dateFormat = dateFormat,
|
||||||
)
|
)
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -26,6 +26,7 @@ import org.koitharu.kotatsu.list.ui.model.toErrorState
|
|||||||
import org.koitharu.kotatsu.list.ui.model.toUi
|
import org.koitharu.kotatsu.list.ui.model.toUi
|
||||||
import org.koitharu.kotatsu.parsers.model.SortOrder
|
import org.koitharu.kotatsu.parsers.model.SortOrder
|
||||||
import org.koitharu.kotatsu.tracker.domain.TrackingRepository
|
import org.koitharu.kotatsu.tracker.domain.TrackingRepository
|
||||||
|
import org.koitharu.kotatsu.utils.asFlowLiveData
|
||||||
import org.koitharu.kotatsu.utils.ext.asLiveDataDistinct
|
import org.koitharu.kotatsu.utils.ext.asLiveDataDistinct
|
||||||
|
|
||||||
class FavouritesListViewModel @AssistedInject constructor(
|
class FavouritesListViewModel @AssistedInject constructor(
|
||||||
@@ -53,7 +54,7 @@ class FavouritesListViewModel @AssistedInject constructor(
|
|||||||
} else {
|
} else {
|
||||||
repository.observeAll(categoryId)
|
repository.observeAll(categoryId)
|
||||||
},
|
},
|
||||||
createListModeFlow()
|
createListModeFlow(),
|
||||||
) { list, mode ->
|
) { list, mode ->
|
||||||
when {
|
when {
|
||||||
list.isEmpty() -> listOf(
|
list.isEmpty() -> listOf(
|
||||||
@@ -66,13 +67,13 @@ class FavouritesListViewModel @AssistedInject constructor(
|
|||||||
R.string.favourites_category_empty
|
R.string.favourites_category_empty
|
||||||
},
|
},
|
||||||
actionStringRes = 0,
|
actionStringRes = 0,
|
||||||
)
|
),
|
||||||
)
|
)
|
||||||
else -> list.toUi(mode, this)
|
else -> list.toUi(mode, this)
|
||||||
}
|
}
|
||||||
}.catch {
|
}.catch {
|
||||||
emit(listOf(it.toErrorState(canRetry = false)))
|
emit(listOf(it.toErrorState(canRetry = false)))
|
||||||
}.asLiveDataDistinct(viewModelScope.coroutineContext + Dispatchers.Default, listOf(LoadingState))
|
}.asFlowLiveData(viewModelScope.coroutineContext + Dispatchers.Default, listOf(LoadingState))
|
||||||
|
|
||||||
init {
|
init {
|
||||||
if (categoryId != NO_ID) {
|
if (categoryId != NO_ID) {
|
||||||
|
|||||||
@@ -23,7 +23,7 @@ import org.koitharu.kotatsu.history.domain.PROGRESS_NONE
|
|||||||
import org.koitharu.kotatsu.list.ui.MangaListViewModel
|
import org.koitharu.kotatsu.list.ui.MangaListViewModel
|
||||||
import org.koitharu.kotatsu.list.ui.model.*
|
import org.koitharu.kotatsu.list.ui.model.*
|
||||||
import org.koitharu.kotatsu.tracker.domain.TrackingRepository
|
import org.koitharu.kotatsu.tracker.domain.TrackingRepository
|
||||||
import org.koitharu.kotatsu.utils.ext.asLiveDataDistinct
|
import org.koitharu.kotatsu.utils.asFlowLiveData
|
||||||
import org.koitharu.kotatsu.utils.ext.daysDiff
|
import org.koitharu.kotatsu.utils.ext.daysDiff
|
||||||
import org.koitharu.kotatsu.utils.ext.onFirst
|
import org.koitharu.kotatsu.utils.ext.onFirst
|
||||||
|
|
||||||
@@ -60,8 +60,8 @@ class HistoryListViewModel @Inject constructor(
|
|||||||
}.onFirst {
|
}.onFirst {
|
||||||
loadingCounter.decrement()
|
loadingCounter.decrement()
|
||||||
}.catch {
|
}.catch {
|
||||||
it.toErrorState(canRetry = false)
|
emit(listOf(it.toErrorState(canRetry = false)))
|
||||||
}.asLiveDataDistinct(viewModelScope.coroutineContext + Dispatchers.Default, listOf(LoadingState))
|
}.asFlowLiveData(viewModelScope.coroutineContext + Dispatchers.Default, listOf(LoadingState))
|
||||||
|
|
||||||
override fun onRefresh() = Unit
|
override fun onRefresh() = Unit
|
||||||
|
|
||||||
|
|||||||
@@ -27,7 +27,7 @@ import org.koitharu.kotatsu.list.ui.model.*
|
|||||||
import org.koitharu.kotatsu.parsers.model.Manga
|
import org.koitharu.kotatsu.parsers.model.Manga
|
||||||
import org.koitharu.kotatsu.tracker.domain.TrackingRepository
|
import org.koitharu.kotatsu.tracker.domain.TrackingRepository
|
||||||
import org.koitharu.kotatsu.utils.SingleLiveEvent
|
import org.koitharu.kotatsu.utils.SingleLiveEvent
|
||||||
import org.koitharu.kotatsu.utils.ext.asLiveDataDistinct
|
import org.koitharu.kotatsu.utils.asFlowLiveData
|
||||||
import org.koitharu.kotatsu.utils.ext.daysDiff
|
import org.koitharu.kotatsu.utils.ext.daysDiff
|
||||||
|
|
||||||
private const val HISTORY_MAX_SEGMENTS = 2
|
private const val HISTORY_MAX_SEGMENTS = 2
|
||||||
@@ -49,8 +49,8 @@ class LibraryViewModel @Inject constructor(
|
|||||||
) { history, favourites ->
|
) { history, favourites ->
|
||||||
mapList(history, favourites)
|
mapList(history, favourites)
|
||||||
}.catch { e ->
|
}.catch { e ->
|
||||||
e.toErrorState(canRetry = false)
|
emit(listOf(e.toErrorState(canRetry = false)))
|
||||||
}.asLiveDataDistinct(viewModelScope.coroutineContext + Dispatchers.Default, listOf(LoadingState))
|
}.asFlowLiveData(viewModelScope.coroutineContext + Dispatchers.Default, listOf(LoadingState))
|
||||||
|
|
||||||
override suspend fun getCounter(mangaId: Long): Int {
|
override suspend fun getCounter(mangaId: Long): Int {
|
||||||
return trackingRepository.getNewChaptersCount(mangaId)
|
return trackingRepository.getNewChaptersCount(mangaId)
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ import org.koitharu.kotatsu.list.ui.model.LoadingState
|
|||||||
import org.koitharu.kotatsu.list.ui.model.toErrorState
|
import org.koitharu.kotatsu.list.ui.model.toErrorState
|
||||||
import org.koitharu.kotatsu.list.ui.model.toUi
|
import org.koitharu.kotatsu.list.ui.model.toUi
|
||||||
import org.koitharu.kotatsu.suggestions.domain.SuggestionRepository
|
import org.koitharu.kotatsu.suggestions.domain.SuggestionRepository
|
||||||
import org.koitharu.kotatsu.utils.ext.asLiveDataDistinct
|
import org.koitharu.kotatsu.utils.asFlowLiveData
|
||||||
import org.koitharu.kotatsu.utils.ext.onFirst
|
import org.koitharu.kotatsu.utils.ext.onFirst
|
||||||
|
|
||||||
@HiltViewModel
|
@HiltViewModel
|
||||||
@@ -44,8 +44,8 @@ class SuggestionsViewModel @Inject constructor(
|
|||||||
}.onFirst {
|
}.onFirst {
|
||||||
loadingCounter.decrement()
|
loadingCounter.decrement()
|
||||||
}.catch {
|
}.catch {
|
||||||
it.toErrorState(canRetry = false)
|
emit(listOf(it.toErrorState(canRetry = false)))
|
||||||
}.asLiveDataDistinct(
|
}.asFlowLiveData(
|
||||||
viewModelScope.coroutineContext + Dispatchers.Default,
|
viewModelScope.coroutineContext + Dispatchers.Default,
|
||||||
listOf(LoadingState),
|
listOf(LoadingState),
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user