komikku/app/src/main/java/exh/recs/components/RecommendsScreen.kt
Tim Schneeberger 7b30a2a10f
feat: unify recommendation screens and add more sources (jobobby04/TachiyomiSY#1376)
* feat(recommendations): add mangaupdates.com support

* feat(recommendations): display all tracker recommendation sources

* refactor(recommendations): apply spotless

* refactor: split RecommendationPagingSources

* feat(recommendations): unify MangaDex & community recommendations

* refactor: remove old screen

* fix: update comment

* style: fix formatting

* refactor: move onClick handlers

* fix: handle external recommendation links correctly

* fix: apply spotless

* feat: add comick recommendation source

* fix: mark recs from comick as not initialized to force fetching missing metadata

* Update app/src/main/java/exh/recs/BrowseRecommendsScreen.kt

---------

Co-authored-by: jobobby04 <jobobby04@users.noreply.github.com>
(cherry picked from commit d80ad3f145868f9c79bc6d94c08ed847c650e6d6)
2025-01-24 03:06:59 +07:00

97 lines
3.6 KiB
Kotlin

package exh.recs.components
import androidx.compose.foundation.layout.PaddingValues
import androidx.compose.foundation.lazy.LazyColumn
import androidx.compose.runtime.Composable
import androidx.compose.runtime.State
import androidx.compose.ui.platform.LocalContext
import eu.kanade.presentation.browse.components.GlobalSearchCardRow
import eu.kanade.presentation.browse.components.GlobalSearchErrorResultItem
import eu.kanade.presentation.browse.components.GlobalSearchLoadingResultItem
import eu.kanade.presentation.browse.components.GlobalSearchResultItem
import eu.kanade.presentation.components.AppBar
import eu.kanade.presentation.util.formattedMessage
import exh.recs.RecommendationItemResult
import exh.recs.RecommendsScreenModel
import exh.recs.sources.RecommendationPagingSource
import kotlinx.collections.immutable.ImmutableMap
import nl.adaptivity.xmlutil.core.impl.multiplatform.name
import tachiyomi.domain.manga.model.Manga
import tachiyomi.i18n.sy.SYMR
import tachiyomi.presentation.core.components.material.Scaffold
import tachiyomi.presentation.core.i18n.stringResource
@Composable
fun RecommendsScreen(
manga: Manga,
state: RecommendsScreenModel.State,
navigateUp: () -> Unit,
getManga: @Composable (Manga) -> State<Manga>,
onClickSource: (RecommendationPagingSource) -> Unit,
onClickItem: (Manga) -> Unit,
onLongClickItem: (Manga) -> Unit,
) {
Scaffold(
topBar = { scrollBehavior ->
AppBar(
title = stringResource(SYMR.strings.similar, manga.title),
scrollBehavior = scrollBehavior,
navigateUp = navigateUp,
)
},
) { paddingValues ->
RecommendsContent(
items = state.filteredItems,
contentPadding = paddingValues,
getManga = getManga,
onClickSource = onClickSource,
onClickItem = onClickItem,
onLongClickItem = onLongClickItem,
)
}
}
@Composable
internal fun RecommendsContent(
items: ImmutableMap<RecommendationPagingSource, RecommendationItemResult>,
contentPadding: PaddingValues,
getManga: @Composable (Manga) -> State<Manga>,
onClickSource: (RecommendationPagingSource) -> Unit,
onClickItem: (Manga) -> Unit,
onLongClickItem: (Manga) -> Unit,
) {
LazyColumn(
contentPadding = contentPadding,
) {
items.forEach { (source, recResult) ->
item(key = source::class.name) {
GlobalSearchResultItem(
title = source.name,
subtitle = stringResource(source.category),
onClick = { onClickSource(source) },
) {
when (recResult) {
RecommendationItemResult.Loading -> {
GlobalSearchLoadingResultItem()
}
is RecommendationItemResult.Success -> {
GlobalSearchCardRow(
titles = recResult.result,
getManga = getManga,
onClick = onClickItem,
onLongClick = onLongClickItem,
)
}
is RecommendationItemResult.Error -> {
GlobalSearchErrorResultItem(
message = with(LocalContext.current) {
recResult.throwable.formattedMessage
},
)
}
}
}
}
}
}
}