Skip to content

Commit c323b6c

Browse files
committed
[Jetcaster] Handling no podcast selected and extracting state for home
1 parent 92f9a03 commit c323b6c

File tree

1 file changed

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

1 file changed

+94
-76
lines changed

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

Lines changed: 94 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -118,6 +118,26 @@ import kotlinx.collections.immutable.PersistentList
118118
import kotlinx.collections.immutable.toPersistentList
119119
import 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
123143
fun 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
244275
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
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
731747
private 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
764781
private 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

Comments
 (0)