LibraryContent.kt 4.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118
  1. package eu.kanade.presentation.library.components
  2. import androidx.compose.foundation.layout.Column
  3. import androidx.compose.foundation.layout.PaddingValues
  4. import androidx.compose.foundation.layout.calculateEndPadding
  5. import androidx.compose.foundation.layout.calculateStartPadding
  6. import androidx.compose.foundation.layout.padding
  7. import androidx.compose.foundation.pager.rememberPagerState
  8. import androidx.compose.runtime.Composable
  9. import androidx.compose.runtime.LaunchedEffect
  10. import androidx.compose.runtime.getValue
  11. import androidx.compose.runtime.mutableStateOf
  12. import androidx.compose.runtime.remember
  13. import androidx.compose.runtime.rememberCoroutineScope
  14. import androidx.compose.runtime.setValue
  15. import androidx.compose.ui.Modifier
  16. import androidx.compose.ui.platform.LocalLayoutDirection
  17. import eu.kanade.core.preference.PreferenceMutableState
  18. import eu.kanade.tachiyomi.ui.library.LibraryItem
  19. import kotlinx.coroutines.delay
  20. import kotlinx.coroutines.launch
  21. import tachiyomi.domain.category.model.Category
  22. import tachiyomi.domain.library.model.LibraryDisplayMode
  23. import tachiyomi.domain.library.model.LibraryManga
  24. import tachiyomi.presentation.core.components.material.PullRefresh
  25. import kotlin.time.Duration.Companion.seconds
  26. @Composable
  27. fun LibraryContent(
  28. categories: List<Category>,
  29. searchQuery: String?,
  30. selection: List<LibraryManga>,
  31. contentPadding: PaddingValues,
  32. currentPage: () -> Int,
  33. hasActiveFilters: Boolean,
  34. showPageTabs: Boolean,
  35. onChangeCurrentPage: (Int) -> Unit,
  36. onMangaClicked: (Long) -> Unit,
  37. onContinueReadingClicked: ((LibraryManga) -> Unit)?,
  38. onToggleSelection: (LibraryManga) -> Unit,
  39. onToggleRangeSelection: (LibraryManga) -> Unit,
  40. onRefresh: (Category?) -> Boolean,
  41. onGlobalSearchClicked: () -> Unit,
  42. getNumberOfMangaForCategory: (Category) -> Int?,
  43. getDisplayMode: (Int) -> PreferenceMutableState<LibraryDisplayMode>,
  44. getColumnsForOrientation: (Boolean) -> PreferenceMutableState<Int>,
  45. getLibraryForPage: (Int) -> List<LibraryItem>,
  46. ) {
  47. Column(
  48. modifier = Modifier.padding(
  49. top = contentPadding.calculateTopPadding(),
  50. start = contentPadding.calculateStartPadding(LocalLayoutDirection.current),
  51. end = contentPadding.calculateEndPadding(LocalLayoutDirection.current),
  52. ),
  53. ) {
  54. val coercedCurrentPage = remember { currentPage().coerceAtMost(categories.lastIndex) }
  55. val pagerState = rememberPagerState(coercedCurrentPage) { categories.size }
  56. val scope = rememberCoroutineScope()
  57. var isRefreshing by remember(pagerState.currentPage) { mutableStateOf(false) }
  58. if (showPageTabs && categories.size > 1) {
  59. LaunchedEffect(categories) {
  60. if (categories.size <= pagerState.currentPage) {
  61. pagerState.scrollToPage(categories.size - 1)
  62. }
  63. }
  64. LibraryTabs(
  65. categories = categories,
  66. pagerState = pagerState,
  67. getNumberOfMangaForCategory = getNumberOfMangaForCategory,
  68. ) { scope.launch { pagerState.animateScrollToPage(it) } }
  69. }
  70. val notSelectionMode = selection.isEmpty()
  71. val onClickManga = { manga: LibraryManga ->
  72. if (notSelectionMode) {
  73. onMangaClicked(manga.manga.id)
  74. } else {
  75. onToggleSelection(manga)
  76. }
  77. }
  78. PullRefresh(
  79. refreshing = isRefreshing,
  80. onRefresh = {
  81. val started = onRefresh(categories[currentPage()])
  82. if (!started) return@PullRefresh
  83. scope.launch {
  84. // Fake refresh status but hide it after a second as it's a long running task
  85. isRefreshing = true
  86. delay(1.seconds)
  87. isRefreshing = false
  88. }
  89. },
  90. enabled = notSelectionMode,
  91. ) {
  92. LibraryPager(
  93. state = pagerState,
  94. contentPadding = PaddingValues(bottom = contentPadding.calculateBottomPadding()),
  95. hasActiveFilters = hasActiveFilters,
  96. selectedManga = selection,
  97. searchQuery = searchQuery,
  98. onGlobalSearchClicked = onGlobalSearchClicked,
  99. getDisplayMode = getDisplayMode,
  100. getColumnsForOrientation = getColumnsForOrientation,
  101. getLibraryForPage = getLibraryForPage,
  102. onClickManga = onClickManga,
  103. onLongClickManga = onToggleRangeSelection,
  104. onClickContinueReading = onContinueReadingClicked,
  105. )
  106. }
  107. LaunchedEffect(pagerState.currentPage) {
  108. onChangeCurrentPage(pagerState.currentPage)
  109. }
  110. }
  111. }