|
@@ -26,6 +26,7 @@ import androidx.compose.foundation.layout.offset
|
|
|
import androidx.compose.foundation.layout.padding
|
|
import androidx.compose.foundation.layout.padding
|
|
|
import androidx.compose.foundation.layout.size
|
|
import androidx.compose.foundation.layout.size
|
|
|
import androidx.compose.foundation.layout.width
|
|
import androidx.compose.foundation.layout.width
|
|
|
|
|
+import androidx.compose.foundation.lazy.LazyColumn
|
|
|
import androidx.compose.foundation.lazy.LazyRow
|
|
import androidx.compose.foundation.lazy.LazyRow
|
|
|
import androidx.compose.foundation.lazy.itemsIndexed
|
|
import androidx.compose.foundation.lazy.itemsIndexed
|
|
|
import androidx.compose.foundation.pager.HorizontalPager
|
|
import androidx.compose.foundation.pager.HorizontalPager
|
|
@@ -56,6 +57,7 @@ import androidx.compose.runtime.derivedStateOf
|
|
|
import androidx.compose.runtime.getValue
|
|
import androidx.compose.runtime.getValue
|
|
|
import androidx.compose.runtime.mutableStateOf
|
|
import androidx.compose.runtime.mutableStateOf
|
|
|
import androidx.compose.runtime.remember
|
|
import androidx.compose.runtime.remember
|
|
|
|
|
+import androidx.compose.runtime.rememberCoroutineScope
|
|
|
import androidx.compose.runtime.setValue
|
|
import androidx.compose.runtime.setValue
|
|
|
import androidx.compose.runtime.snapshotFlow
|
|
import androidx.compose.runtime.snapshotFlow
|
|
|
import androidx.compose.ui.Alignment
|
|
import androidx.compose.ui.Alignment
|
|
@@ -107,6 +109,7 @@ import io.legado.app.ui.widget.components.book.SearchBookPreviewSheet
|
|
|
import io.legado.app.ui.widget.components.button.series.MediumTonalButton
|
|
import io.legado.app.ui.widget.components.button.series.MediumTonalButton
|
|
|
import io.legado.app.ui.widget.components.button.series.SmallTonalButton
|
|
import io.legado.app.ui.widget.components.button.series.SmallTonalButton
|
|
|
import io.legado.app.ui.widget.components.card.GlassCard
|
|
import io.legado.app.ui.widget.components.card.GlassCard
|
|
|
|
|
+import io.legado.app.ui.widget.components.card.SelectionItemCard
|
|
|
import io.legado.app.ui.widget.components.card.TextCard
|
|
import io.legado.app.ui.widget.components.card.TextCard
|
|
|
import io.legado.app.ui.widget.components.icon.AppIcon
|
|
import io.legado.app.ui.widget.components.icon.AppIcon
|
|
|
import io.legado.app.ui.widget.components.icon.AppIcons
|
|
import io.legado.app.ui.widget.components.icon.AppIcons
|
|
@@ -126,6 +129,7 @@ import io.legado.app.utils.takePersistablePermissionSafely
|
|
|
import io.legado.app.utils.toastOnUi
|
|
import io.legado.app.utils.toastOnUi
|
|
|
import kotlinx.coroutines.flow.collectLatest
|
|
import kotlinx.coroutines.flow.collectLatest
|
|
|
import kotlinx.coroutines.flow.distinctUntilChanged
|
|
import kotlinx.coroutines.flow.distinctUntilChanged
|
|
|
|
|
+import kotlinx.coroutines.launch
|
|
|
import org.koin.androidx.compose.koinViewModel
|
|
import org.koin.androidx.compose.koinViewModel
|
|
|
import java.text.DateFormat
|
|
import java.text.DateFormat
|
|
|
import java.util.Date
|
|
import java.util.Date
|
|
@@ -133,6 +137,7 @@ import kotlin.math.roundToInt
|
|
|
|
|
|
|
|
@Composable
|
|
@Composable
|
|
|
fun HomeRouteScreen(
|
|
fun HomeRouteScreen(
|
|
|
|
|
+ showSourceSetMenuRequest: Long = 0L,
|
|
|
onOpenBook: (Book) -> Unit,
|
|
onOpenBook: (Book) -> Unit,
|
|
|
onNavigateToBookInfo: (
|
|
onNavigateToBookInfo: (
|
|
|
name: String?,
|
|
name: String?,
|
|
@@ -331,6 +336,7 @@ fun HomeRouteScreen(
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
HomeScreen(
|
|
HomeScreen(
|
|
|
|
|
+ showSourceSetMenuRequest = showSourceSetMenuRequest,
|
|
|
state = state,
|
|
state = state,
|
|
|
homepageState = homepageState,
|
|
homepageState = homepageState,
|
|
|
homepageFeedActions = feedActions,
|
|
homepageFeedActions = feedActions,
|
|
@@ -377,6 +383,7 @@ fun HomeRouteScreen(
|
|
|
)
|
|
)
|
|
|
@Composable
|
|
@Composable
|
|
|
fun HomeScreen(
|
|
fun HomeScreen(
|
|
|
|
|
+ showSourceSetMenuRequest: Long = 0L,
|
|
|
state: HomeUiState,
|
|
state: HomeUiState,
|
|
|
homepageState: HomepageUiState,
|
|
homepageState: HomepageUiState,
|
|
|
homepageFeedActions: HomepageFeedActions,
|
|
homepageFeedActions: HomepageFeedActions,
|
|
@@ -391,6 +398,7 @@ fun HomeScreen(
|
|
|
animatedVisibilityScope: AnimatedVisibilityScope? = null,
|
|
animatedVisibilityScope: AnimatedVisibilityScope? = null,
|
|
|
) {
|
|
) {
|
|
|
val scrollBehavior = GlassTopAppBarDefaults.defaultScrollBehavior()
|
|
val scrollBehavior = GlassTopAppBarDefaults.defaultScrollBehavior()
|
|
|
|
|
+ val scope = rememberCoroutineScope()
|
|
|
val context = LocalContext.current
|
|
val context = LocalContext.current
|
|
|
|
|
|
|
|
val selectedSets = remember(homepageState.manageState.sets) {
|
|
val selectedSets = remember(homepageState.manageState.sets) {
|
|
@@ -401,12 +409,19 @@ fun HomeScreen(
|
|
|
})
|
|
})
|
|
|
|
|
|
|
|
var showPageMenu by remember { mutableStateOf(false) }
|
|
var showPageMenu by remember { mutableStateOf(false) }
|
|
|
|
|
+ var showSourceSetSheet by remember { mutableStateOf(false) }
|
|
|
var errorMessage by remember { mutableStateOf<String?>(null) }
|
|
var errorMessage by remember { mutableStateOf<String?>(null) }
|
|
|
|
|
|
|
|
val currentPageSourceName by remember(selectedSets, pagerState) {
|
|
val currentPageSourceName by remember(selectedSets, pagerState) {
|
|
|
derivedStateOf { selectedSets.getOrNull(pagerState.currentPage)?.sourceName }
|
|
derivedStateOf { selectedSets.getOrNull(pagerState.currentPage)?.sourceName }
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ LaunchedEffect(showSourceSetMenuRequest) {
|
|
|
|
|
+ if (showSourceSetMenuRequest > 0L && selectedSets.isNotEmpty()) {
|
|
|
|
|
+ showSourceSetSheet = true
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
LaunchedEffect(pagerState) {
|
|
LaunchedEffect(pagerState) {
|
|
|
snapshotFlow { pagerState.currentPage }
|
|
snapshotFlow { pagerState.currentPage }
|
|
|
.distinctUntilChanged()
|
|
.distinctUntilChanged()
|
|
@@ -593,6 +608,36 @@ fun HomeScreen(
|
|
|
visibleSections = state.visibleSections,
|
|
visibleSections = state.visibleSections,
|
|
|
onIntent = onIntent,
|
|
onIntent = onIntent,
|
|
|
)
|
|
)
|
|
|
|
|
+ AppModalBottomSheet(
|
|
|
|
|
+ show = showSourceSetSheet,
|
|
|
|
|
+ onDismissRequest = { showSourceSetSheet = false },
|
|
|
|
|
+ title = stringResource(R.string.homepage_select_items),
|
|
|
|
|
+ ) {
|
|
|
|
|
+ LazyColumn(
|
|
|
|
|
+ modifier = Modifier
|
|
|
|
|
+ .fillMaxWidth()
|
|
|
|
|
+ .heightIn(max = 480.dp),
|
|
|
|
|
+ verticalArrangement = Arrangement.spacedBy(8.dp),
|
|
|
|
|
+ ) {
|
|
|
|
|
+ itemsIndexed(
|
|
|
|
|
+ items = selectedSets,
|
|
|
|
|
+ key = { _, source -> source.sourceUrl },
|
|
|
|
|
+ ) { index, source ->
|
|
|
|
|
+ SelectionItemCard(
|
|
|
|
|
+ title = source.sourceName,
|
|
|
|
|
+ isSelected = index == pagerState.currentPage,
|
|
|
|
|
+ inSelectionMode = true,
|
|
|
|
|
+ containerColor = LegadoTheme.colorScheme.onSheetContent,
|
|
|
|
|
+ onToggleSelection = {
|
|
|
|
|
+ showSourceSetSheet = false
|
|
|
|
|
+ scope.launch {
|
|
|
|
|
+ pagerState.animateScrollToPage(index)
|
|
|
|
|
+ }
|
|
|
|
|
+ },
|
|
|
|
|
+ )
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
AppAlertDialog(
|
|
AppAlertDialog(
|
|
|
data = errorMessage,
|
|
data = errorMessage,
|
|
|
onDismissRequest = { errorMessage = null },
|
|
onDismissRequest = { errorMessage = null },
|
|
@@ -1381,11 +1426,13 @@ private fun HomeSheets(
|
|
|
private fun AppModalBottomSheet(
|
|
private fun AppModalBottomSheet(
|
|
|
show: Boolean,
|
|
show: Boolean,
|
|
|
onDismissRequest: () -> Unit,
|
|
onDismissRequest: () -> Unit,
|
|
|
|
|
+ title: String? = null,
|
|
|
content: @Composable () -> Unit,
|
|
content: @Composable () -> Unit,
|
|
|
) {
|
|
) {
|
|
|
io.legado.app.ui.widget.components.modalBottomSheet.AppModalBottomSheet(
|
|
io.legado.app.ui.widget.components.modalBottomSheet.AppModalBottomSheet(
|
|
|
show = show,
|
|
show = show,
|
|
|
onDismissRequest = onDismissRequest,
|
|
onDismissRequest = onDismissRequest,
|
|
|
|
|
+ title = title,
|
|
|
) {
|
|
) {
|
|
|
content()
|
|
content()
|
|
|
}
|
|
}
|