diff --git a/app/shared/src/commonMain/kotlin/dev/datlag/burningseries/shared/ui/screen/initial/home/HomeScreen.kt b/app/shared/src/commonMain/kotlin/dev/datlag/burningseries/shared/ui/screen/initial/home/HomeScreen.kt index f8be4374..0ed33876 100644 --- a/app/shared/src/commonMain/kotlin/dev/datlag/burningseries/shared/ui/screen/initial/home/HomeScreen.kt +++ b/app/shared/src/commonMain/kotlin/dev/datlag/burningseries/shared/ui/screen/initial/home/HomeScreen.kt @@ -11,6 +11,7 @@ import androidx.compose.material.icons.filled.SearchOff import androidx.compose.material.icons.filled.YoutubeSearchedFor import androidx.compose.material3.* import androidx.compose.material3.windowsizeclass.ExperimentalMaterial3WindowSizeClassApi +import androidx.compose.material3.windowsizeclass.WindowHeightSizeClass import androidx.compose.material3.windowsizeclass.WindowWidthSizeClass import androidx.compose.material3.windowsizeclass.calculateWindowSizeClass import androidx.compose.runtime.* @@ -50,24 +51,43 @@ fun HomeScreen(component: HomeComponent) { when (val currentState = homeState) { is HomeState.Loading -> { - LoadingState(SharedRes.strings.loading_home) + Box { + val searchItems by component.searchItems.collectAsStateWithLifecycle() + + if (searchItems.isEmpty()) { + LoadingState(SharedRes.strings.loading_home) + } else { + SearchOverview(searchItems, component, Modifier.fillMaxSize(), 16.dp) + } + + SearchFAB(component) + } } is HomeState.Error -> { - val reachable by component.onDeviceReachable.collectAsStateWithLifecycle() - - ErrorState( - text = SharedRes.strings.error_loading_home, - customText = { - if (!reachable) { - Text( - modifier = Modifier.fillMaxWidth(0.85F), - text = stringResource(SharedRes.strings.enable_custom_dns), - textAlign = TextAlign.Center - ) + Box { + val reachable by component.onDeviceReachable.collectAsStateWithLifecycle() + val searchItems by component.searchItems.collectAsStateWithLifecycle() + + if (searchItems.isEmpty()) { + ErrorState( + text = SharedRes.strings.error_loading_home, + customText = { + if (!reachable) { + Text( + modifier = Modifier.fillMaxWidth(0.85F), + text = stringResource(SharedRes.strings.enable_custom_dns), + textAlign = TextAlign.Center + ) + } + } + ) { + component.retryLoadingHome() } + } else { + SearchOverview(searchItems, component, Modifier.fillMaxSize(), 16.dp) } - ) { - component.retryLoadingHome() + + SearchFAB(component) } } is HomeState.Success -> { @@ -76,7 +96,10 @@ fun HomeScreen(component: HomeComponent) { if (rememberIsTv()) { DefaultView(currentState.home, component) } else { - ExpandedView(currentState.home, component) + when (calculateWindowSizeClass().heightSizeClass) { + WindowHeightSizeClass.Compact -> DefaultView(currentState.home, component) + else -> ExpandedView(currentState.home, component) + } } } else -> DefaultView(currentState.home, component) @@ -106,17 +129,7 @@ private fun ExpandedView(home: Home, component: HomeComponent) { }, horizontalArrangement = Arrangement.spacedBy(16.dp) ) { - val colOne = if (rowWidth > 600) { - val third = remember(rowWidth) { rowWidth.toFloat() / 3F } - if (third >= 200F) { - Modifier.widthIn(max = third.dp) - } else { - Modifier.weight(1F) - } - } else { - Modifier.weight(1F) - } - MainView(home, component, colOne) + MainView(home, component, Modifier.weight(1F)) childState.child?.also { (_, instance) -> Box( @@ -131,8 +144,6 @@ private fun ExpandedView(home: Home, component: HomeComponent) { @Composable private fun MainView(home: Home, component: HomeComponent, modifier: Modifier = Modifier) { Box(modifier = modifier) { - val searchState by component.searchState.collectAsStateWithLifecycle() - Row( modifier = Modifier.fillMaxSize().padding(horizontal = 16.dp), horizontalArrangement = Arrangement.spacedBy(2.dp) @@ -142,25 +153,11 @@ private fun MainView(home: Home, component: HomeComponent, modifier: Modifier = if (searchItems.isEmpty()) { HomeOverview(home, component) } else { - SearchOverview(searchItems, component) + SearchOverview(searchItems, component, Modifier.weight(1F)) } } - FloatingSearchButton( - modifier = Modifier.align(Alignment.BottomEnd).mergedLocalPadding(WindowInsets.ime.asPaddingValues(), 16.dp), - onTextChange = { - component.searchQuery(it) - }, - enabled = searchState !is SearchState.Loading, - icon = when (searchState) { - is SearchState.Loading -> Icons.Default.YoutubeSearchedFor - is SearchState.Success -> Icons.Default.Search - is SearchState.Error -> Icons.Default.SearchOff - }, - overrideOnClick = searchState !is SearchState.Success, - onClick = { - component.retryLoadingSearch() - } - ) + + SearchFAB(component) } } diff --git a/app/shared/src/commonMain/kotlin/dev/datlag/burningseries/shared/ui/screen/initial/home/component/SearchFAB.kt b/app/shared/src/commonMain/kotlin/dev/datlag/burningseries/shared/ui/screen/initial/home/component/SearchFAB.kt new file mode 100644 index 00000000..ed4780df --- /dev/null +++ b/app/shared/src/commonMain/kotlin/dev/datlag/burningseries/shared/ui/screen/initial/home/component/SearchFAB.kt @@ -0,0 +1,42 @@ +package dev.datlag.burningseries.shared.ui.screen.initial.home.component + +import androidx.compose.foundation.layout.BoxScope +import androidx.compose.foundation.layout.WindowInsets +import androidx.compose.foundation.layout.asPaddingValues +import androidx.compose.foundation.layout.ime +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.filled.Search +import androidx.compose.material.icons.filled.SearchOff +import androidx.compose.material.icons.filled.YoutubeSearchedFor +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.unit.dp +import dev.datlag.burningseries.model.state.SearchState +import dev.datlag.burningseries.shared.common.lifecycle.collectAsStateWithLifecycle +import dev.datlag.burningseries.shared.common.mergedLocalPadding +import dev.datlag.burningseries.shared.ui.custom.FloatingSearchButton +import dev.datlag.burningseries.shared.ui.screen.initial.home.HomeComponent + +@Composable +fun BoxScope.SearchFAB(component: HomeComponent) { + val searchState by component.searchState.collectAsStateWithLifecycle() + + FloatingSearchButton( + modifier = Modifier.align(Alignment.BottomEnd).mergedLocalPadding(WindowInsets.ime.asPaddingValues(), 16.dp), + onTextChange = { + component.searchQuery(it) + }, + enabled = searchState !is SearchState.Loading, + icon = when (searchState) { + is SearchState.Loading -> Icons.Default.YoutubeSearchedFor + is SearchState.Success -> Icons.Default.Search + is SearchState.Error -> Icons.Default.SearchOff + }, + overrideOnClick = searchState !is SearchState.Success, + onClick = { + component.retryLoadingSearch() + } + ) +} \ No newline at end of file diff --git a/app/shared/src/commonMain/kotlin/dev/datlag/burningseries/shared/ui/screen/initial/home/component/SearchOverview.kt b/app/shared/src/commonMain/kotlin/dev/datlag/burningseries/shared/ui/screen/initial/home/component/SearchOverview.kt index fcba3ccf..8980ff0b 100644 --- a/app/shared/src/commonMain/kotlin/dev/datlag/burningseries/shared/ui/screen/initial/home/component/SearchOverview.kt +++ b/app/shared/src/commonMain/kotlin/dev/datlag/burningseries/shared/ui/screen/initial/home/component/SearchOverview.kt @@ -14,6 +14,7 @@ import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.style.TextOverflow +import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import dev.chrisbanes.haze.haze import dev.datlag.burningseries.model.Genre @@ -27,14 +28,19 @@ import dev.datlag.burningseries.shared.ui.screen.initial.home.HomeConfig import dev.icerock.moko.resources.compose.stringResource @Composable -fun RowScope.SearchOverview(items: List, component: HomeComponent) { +fun SearchOverview( + items: List, + component: HomeComponent, + modifier: Modifier = Modifier, + contentPadding: Dp = 0.dp +) { val listState = rememberLazyListState() LazyColumn( state = listState, - modifier = Modifier.weight(1F).haze(state = LocalHaze.current), + modifier = modifier.haze(state = LocalHaze.current), verticalArrangement = Arrangement.spacedBy(16.dp), - contentPadding = LocalPadding(), + contentPadding = LocalPadding(contentPadding), ) { item { Text(