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) } }