@@ -118,6 +118,26 @@ import kotlinx.collections.immutable.PersistentList
118
118
import kotlinx.collections.immutable.toPersistentList
119
119
import kotlinx.coroutines.launch
120
120
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
+
121
141
@OptIn(ExperimentalMaterial3AdaptiveApi ::class )
122
142
@Composable
123
143
fun MainScreen (
@@ -130,14 +150,42 @@ fun MainScreen(
130
150
BackHandler (enabled = navigator.canNavigateBack()) {
131
151
navigator.navigateBack()
132
152
}
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
+
133
175
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 = {
141
189
val podcastDetailsViewModel: PodcastDetailsViewModel = viewModel(
142
190
key = podcastUri,
143
191
factory = PodcastDetailsViewModel .provideFactory(
@@ -156,33 +204,16 @@ fun MainScreen(
156
204
}
157
205
}
158
206
)
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
+ }
186
217
}
187
218
}
188
219
@@ -242,28 +273,13 @@ private fun HomeAppBar(
242
273
243
274
@Composable
244
275
private 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
262
278
) {
263
279
// 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 )
267
283
}
268
284
}
269
285
@@ -275,10 +291,10 @@ private fun HomeScreen(
275
291
),
276
292
topBar = {
277
293
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,
282
298
modifier = Modifier .fillMaxWidth(),
283
299
)
284
300
},
@@ -289,27 +305,27 @@ private fun HomeScreen(
289
305
// Main Content
290
306
val snackBarText = stringResource(id = R .string.episode_added_to_your_queue)
291
307
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,
300
316
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,
308
324
onQueueEpisode = {
309
325
coroutineScope.launch {
310
326
snackbarHostState.showSnackbar(snackBarText)
311
327
}
312
- onQueueEpisode(it)
328
+ homeState. onQueueEpisode(it)
313
329
}
314
330
)
315
331
}
@@ -730,7 +746,7 @@ private val CompactWindowSizeClass = WindowSizeClass.calculateFromSize(
730
746
@Composable
731
747
private fun PreviewHomeContent () {
732
748
JetcasterTheme {
733
- HomeScreen (
749
+ val homeState = HomeState (
734
750
windowSizeClass = CompactWindowSizeClass ,
735
751
featuredPodcasts = PreviewPodcasts .toPersistentList(),
736
752
isRefreshing = false ,
@@ -754,6 +770,7 @@ private fun PreviewHomeContent() {
754
770
onLibraryPodcastSelected = {},
755
771
onQueueEpisode = {}
756
772
)
773
+ HomeScreen (homeState = homeState)
757
774
}
758
775
}
759
776
@@ -763,7 +780,7 @@ private fun PreviewHomeContent() {
763
780
@Composable
764
781
private fun PreviewHomeContentExpanded () {
765
782
JetcasterTheme {
766
- HomeScreen (
783
+ val homeState = HomeState (
767
784
windowSizeClass = CompactWindowSizeClass ,
768
785
featuredPodcasts = PreviewPodcasts .toPersistentList(),
769
786
isRefreshing = false ,
@@ -787,6 +804,7 @@ private fun PreviewHomeContentExpanded() {
787
804
onLibraryPodcastSelected = {},
788
805
onQueueEpisode = {}
789
806
)
807
+ HomeScreen (homeState = homeState)
790
808
}
791
809
}
792
810
0 commit comments