@@ -132,29 +132,6 @@ import kotlinx.collections.immutable.PersistentList
132132import kotlinx.collections.immutable.toPersistentList
133133import 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 )
159136private 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
427403private 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
818810private 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