@@ -118,6 +118,26 @@ import kotlinx.collections.immutable.PersistentList
118118import kotlinx.collections.immutable.toPersistentList
119119import kotlinx.coroutines.launch
120120
121+ data class HomeState (
122+ val windowSizeClass : WindowSizeClass ,
123+ val featuredPodcasts : PersistentList <PodcastInfo >,
124+ val isRefreshing : Boolean ,
125+ val selectedHomeCategory : HomeCategory ,
126+ val homeCategories : List <HomeCategory >,
127+ val filterableCategoriesModel : FilterableCategoriesModel ,
128+ val podcastCategoryFilterResult : PodcastCategoryFilterResult ,
129+ val library : LibraryInfo ,
130+ val modifier : Modifier = Modifier ,
131+ val onPodcastUnfollowed : (PodcastInfo ) -> Unit ,
132+ val onHomeCategorySelected : (HomeCategory ) -> Unit ,
133+ val onCategorySelected : (CategoryInfo ) -> Unit ,
134+ val navigateToPodcastDetails : (PodcastInfo ) -> Unit ,
135+ val navigateToPlayer : (EpisodeInfo ) -> Unit ,
136+ val onTogglePodcastFollowed : (PodcastInfo ) -> Unit ,
137+ val onLibraryPodcastSelected : (PodcastInfo ? ) -> Unit ,
138+ val onQueueEpisode : (PlayerEpisode ) -> Unit ,
139+ )
140+
121141@OptIn(ExperimentalMaterial3AdaptiveApi ::class )
122142@Composable
123143fun MainScreen (
@@ -130,14 +150,42 @@ fun MainScreen(
130150 BackHandler (enabled = navigator.canNavigateBack()) {
131151 navigator.navigateBack()
132152 }
153+
154+ val homeState = HomeState (
155+ windowSizeClass = windowSizeClass,
156+ featuredPodcasts = viewState.featuredPodcasts,
157+ isRefreshing = viewState.refreshing,
158+ homeCategories = viewState.homeCategories,
159+ selectedHomeCategory = viewState.selectedHomeCategory,
160+ filterableCategoriesModel = viewState.filterableCategoriesModel,
161+ podcastCategoryFilterResult = viewState.podcastCategoryFilterResult,
162+ library = viewState.library,
163+ onHomeCategorySelected = viewModel::onHomeCategorySelected,
164+ onCategorySelected = viewModel::onCategorySelected,
165+ onPodcastUnfollowed = viewModel::onPodcastUnfollowed,
166+ navigateToPodcastDetails = {
167+ navigator.navigateTo(SupportingPaneScaffoldRole .Supporting , it.uri)
168+ },
169+ navigateToPlayer = navigateToPlayer,
170+ onTogglePodcastFollowed = viewModel::onTogglePodcastFollowed,
171+ onLibraryPodcastSelected = viewModel::onLibraryPodcastSelected,
172+ onQueueEpisode = viewModel::onQueueEpisode
173+ )
174+
133175 Surface {
134- SupportingPaneScaffold (
135- value = navigator.scaffoldValue,
136- directive = navigator.scaffoldDirective,
137- supportingPane = {
138- val podcastUri = navigator.currentDestination?.content
139- ? : viewState.featuredPodcasts.firstOrNull()?.uri
140- if (! podcastUri.isNullOrEmpty()) {
176+ val podcastUri = navigator.currentDestination?.content
177+ ? : viewState.featuredPodcasts.firstOrNull()?.uri
178+
179+ if (podcastUri.isNullOrEmpty()) {
180+ HomeScreen (
181+ homeState = homeState,
182+ modifier = Modifier .fillMaxSize()
183+ )
184+ } else {
185+ SupportingPaneScaffold (
186+ value = navigator.scaffoldValue,
187+ directive = navigator.scaffoldDirective,
188+ supportingPane = {
141189 val podcastDetailsViewModel: PodcastDetailsViewModel = viewModel(
142190 key = podcastUri,
143191 factory = PodcastDetailsViewModel .provideFactory(
@@ -156,33 +204,16 @@ fun MainScreen(
156204 }
157205 }
158206 )
159- }
160- },
161- mainPane = {
162- HomeScreen (
163- windowSizeClass = windowSizeClass,
164- featuredPodcasts = viewState.featuredPodcasts,
165- isRefreshing = viewState.refreshing,
166- homeCategories = viewState.homeCategories,
167- selectedHomeCategory = viewState.selectedHomeCategory,
168- filterableCategoriesModel = viewState.filterableCategoriesModel,
169- podcastCategoryFilterResult = viewState.podcastCategoryFilterResult,
170- library = viewState.library,
171- onHomeCategorySelected = viewModel::onHomeCategorySelected,
172- onCategorySelected = viewModel::onCategorySelected,
173- onPodcastUnfollowed = viewModel::onPodcastUnfollowed,
174- navigateToPodcastDetails = {
175- navigator.navigateTo(SupportingPaneScaffoldRole .Supporting , it.uri)
176- },
177- navigateToPlayer = navigateToPlayer,
178- onTogglePodcastFollowed = viewModel::onTogglePodcastFollowed,
179- onLibraryPodcastSelected = viewModel::onLibraryPodcastSelected,
180- onQueueEpisode = viewModel::onQueueEpisode,
181- modifier = Modifier .fillMaxSize()
182- )
183- },
184- modifier = Modifier .fillMaxSize()
185- )
207+ },
208+ mainPane = {
209+ HomeScreen (
210+ homeState = homeState,
211+ modifier = Modifier .fillMaxSize()
212+ )
213+ },
214+ modifier = Modifier .fillMaxSize()
215+ )
216+ }
186217 }
187218}
188219
@@ -242,28 +273,13 @@ private fun HomeAppBar(
242273
243274@Composable
244275private fun HomeScreen (
245- windowSizeClass : WindowSizeClass ,
246- featuredPodcasts : PersistentList <PodcastInfo >,
247- isRefreshing : Boolean ,
248- selectedHomeCategory : HomeCategory ,
249- homeCategories : List <HomeCategory >,
250- filterableCategoriesModel : FilterableCategoriesModel ,
251- podcastCategoryFilterResult : PodcastCategoryFilterResult ,
252- library : LibraryInfo ,
253- modifier : Modifier = Modifier ,
254- onPodcastUnfollowed : (PodcastInfo ) -> Unit ,
255- onHomeCategorySelected : (HomeCategory ) -> Unit ,
256- onCategorySelected : (CategoryInfo ) -> Unit ,
257- navigateToPodcastDetails : (PodcastInfo ) -> Unit ,
258- navigateToPlayer : (EpisodeInfo ) -> Unit ,
259- onTogglePodcastFollowed : (PodcastInfo ) -> Unit ,
260- onLibraryPodcastSelected : (PodcastInfo ? ) -> Unit ,
261- onQueueEpisode : (PlayerEpisode ) -> Unit ,
276+ homeState : HomeState ,
277+ modifier : Modifier = Modifier
262278) {
263279 // Effect that changes the home category selection when there are no subscribed podcasts
264- LaunchedEffect (key1 = featuredPodcasts) {
265- if (featuredPodcasts.isEmpty()) {
266- onHomeCategorySelected(HomeCategory .Discover )
280+ LaunchedEffect (key1 = homeState. featuredPodcasts) {
281+ if (homeState. featuredPodcasts.isEmpty()) {
282+ homeState. onHomeCategorySelected(HomeCategory .Discover )
267283 }
268284 }
269285
@@ -275,10 +291,10 @@ private fun HomeScreen(
275291 ),
276292 topBar = {
277293 HomeAppBar (
278- selectedHomeCategory = selectedHomeCategory,
279- homeCategories = homeCategories,
280- onHomeCategorySelected = onHomeCategorySelected,
281- showHomeCategoryToggle = ! windowSizeClass.isCompact,
294+ selectedHomeCategory = homeState. selectedHomeCategory,
295+ homeCategories = homeState. homeCategories,
296+ onHomeCategorySelected = homeState. onHomeCategorySelected,
297+ showHomeCategoryToggle = ! homeState. windowSizeClass.isCompact,
282298 modifier = Modifier .fillMaxWidth(),
283299 )
284300 },
@@ -289,27 +305,27 @@ private fun HomeScreen(
289305 // Main Content
290306 val snackBarText = stringResource(id = R .string.episode_added_to_your_queue)
291307 HomeContent (
292- showGrid = ! windowSizeClass.isCompact,
293- featuredPodcasts = featuredPodcasts,
294- isRefreshing = isRefreshing,
295- selectedHomeCategory = selectedHomeCategory,
296- homeCategories = homeCategories,
297- filterableCategoriesModel = filterableCategoriesModel,
298- podcastCategoryFilterResult = podcastCategoryFilterResult,
299- library = library,
308+ showGrid = ! homeState. windowSizeClass.isCompact,
309+ featuredPodcasts = homeState. featuredPodcasts,
310+ isRefreshing = homeState. isRefreshing,
311+ selectedHomeCategory = homeState. selectedHomeCategory,
312+ homeCategories = homeState. homeCategories,
313+ filterableCategoriesModel = homeState. filterableCategoriesModel,
314+ podcastCategoryFilterResult = homeState. podcastCategoryFilterResult,
315+ library = homeState. library,
300316 modifier = Modifier .padding(contentPadding),
301- onPodcastUnfollowed = onPodcastUnfollowed,
302- onHomeCategorySelected = onHomeCategorySelected,
303- onCategorySelected = onCategorySelected,
304- navigateToPodcastDetails = navigateToPodcastDetails,
305- navigateToPlayer = navigateToPlayer,
306- onTogglePodcastFollowed = onTogglePodcastFollowed,
307- onLibraryPodcastSelected = onLibraryPodcastSelected,
317+ onPodcastUnfollowed = homeState. onPodcastUnfollowed,
318+ onHomeCategorySelected = homeState. onHomeCategorySelected,
319+ onCategorySelected = homeState. onCategorySelected,
320+ navigateToPodcastDetails = homeState. navigateToPodcastDetails,
321+ navigateToPlayer = homeState. navigateToPlayer,
322+ onTogglePodcastFollowed = homeState. onTogglePodcastFollowed,
323+ onLibraryPodcastSelected = homeState. onLibraryPodcastSelected,
308324 onQueueEpisode = {
309325 coroutineScope.launch {
310326 snackbarHostState.showSnackbar(snackBarText)
311327 }
312- onQueueEpisode(it)
328+ homeState. onQueueEpisode(it)
313329 }
314330 )
315331 }
@@ -730,7 +746,7 @@ private val CompactWindowSizeClass = WindowSizeClass.calculateFromSize(
730746@Composable
731747private fun PreviewHomeContent () {
732748 JetcasterTheme {
733- HomeScreen (
749+ val homeState = HomeState (
734750 windowSizeClass = CompactWindowSizeClass ,
735751 featuredPodcasts = PreviewPodcasts .toPersistentList(),
736752 isRefreshing = false ,
@@ -754,6 +770,7 @@ private fun PreviewHomeContent() {
754770 onLibraryPodcastSelected = {},
755771 onQueueEpisode = {}
756772 )
773+ HomeScreen (homeState = homeState)
757774 }
758775}
759776
@@ -763,7 +780,7 @@ private fun PreviewHomeContent() {
763780@Composable
764781private fun PreviewHomeContentExpanded () {
765782 JetcasterTheme {
766- HomeScreen (
783+ val homeState = HomeState (
767784 windowSizeClass = CompactWindowSizeClass ,
768785 featuredPodcasts = PreviewPodcasts .toPersistentList(),
769786 isRefreshing = false ,
@@ -787,6 +804,7 @@ private fun PreviewHomeContentExpanded() {
787804 onLibraryPodcastSelected = {},
788805 onQueueEpisode = {}
789806 )
807+ HomeScreen (homeState = homeState)
790808 }
791809}
792810
0 commit comments