Skip to content

Commit

Permalink
possible search even when home fails
Browse files Browse the repository at this point in the history
  • Loading branch information
DatL4g committed Mar 17, 2024
1 parent 712f65a commit 686f7d8
Show file tree
Hide file tree
Showing 3 changed files with 93 additions and 48 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -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.*
Expand Down Expand Up @@ -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 -> {
Expand All @@ -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)
Expand Down Expand Up @@ -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(
Expand All @@ -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)
Expand All @@ -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)
}
}

Original file line number Diff line number Diff line change
@@ -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()
}
)
}
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand All @@ -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<Genre.Item>, component: HomeComponent) {
fun SearchOverview(
items: List<Genre.Item>,
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(
Expand Down

0 comments on commit 686f7d8

Please sign in to comment.