Some navigation janks will be dealt with when the migration is complete (cherry picked from commit 94d1b68598692cc0ef981e2dfbf12303fa962f63) # Conflicts: # app/src/main/java/eu/kanade/presentation/browse/BrowseSourceScreen.kt # app/src/main/java/eu/kanade/presentation/browse/SourceSearchScreen.kt # app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceComfortableGrid.kt # app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceCompactGrid.kt # app/src/main/java/eu/kanade/presentation/browse/components/BrowseSourceList.kt # app/src/main/java/eu/kanade/tachiyomi/ui/browse/migration/search/SourceSearchController.kt # app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/SourcesTab.kt # app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceController.kt # app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/BrowseSourceScreenModel.kt # app/src/main/java/eu/kanade/tachiyomi/ui/browse/source/browse/SourceFilterSheet.kt
143 lines
6.2 KiB
Kotlin
143 lines
6.2 KiB
Kotlin
package exh.md.follows
|
|
|
|
import androidx.activity.compose.BackHandler
|
|
import androidx.compose.material3.SnackbarHost
|
|
import androidx.compose.material3.SnackbarHostState
|
|
import androidx.compose.runtime.Composable
|
|
import androidx.compose.runtime.collectAsState
|
|
import androidx.compose.runtime.getValue
|
|
import androidx.compose.runtime.remember
|
|
import androidx.compose.runtime.rememberCoroutineScope
|
|
import androidx.compose.ui.hapticfeedback.HapticFeedbackType
|
|
import androidx.compose.ui.platform.LocalConfiguration
|
|
import androidx.compose.ui.platform.LocalHapticFeedback
|
|
import androidx.compose.ui.res.stringResource
|
|
import androidx.paging.compose.collectAsLazyPagingItems
|
|
import cafe.adriel.voyager.core.model.rememberScreenModel
|
|
import cafe.adriel.voyager.core.screen.Screen
|
|
import cafe.adriel.voyager.navigator.LocalNavigator
|
|
import cafe.adriel.voyager.navigator.currentOrThrow
|
|
import eu.kanade.presentation.browse.BrowseSourceContent
|
|
import eu.kanade.presentation.browse.components.BrowseSourceSimpleToolbar
|
|
import eu.kanade.presentation.browse.components.RemoveMangaDialog
|
|
import eu.kanade.presentation.components.ChangeCategoryDialog
|
|
import eu.kanade.presentation.components.DuplicateMangaDialog
|
|
import eu.kanade.presentation.components.Scaffold
|
|
import eu.kanade.presentation.util.LocalRouter
|
|
import eu.kanade.tachiyomi.R
|
|
import eu.kanade.tachiyomi.ui.base.controller.pushController
|
|
import eu.kanade.tachiyomi.ui.browse.source.browse.BrowseSourceScreenModel
|
|
import eu.kanade.tachiyomi.ui.category.CategoryController
|
|
import eu.kanade.tachiyomi.ui.manga.MangaController
|
|
import eu.kanade.tachiyomi.util.lang.launchIO
|
|
|
|
class MangaDexFollowsScreen(private val sourceId: Long) : Screen {
|
|
|
|
@Composable
|
|
override fun Content() {
|
|
val router = LocalRouter.currentOrThrow
|
|
val navigator = LocalNavigator.currentOrThrow
|
|
val scope = rememberCoroutineScope()
|
|
val haptic = LocalHapticFeedback.current
|
|
val screenModel = rememberScreenModel { MangaDexFollowsScreenModel(sourceId) }
|
|
val state by screenModel.state.collectAsState()
|
|
|
|
val snackbarHostState = remember { SnackbarHostState() }
|
|
|
|
val navigateUp: () -> Unit = {
|
|
when {
|
|
navigator.canPop -> navigator.pop()
|
|
router.backstackSize > 1 -> router.popCurrentController()
|
|
}
|
|
}
|
|
|
|
Scaffold(
|
|
topBar = { scrollBehavior ->
|
|
BrowseSourceSimpleToolbar(
|
|
title = stringResource(R.string.mangadex_follows),
|
|
displayMode = screenModel.displayMode,
|
|
onDisplayModeChange = { screenModel.displayMode = it },
|
|
navigateUp = navigateUp,
|
|
scrollBehavior = scrollBehavior,
|
|
)
|
|
},
|
|
snackbarHost = {
|
|
SnackbarHost(hostState = snackbarHostState)
|
|
},
|
|
) { paddingValues ->
|
|
val mangaList = remember(state.currentFilter) {
|
|
screenModel.getMangaListFlow(state.currentFilter)
|
|
}.collectAsLazyPagingItems()
|
|
|
|
BrowseSourceContent(
|
|
source = screenModel.source,
|
|
mangaList = mangaList,
|
|
columns = screenModel.getColumnsPreference(LocalConfiguration.current.orientation),
|
|
// SY -->
|
|
ehentaiBrowseDisplayMode = screenModel.ehentaiBrowseDisplayMode,
|
|
// SY <--
|
|
displayMode = screenModel.displayMode,
|
|
snackbarHostState = snackbarHostState,
|
|
contentPadding = paddingValues,
|
|
onWebViewClick = null,
|
|
onHelpClick = null,
|
|
onLocalSourceHelpClick = null,
|
|
onMangaClick = { router.pushController(MangaController(it.id, true)) },
|
|
onMangaLongClick = { manga ->
|
|
scope.launchIO {
|
|
val duplicateManga = screenModel.getDuplicateLibraryManga(manga)
|
|
when {
|
|
manga.favorite -> screenModel.setDialog(BrowseSourceScreenModel.Dialog.RemoveManga(manga))
|
|
duplicateManga != null -> screenModel.setDialog(
|
|
BrowseSourceScreenModel.Dialog.AddDuplicateManga(
|
|
manga,
|
|
duplicateManga,
|
|
),
|
|
)
|
|
else -> screenModel.addFavorite(manga)
|
|
}
|
|
haptic.performHapticFeedback(HapticFeedbackType.LongPress)
|
|
}
|
|
},
|
|
)
|
|
}
|
|
|
|
val onDismissRequest = { screenModel.setDialog(null) }
|
|
when (val dialog = state.dialog) {
|
|
is BrowseSourceScreenModel.Dialog.Migrate -> {}
|
|
is BrowseSourceScreenModel.Dialog.AddDuplicateManga -> {
|
|
DuplicateMangaDialog(
|
|
onDismissRequest = onDismissRequest,
|
|
onConfirm = { screenModel.addFavorite(dialog.manga) },
|
|
onOpenManga = { router.pushController(MangaController(dialog.duplicate.id)) },
|
|
duplicateFrom = screenModel.getSourceOrStub(dialog.duplicate),
|
|
)
|
|
}
|
|
is BrowseSourceScreenModel.Dialog.RemoveManga -> {
|
|
RemoveMangaDialog(
|
|
onDismissRequest = onDismissRequest,
|
|
onConfirm = {
|
|
screenModel.changeMangaFavorite(dialog.manga)
|
|
},
|
|
mangaToRemove = dialog.manga,
|
|
)
|
|
}
|
|
is BrowseSourceScreenModel.Dialog.ChangeMangaCategory -> {
|
|
ChangeCategoryDialog(
|
|
initialSelection = dialog.initialSelection,
|
|
onDismissRequest = onDismissRequest,
|
|
onEditCategories = {
|
|
router.pushController(CategoryController())
|
|
},
|
|
onConfirm = { include, _ ->
|
|
screenModel.changeMangaFavorite(dialog.manga)
|
|
screenModel.moveMangaToCategories(dialog.manga, include)
|
|
},
|
|
)
|
|
}
|
|
else -> {}
|
|
}
|
|
|
|
BackHandler(onBack = navigateUp)
|
|
}
|
|
}
|