Skip to content

Commit a434093

Browse files
committed
Remove HomeState
- it served only as a wrapper for parameters without any additional logic - it was unstable and creating new instance each composition, therefore no skipping
1 parent 5baf371 commit a434093

File tree

1 file changed

+65
-76
lines changed
  • Jetcaster/mobile/src/main/java/com/example/jetcaster/ui/home

1 file changed

+65
-76
lines changed

Jetcaster/mobile/src/main/java/com/example/jetcaster/ui/home/Home.kt

Lines changed: 65 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -132,29 +132,6 @@ import kotlinx.collections.immutable.PersistentList
132132
import kotlinx.collections.immutable.toPersistentList
133133
import kotlinx.coroutines.launch
134134

135-
data class HomeState(
136-
val windowSizeClass: WindowSizeClass,
137-
val isLoading: Boolean,
138-
val featuredPodcasts: PersistentList<PodcastInfo>,
139-
val selectedHomeCategory: HomeCategory,
140-
val homeCategories: List<HomeCategory>,
141-
val filterableCategoriesModel: FilterableCategoriesModel,
142-
val podcastCategoryFilterResult: PodcastCategoryFilterResult,
143-
val library: LibraryInfo,
144-
val modifier: Modifier = Modifier,
145-
val onPodcastUnfollowed: (PodcastInfo) -> Unit,
146-
val onHomeCategorySelected: (HomeCategory) -> Unit,
147-
val onCategorySelected: (CategoryInfo) -> Unit,
148-
val navigateToPodcastDetails: (PodcastInfo) -> Unit,
149-
val navigateToPlayer: (EpisodeInfo) -> Unit,
150-
val onTogglePodcastFollowed: (PodcastInfo) -> Unit,
151-
val onLibraryPodcastSelected: (PodcastInfo?) -> Unit,
152-
val onQueueEpisode: (PlayerEpisode) -> Unit,
153-
)
154-
155-
private val HomeState.showHomeCategoryTabs: Boolean
156-
get() = featuredPodcasts.isNotEmpty() && homeCategories.isNotEmpty()
157-
158135
@OptIn(ExperimentalMaterial3AdaptiveApi::class)
159136
private fun <T> ThreePaneScaffoldNavigator<T>.isMainPaneHidden(): Boolean {
160137
return scaffoldValue[SupportingPaneScaffoldRole.Main] == PaneAdaptedValue.Hidden
@@ -293,34 +270,36 @@ private fun HomeScreenReady(
293270
navigator.navigateBack()
294271
}
295272

296-
val homeState = HomeState(
297-
windowSizeClass = windowSizeClass,
298-
isLoading = uiState.isLoading,
299-
featuredPodcasts = uiState.featuredPodcasts,
300-
homeCategories = uiState.homeCategories,
301-
selectedHomeCategory = uiState.selectedHomeCategory,
302-
filterableCategoriesModel = uiState.filterableCategoriesModel,
303-
podcastCategoryFilterResult = uiState.podcastCategoryFilterResult,
304-
library = uiState.library,
305-
onHomeCategorySelected = viewModel::onHomeCategorySelected,
306-
onCategorySelected = viewModel::onCategorySelected,
307-
onPodcastUnfollowed = viewModel::onPodcastUnfollowed,
308-
navigateToPodcastDetails = {
309-
navigator.navigateTo(SupportingPaneScaffoldRole.Supporting, it.uri)
310-
},
311-
navigateToPlayer = navigateToPlayer,
312-
onTogglePodcastFollowed = viewModel::onTogglePodcastFollowed,
313-
onLibraryPodcastSelected = viewModel::onLibraryPodcastSelected,
314-
onQueueEpisode = viewModel::onQueueEpisode
315-
)
273+
// We're extracting the content composable here, because it might be used in different
274+
// parent composables based on the screen size.
275+
val homeScreenContent: @Composable () -> Unit = {
276+
HomeScreen(
277+
windowSizeClass = windowSizeClass,
278+
isLoading = uiState.isLoading,
279+
featuredPodcasts = uiState.featuredPodcasts,
280+
homeCategories = uiState.homeCategories,
281+
selectedHomeCategory = uiState.selectedHomeCategory,
282+
filterableCategoriesModel = uiState.filterableCategoriesModel,
283+
podcastCategoryFilterResult = uiState.podcastCategoryFilterResult,
284+
library = uiState.library,
285+
onHomeCategorySelected = viewModel::onHomeCategorySelected,
286+
onCategorySelected = viewModel::onCategorySelected,
287+
onPodcastUnfollowed = viewModel::onPodcastUnfollowed,
288+
navigateToPodcastDetails = {
289+
navigator.navigateTo(SupportingPaneScaffoldRole.Supporting, it.uri)
290+
},
291+
navigateToPlayer = navigateToPlayer,
292+
onTogglePodcastFollowed = viewModel::onTogglePodcastFollowed,
293+
onLibraryPodcastSelected = viewModel::onLibraryPodcastSelected,
294+
onQueueEpisode = viewModel::onQueueEpisode,
295+
modifier = Modifier.fillMaxSize()
296+
)
297+
}
316298

317299
Surface {
318300
val podcastUri = navigator.currentDestination?.content
319301
if (podcastUri.isNullOrEmpty()) {
320-
HomeScreen(
321-
homeState = homeState,
322-
modifier = Modifier.fillMaxSize()
323-
)
302+
homeScreenContent()
324303
} else {
325304
SupportingPaneScaffold(
326305
value = navigator.scaffoldValue,
@@ -344,10 +323,7 @@ private fun HomeScreenReady(
344323
)
345324
},
346325
mainPane = {
347-
HomeScreen(
348-
homeState = homeState,
349-
modifier = Modifier.fillMaxSize()
350-
)
326+
homeScreenContent()
351327
},
352328
modifier = Modifier.fillMaxSize()
353329
)
@@ -425,13 +401,28 @@ private fun HomeScreenBackground(
425401

426402
@Composable
427403
private fun HomeScreen(
428-
homeState: HomeState,
404+
windowSizeClass: WindowSizeClass,
405+
isLoading: Boolean,
406+
featuredPodcasts: PersistentList<PodcastInfo>,
407+
selectedHomeCategory: HomeCategory,
408+
homeCategories: List<HomeCategory>,
409+
filterableCategoriesModel: FilterableCategoriesModel,
410+
podcastCategoryFilterResult: PodcastCategoryFilterResult,
411+
library: LibraryInfo,
412+
onPodcastUnfollowed: (PodcastInfo) -> Unit,
413+
onHomeCategorySelected: (HomeCategory) -> Unit,
414+
onCategorySelected: (CategoryInfo) -> Unit,
415+
navigateToPodcastDetails: (PodcastInfo) -> Unit,
416+
navigateToPlayer: (EpisodeInfo) -> Unit,
417+
onTogglePodcastFollowed: (PodcastInfo) -> Unit,
418+
onLibraryPodcastSelected: (PodcastInfo?) -> Unit,
419+
onQueueEpisode: (PlayerEpisode) -> Unit,
429420
modifier: Modifier = Modifier
430421
) {
431422
// Effect that changes the home category selection when there are no subscribed podcasts
432-
LaunchedEffect(key1 = homeState.featuredPodcasts) {
433-
if (homeState.featuredPodcasts.isEmpty()) {
434-
homeState.onHomeCategorySelected(HomeCategory.Discover)
423+
LaunchedEffect(key1 = featuredPodcasts) {
424+
if (featuredPodcasts.isEmpty()) {
425+
onHomeCategorySelected(HomeCategory.Discover)
435426
}
436427
}
437428

@@ -444,10 +435,10 @@ private fun HomeScreen(
444435
topBar = {
445436
Column {
446437
HomeAppBar(
447-
isExpanded = homeState.windowSizeClass.isCompact,
438+
isExpanded = windowSizeClass.isCompact,
448439
modifier = Modifier.fillMaxWidth(),
449440
)
450-
if (homeState.isLoading) {
441+
if (isLoading) {
451442
LinearProgressIndicator(
452443
Modifier
453444
.fillMaxWidth()
@@ -463,27 +454,28 @@ private fun HomeScreen(
463454
) { contentPadding ->
464455
// Main Content
465456
val snackBarText = stringResource(id = R.string.episode_added_to_your_queue)
457+
val showHomeCategoryTabs = featuredPodcasts.isNotEmpty() && homeCategories.isNotEmpty()
466458
HomeContent(
467-
showHomeCategoryTabs = homeState.showHomeCategoryTabs,
468-
featuredPodcasts = homeState.featuredPodcasts,
469-
selectedHomeCategory = homeState.selectedHomeCategory,
470-
homeCategories = homeState.homeCategories,
471-
filterableCategoriesModel = homeState.filterableCategoriesModel,
472-
podcastCategoryFilterResult = homeState.podcastCategoryFilterResult,
473-
library = homeState.library,
459+
showHomeCategoryTabs = showHomeCategoryTabs,
460+
featuredPodcasts = featuredPodcasts,
461+
selectedHomeCategory = selectedHomeCategory,
462+
homeCategories = homeCategories,
463+
filterableCategoriesModel = filterableCategoriesModel,
464+
podcastCategoryFilterResult = podcastCategoryFilterResult,
465+
library = library,
474466
modifier = Modifier.padding(contentPadding),
475-
onPodcastUnfollowed = homeState.onPodcastUnfollowed,
476-
onHomeCategorySelected = homeState.onHomeCategorySelected,
477-
onCategorySelected = homeState.onCategorySelected,
478-
navigateToPodcastDetails = homeState.navigateToPodcastDetails,
479-
navigateToPlayer = homeState.navigateToPlayer,
480-
onTogglePodcastFollowed = homeState.onTogglePodcastFollowed,
481-
onLibraryPodcastSelected = homeState.onLibraryPodcastSelected,
467+
onPodcastUnfollowed = onPodcastUnfollowed,
468+
onHomeCategorySelected = onHomeCategorySelected,
469+
onCategorySelected = onCategorySelected,
470+
navigateToPodcastDetails = navigateToPodcastDetails,
471+
navigateToPlayer = navigateToPlayer,
472+
onTogglePodcastFollowed = onTogglePodcastFollowed,
473+
onLibraryPodcastSelected = onLibraryPodcastSelected,
482474
onQueueEpisode = {
483475
coroutineScope.launch {
484476
snackbarHostState.showSnackbar(snackBarText)
485477
}
486-
homeState.onQueueEpisode(it)
478+
onQueueEpisode(it)
487479
}
488480
)
489481
}
@@ -817,7 +809,7 @@ private val CompactWindowSizeClass = WindowSizeClass.compute(360f, 780f)
817809
@Composable
818810
private fun PreviewHome() {
819811
JetcasterTheme {
820-
val homeState = HomeState(
812+
HomeScreen(
821813
windowSizeClass = CompactWindowSizeClass,
822814
isLoading = true,
823815
featuredPodcasts = PreviewPodcasts.toPersistentList(),
@@ -841,9 +833,6 @@ private fun PreviewHome() {
841833
onLibraryPodcastSelected = {},
842834
onQueueEpisode = {}
843835
)
844-
HomeScreen(
845-
homeState = homeState,
846-
)
847836
}
848837
}
849838

0 commit comments

Comments
 (0)