18
18
19
19
package com.example.jetcaster.ui.home
20
20
21
+ import androidx.activity.compose.BackHandler
21
22
import androidx.compose.foundation.ExperimentalFoundationApi
22
23
import androidx.compose.foundation.Image
23
24
import androidx.compose.foundation.background
@@ -63,6 +64,10 @@ import androidx.compose.material3.TabRow
63
64
import androidx.compose.material3.TabRowDefaults.tabIndicatorOffset
64
65
import androidx.compose.material3.Text
65
66
import androidx.compose.material3.TopAppBar
67
+ import androidx.compose.material3.adaptive.ExperimentalMaterial3AdaptiveApi
68
+ import androidx.compose.material3.adaptive.layout.SupportingPaneScaffold
69
+ import androidx.compose.material3.adaptive.layout.SupportingPaneScaffoldRole
70
+ import androidx.compose.material3.adaptive.navigation.rememberSupportingPaneScaffoldNavigator
66
71
import androidx.compose.runtime.Composable
67
72
import androidx.compose.runtime.LaunchedEffect
68
73
import androidx.compose.runtime.getValue
@@ -92,6 +97,8 @@ import com.example.jetcaster.core.data.model.PodcastCategoryFilterResult
92
97
import com.example.jetcaster.core.data.model.PodcastInfo
93
98
import com.example.jetcaster.ui.home.discover.discoverItems
94
99
import com.example.jetcaster.ui.home.library.libraryItems
100
+ import com.example.jetcaster.ui.podcast.PodcastDetailsScreen
101
+ import com.example.jetcaster.ui.podcast.PodcastDetailsViewModel
95
102
import com.example.jetcaster.ui.theme.JetcasterTheme
96
103
import com.example.jetcaster.util.ToggleFollowPodcastIconButton
97
104
import com.example.jetcaster.util.quantityStringResource
@@ -103,30 +110,63 @@ import kotlinx.collections.immutable.PersistentList
103
110
import kotlinx.collections.immutable.toPersistentList
104
111
import kotlinx.coroutines.launch
105
112
113
+ @OptIn(ExperimentalMaterial3AdaptiveApi ::class )
106
114
@Composable
107
115
fun Home (
108
- navigateToPodcastDetails : (PodcastInfo ) -> Unit ,
109
116
navigateToPlayer : (EpisodeInfo ) -> Unit ,
110
117
viewModel : HomeViewModel = viewModel()
111
118
) {
112
119
val viewState by viewModel.state.collectAsStateWithLifecycle()
113
- Surface (Modifier .fillMaxSize()) {
114
- Home (
115
- featuredPodcasts = viewState.featuredPodcasts,
116
- isRefreshing = viewState.refreshing,
117
- homeCategories = viewState.homeCategories,
118
- selectedHomeCategory = viewState.selectedHomeCategory,
119
- filterableCategoriesModel = viewState.filterableCategoriesModel,
120
- podcastCategoryFilterResult = viewState.podcastCategoryFilterResult,
121
- library = viewState.library,
122
- onHomeCategorySelected = viewModel::onHomeCategorySelected,
123
- onCategorySelected = viewModel::onCategorySelected,
124
- onPodcastUnfollowed = viewModel::onPodcastUnfollowed,
125
- navigateToPodcastDetails = navigateToPodcastDetails,
126
- navigateToPlayer = navigateToPlayer,
127
- onTogglePodcastFollowed = viewModel::onTogglePodcastFollowed,
128
- onLibraryPodcastSelected = viewModel::onLibraryPodcastSelected,
129
- onQueueEpisode = viewModel::onQueueEpisode,
120
+ val navigator = rememberSupportingPaneScaffoldNavigator<String >(
121
+ isDestinationHistoryAware = false
122
+ )
123
+ BackHandler (enabled = navigator.canNavigateBack()) {
124
+ navigator.navigateBack()
125
+ }
126
+ Surface {
127
+ SupportingPaneScaffold (
128
+ value = navigator.scaffoldValue,
129
+ directive = navigator.scaffoldDirective,
130
+ supportingPane = {
131
+ val podcastUri = navigator.currentDestination?.content
132
+ ? : viewState.featuredPodcasts.firstOrNull()?.uri
133
+ if (! podcastUri.isNullOrEmpty()) {
134
+ val podcastDetailsViewModel = PodcastDetailsViewModel (
135
+ podcastUri = podcastUri
136
+ )
137
+ PodcastDetailsScreen (
138
+ viewModel = podcastDetailsViewModel,
139
+ navigateToPlayer = navigateToPlayer,
140
+ navigateBack = {
141
+ if (navigator.canNavigateBack()) {
142
+ navigator.navigateBack()
143
+ }
144
+ }
145
+ )
146
+ }
147
+ },
148
+ mainPane = {
149
+ Home (
150
+ featuredPodcasts = viewState.featuredPodcasts,
151
+ isRefreshing = viewState.refreshing,
152
+ homeCategories = viewState.homeCategories,
153
+ selectedHomeCategory = viewState.selectedHomeCategory,
154
+ filterableCategoriesModel = viewState.filterableCategoriesModel,
155
+ podcastCategoryFilterResult = viewState.podcastCategoryFilterResult,
156
+ library = viewState.library,
157
+ onHomeCategorySelected = viewModel::onHomeCategorySelected,
158
+ onCategorySelected = viewModel::onCategorySelected,
159
+ onPodcastUnfollowed = viewModel::onPodcastUnfollowed,
160
+ navigateToPodcastDetails = {
161
+ navigator.navigateTo(SupportingPaneScaffoldRole .Supporting , it.uri)
162
+ },
163
+ navigateToPlayer = navigateToPlayer,
164
+ onTogglePodcastFollowed = viewModel::onTogglePodcastFollowed,
165
+ onLibraryPodcastSelected = viewModel::onLibraryPodcastSelected,
166
+ onQueueEpisode = viewModel::onQueueEpisode,
167
+ modifier = Modifier .fillMaxSize()
168
+ )
169
+ },
130
170
modifier = Modifier .fillMaxSize()
131
171
)
132
172
}
0 commit comments