LibraryContent.kt 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116
  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.padding
  5. import androidx.compose.runtime.Composable
  6. import androidx.compose.runtime.LaunchedEffect
  7. import androidx.compose.runtime.State
  8. import androidx.compose.runtime.remember
  9. import androidx.compose.ui.Modifier
  10. import androidx.compose.ui.platform.LocalUriHandler
  11. import com.google.accompanist.pager.rememberPagerState
  12. import com.google.accompanist.swiperefresh.SwipeRefresh
  13. import com.google.accompanist.swiperefresh.rememberSwipeRefreshState
  14. import eu.kanade.core.prefs.PreferenceMutableState
  15. import eu.kanade.domain.category.model.Category
  16. import eu.kanade.presentation.components.EmptyScreen
  17. import eu.kanade.presentation.components.SwipeRefreshIndicator
  18. import eu.kanade.presentation.library.LibraryState
  19. import eu.kanade.tachiyomi.R
  20. import eu.kanade.tachiyomi.data.database.models.LibraryManga
  21. import eu.kanade.tachiyomi.ui.library.LibraryItem
  22. import eu.kanade.tachiyomi.ui.library.setting.DisplayModeSetting
  23. import eu.kanade.tachiyomi.widget.EmptyView
  24. @Composable
  25. fun LibraryContent(
  26. state: LibraryState,
  27. contentPadding: PaddingValues,
  28. currentPage: () -> Int,
  29. isLibraryEmpty: () -> Boolean,
  30. isDownloadOnly: Boolean,
  31. isIncognitoMode: Boolean,
  32. showPageTabs: Boolean,
  33. showMangaCount: Boolean,
  34. onChangeCurrentPage: (Int) -> Unit,
  35. onMangaClicked: (Long) -> Unit,
  36. onToggleSelection: (LibraryManga) -> Unit,
  37. onRefresh: (Category?) -> Unit,
  38. onGlobalSearchClicked: () -> Unit,
  39. getNumberOfMangaForCategory: @Composable (Long) -> State<Int?>,
  40. getDisplayModeForPage: @Composable (Int) -> State<DisplayModeSetting>,
  41. getColumnsForOrientation: (Boolean) -> PreferenceMutableState<Int>,
  42. getLibraryForPage: @Composable (Int) -> State<List<LibraryItem>>,
  43. ) {
  44. Column(
  45. modifier = Modifier.padding(contentPadding),
  46. ) {
  47. val categories = state.categories
  48. val coercedCurrentPage = remember { currentPage().coerceAtMost(categories.lastIndex) }
  49. val pagerState = rememberPagerState(coercedCurrentPage)
  50. if (showPageTabs && categories.size > 1) {
  51. LibraryTabs(
  52. state = pagerState,
  53. categories = categories,
  54. showMangaCount = showMangaCount,
  55. getNumberOfMangaForCategory = getNumberOfMangaForCategory,
  56. isDownloadOnly = isDownloadOnly,
  57. isIncognitoMode = isIncognitoMode,
  58. )
  59. }
  60. val onClickManga = { manga: LibraryManga ->
  61. if (state.selectionMode.not()) {
  62. onMangaClicked(manga.id!!)
  63. } else {
  64. onToggleSelection(manga)
  65. }
  66. }
  67. val onLongClickManga = { manga: LibraryManga ->
  68. onToggleSelection(manga)
  69. }
  70. SwipeRefresh(
  71. state = rememberSwipeRefreshState(isRefreshing = false),
  72. onRefresh = { onRefresh(categories[currentPage()]) },
  73. indicator = { s, trigger ->
  74. SwipeRefreshIndicator(
  75. state = s,
  76. refreshTriggerDistance = trigger,
  77. )
  78. },
  79. ) {
  80. if (state.searchQuery.isNullOrEmpty() && isLibraryEmpty()) {
  81. val handler = LocalUriHandler.current
  82. EmptyScreen(
  83. R.string.information_empty_library,
  84. listOf(
  85. EmptyView.Action(R.string.getting_started_guide, R.drawable.ic_help_24dp) {
  86. handler.openUri("https://tachiyomi.org/help/guides/getting-started")
  87. },
  88. ),
  89. )
  90. return@SwipeRefresh
  91. }
  92. LibraryPager(
  93. state = pagerState,
  94. pageCount = categories.size,
  95. selectedManga = state.selection,
  96. getDisplayModeForPage = getDisplayModeForPage,
  97. getColumnsForOrientation = getColumnsForOrientation,
  98. getLibraryForPage = getLibraryForPage,
  99. onClickManga = onClickManga,
  100. onLongClickManga = onLongClickManga,
  101. onGlobalSearchClicked = onGlobalSearchClicked,
  102. searchQuery = state.searchQuery,
  103. )
  104. }
  105. LaunchedEffect(pagerState.currentPage) {
  106. onChangeCurrentPage(pagerState.currentPage)
  107. }
  108. }
  109. }