Fix source feed crash on non-catalogue sources
This commit is contained in:
parent
c8446b8d65
commit
9d17b47bdb
@ -13,7 +13,7 @@ import eu.kanade.presentation.browse.SourceFeedScreen
|
|||||||
import eu.kanade.presentation.browse.components.SourceFeedAddDialog
|
import eu.kanade.presentation.browse.components.SourceFeedAddDialog
|
||||||
import eu.kanade.presentation.browse.components.SourceFeedDeleteDialog
|
import eu.kanade.presentation.browse.components.SourceFeedDeleteDialog
|
||||||
import eu.kanade.presentation.util.Screen
|
import eu.kanade.presentation.util.Screen
|
||||||
import eu.kanade.tachiyomi.source.CatalogueSource
|
import eu.kanade.tachiyomi.source.Source
|
||||||
import eu.kanade.tachiyomi.ui.browse.source.browse.BrowseSourceScreen
|
import eu.kanade.tachiyomi.ui.browse.source.browse.BrowseSourceScreen
|
||||||
import eu.kanade.tachiyomi.ui.browse.source.browse.SourceFilterDialog
|
import eu.kanade.tachiyomi.ui.browse.source.browse.SourceFilterDialog
|
||||||
import eu.kanade.tachiyomi.ui.manga.MangaScreen
|
import eu.kanade.tachiyomi.ui.manga.MangaScreen
|
||||||
@ -150,19 +150,19 @@ class SourceFeedScreen(val sourceId: Long) : Screen() {
|
|||||||
navigator.replace(BrowseSourceScreen(sourceId, search, savedSearch = savedSearch, filtersJson = filters))
|
navigator.replace(BrowseSourceScreen(sourceId, search, savedSearch = savedSearch, filtersJson = filters))
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun onLatestClick(navigator: Navigator, source: CatalogueSource) {
|
private fun onLatestClick(navigator: Navigator, source: Source) {
|
||||||
navigator.replace(BrowseSourceScreen(source.id, GetRemoteManga.QUERY_LATEST))
|
navigator.replace(BrowseSourceScreen(source.id, GetRemoteManga.QUERY_LATEST))
|
||||||
}
|
}
|
||||||
|
|
||||||
fun onBrowseClick(navigator: Navigator, source: CatalogueSource) {
|
fun onBrowseClick(navigator: Navigator, source: Source) {
|
||||||
navigator.replace(BrowseSourceScreen(source.id, GetRemoteManga.QUERY_POPULAR))
|
navigator.replace(BrowseSourceScreen(source.id, GetRemoteManga.QUERY_POPULAR))
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun onSavedSearchClick(navigator: Navigator, source: CatalogueSource, savedSearch: SavedSearch) {
|
private fun onSavedSearchClick(navigator: Navigator, source: Source, savedSearch: SavedSearch) {
|
||||||
navigator.replace(BrowseSourceScreen(source.id, listingQuery = null, savedSearch = savedSearch.id))
|
navigator.replace(BrowseSourceScreen(source.id, listingQuery = null, savedSearch = savedSearch.id))
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun onSearchClick(navigator: Navigator, source: CatalogueSource, query: String) {
|
private fun onSearchClick(navigator: Navigator, source: Source, query: String) {
|
||||||
onBrowseClick(navigator, source.id, query.nullIfBlank())
|
onBrowseClick(navigator, source.id, query.nullIfBlank())
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -69,7 +69,7 @@ open class SourceFeedScreenModel(
|
|||||||
private val getExhSavedSearch: GetExhSavedSearch = Injekt.get(),
|
private val getExhSavedSearch: GetExhSavedSearch = Injekt.get(),
|
||||||
) : StateScreenModel<SourceFeedState>(SourceFeedState()) {
|
) : StateScreenModel<SourceFeedState>(SourceFeedState()) {
|
||||||
|
|
||||||
val source = sourceManager.getOrStub(sourceId) as CatalogueSource
|
val source = sourceManager.getOrStub(sourceId)
|
||||||
|
|
||||||
val sourceIsMangaDex = sourceId in mangaDexSourceIds
|
val sourceIsMangaDex = sourceId in mangaDexSourceIds
|
||||||
|
|
||||||
@ -78,24 +78,26 @@ open class SourceFeedScreenModel(
|
|||||||
val startExpanded by uiPreferences.expandFilters().asState(coroutineScope)
|
val startExpanded by uiPreferences.expandFilters().asState(coroutineScope)
|
||||||
|
|
||||||
init {
|
init {
|
||||||
setFilters(source.getFilterList())
|
if (source is CatalogueSource) {
|
||||||
|
setFilters(source.getFilterList())
|
||||||
|
|
||||||
coroutineScope.launchIO {
|
coroutineScope.launchIO {
|
||||||
val searches = loadSearches()
|
val searches = loadSearches()
|
||||||
mutableState.update { it.copy(savedSearches = searches) }
|
mutableState.update { it.copy(savedSearches = searches) }
|
||||||
}
|
|
||||||
|
|
||||||
getFeedSavedSearchBySourceId.subscribe(source.id)
|
|
||||||
.onEach {
|
|
||||||
val items = getSourcesToGetFeed(it)
|
|
||||||
mutableState.update { state ->
|
|
||||||
state.copy(
|
|
||||||
items = items,
|
|
||||||
)
|
|
||||||
}
|
|
||||||
getFeed(items)
|
|
||||||
}
|
}
|
||||||
.launchIn(coroutineScope)
|
|
||||||
|
getFeedSavedSearchBySourceId.subscribe(source.id)
|
||||||
|
.onEach {
|
||||||
|
val items = getSourcesToGetFeed(it)
|
||||||
|
mutableState.update { state ->
|
||||||
|
state.copy(
|
||||||
|
items = items,
|
||||||
|
)
|
||||||
|
}
|
||||||
|
getFeed(items)
|
||||||
|
}
|
||||||
|
.launchIn(coroutineScope)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
fun setFilters(filters: FilterList) {
|
fun setFilters(filters: FilterList) {
|
||||||
@ -126,6 +128,7 @@ open class SourceFeedScreenModel(
|
|||||||
}
|
}
|
||||||
|
|
||||||
private suspend fun getSourcesToGetFeed(feedSavedSearch: List<FeedSavedSearch>): List<SourceFeedUI> {
|
private suspend fun getSourcesToGetFeed(feedSavedSearch: List<FeedSavedSearch>): List<SourceFeedUI> {
|
||||||
|
if (source !is CatalogueSource) return emptyList()
|
||||||
val savedSearches = getSavedSearchBySourceIdFeed.await(source.id)
|
val savedSearches = getSavedSearchBySourceIdFeed.await(source.id)
|
||||||
.associateBy { it.id }
|
.associateBy { it.id }
|
||||||
|
|
||||||
@ -144,6 +147,7 @@ open class SourceFeedScreenModel(
|
|||||||
* Initiates get manga per feed.
|
* Initiates get manga per feed.
|
||||||
*/
|
*/
|
||||||
private fun getFeed(feedSavedSearch: List<SourceFeedUI>) {
|
private fun getFeed(feedSavedSearch: List<SourceFeedUI>) {
|
||||||
|
if (source !is CatalogueSource) return
|
||||||
coroutineScope.launch {
|
coroutineScope.launch {
|
||||||
feedSavedSearch.map { sourceFeed ->
|
feedSavedSearch.map { sourceFeed ->
|
||||||
async {
|
async {
|
||||||
@ -204,10 +208,11 @@ open class SourceFeedScreenModel(
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
private suspend fun loadSearches() =
|
private suspend fun loadSearches() =
|
||||||
getExhSavedSearch.await(source.id, source::getFilterList)
|
getExhSavedSearch.await(source.id, (source as CatalogueSource)::getFilterList)
|
||||||
.sortedWith(compareBy(String.CASE_INSENSITIVE_ORDER, EXHSavedSearch::name))
|
.sortedWith(compareBy(String.CASE_INSENSITIVE_ORDER, EXHSavedSearch::name))
|
||||||
|
|
||||||
fun onFilter(onBrowseClick: (query: String?, filters: String?) -> Unit) {
|
fun onFilter(onBrowseClick: (query: String?, filters: String?) -> Unit) {
|
||||||
|
if (source !is CatalogueSource) return
|
||||||
coroutineScope.launchIO {
|
coroutineScope.launchIO {
|
||||||
val allDefault = state.value.filters == source.getFilterList()
|
val allDefault = state.value.filters == source.getFilterList()
|
||||||
dismissDialog()
|
dismissDialog()
|
||||||
@ -230,6 +235,7 @@ open class SourceFeedScreenModel(
|
|||||||
onBrowseClick: (query: String?, searchId: Long) -> Unit,
|
onBrowseClick: (query: String?, searchId: Long) -> Unit,
|
||||||
onToast: (Int) -> Unit,
|
onToast: (Int) -> Unit,
|
||||||
) {
|
) {
|
||||||
|
if (source !is CatalogueSource) return
|
||||||
coroutineScope.launchIO {
|
coroutineScope.launchIO {
|
||||||
if (search.filterList == null && state.value.filters.isNotEmpty()) {
|
if (search.filterList == null && state.value.filters.isNotEmpty()) {
|
||||||
withUIContext {
|
withUIContext {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user