Skip to content

Commit 1f0c969

Browse files
authored
Merge pull request #73 from CodandoTV/feature/72-dados-de-paginao-esto-sendo-perdidos-
[ISSUE-72] - Mantendo paginas já carregadas após recomposição
2 parents 8b773f4 + 2c95dbe commit 1f0c969

File tree

4 files changed

+39
-48
lines changed

4 files changed

+39
-48
lines changed

feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/list/presentation/screens/ListStreamViewModel.kt

Lines changed: 23 additions & 34 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,9 @@
11
package com.codandotv.streamplayerapp.feature_list_streams.list.presentation.screens
22

33
import androidx.lifecycle.DefaultLifecycleObserver
4-
import androidx.lifecycle.LifecycleOwner
54
import androidx.lifecycle.ViewModel
65
import androidx.lifecycle.viewModelScope
7-
import androidx.paging.PagingData
6+
import androidx.paging.cachedIn
87
import androidx.paging.map
98
import com.codandotv.streamplayerapp.core_networking.handleError.catchFailure
109
import com.codandotv.streamplayerapp.feature.list.streams.R
@@ -17,7 +16,7 @@ import com.codandotv.streamplayerapp.feature_list_streams.list.domain.model.High
1716
import com.codandotv.streamplayerapp.feature_list_streams.list.domain.model.IconAndTextInfo
1817
import com.codandotv.streamplayerapp.feature_list_streams.list.domain.model.Stream
1918
import com.codandotv.streamplayerapp.feature_list_streams.list.presentation.widgets.StreamsCardContent
20-
import kotlinx.coroutines.flow.Flow
19+
import com.codandotv.streamplayerapp.feature_list_streams.list.presentation.widgets.StreamsCarouselContent
2120
import kotlinx.coroutines.flow.MutableStateFlow
2221
import kotlinx.coroutines.flow.SharingStarted
2322
import kotlinx.coroutines.flow.combine
@@ -37,7 +36,7 @@ class ListStreamViewModel(
3736

3837
private val _uiState = MutableStateFlow(
3938
ListStreamsUIState(
40-
genres = emptyList(),
39+
streamsCarouselContent = emptyList(),
4140
isLoading = false
4241
)
4342
)
@@ -47,9 +46,7 @@ class ListStreamViewModel(
4746
initialValue = _uiState.value
4847
)
4948

50-
override fun onCreate(owner: LifecycleOwner) {
51-
super.onCreate(owner)
52-
49+
init {
5350
viewModelScope.launch {
5451
latestStream()
5552
.combine(
@@ -64,29 +61,18 @@ class ListStreamViewModel(
6461
.catchFailure {
6562
println(">>>> ${it.errorMessage}")
6663
}
67-
.collect {
68-
val (latest, genres) = it
64+
.collect { pair ->
65+
val (latest, genres) = pair
66+
6967
_uiState.update {
7068
it.copy(
71-
genres = genres,
69+
streamsCarouselContent = genres.map { genreTarget ->
70+
getStreamsByGenre(genreTarget)
71+
},
7272
highlightBanner = getHighlightBanner(latest)
7373
)
7474
}
7575
}
76-
77-
if (uiState.value.genres.isEmpty()) {
78-
listGenres()
79-
.onStart { onLoading() }
80-
.catchFailure {
81-
println(">>>> ${it.errorMessage}")
82-
}
83-
.onCompletion { loaded() }
84-
.collect { genres ->
85-
_uiState.update {
86-
it.copy(genres = genres)
87-
}
88-
}
89-
}
9076
}
9177
}
9278

@@ -114,16 +100,19 @@ class ListStreamViewModel(
114100
),
115101
)
116102

117-
fun loadMovies(genre: Genre): Flow<PagingData<StreamsCardContent>> {
118-
return listStreams(genre).map {
119-
it.map { stream ->
120-
StreamsCardContent(
121-
contentDescription = stream.name,
122-
url = stream.posterPathUrl,
123-
id = stream.id
124-
)
125-
}
126-
}
103+
private fun getStreamsByGenre(genre: Genre): StreamsCarouselContent {
104+
return StreamsCarouselContent(
105+
genre.name,
106+
listStreams(genre).map {
107+
it.map { stream ->
108+
StreamsCardContent(
109+
contentDescription = stream.name,
110+
url = stream.posterPathUrl,
111+
id = stream.id
112+
)
113+
}
114+
}.cachedIn(viewModelScope)
115+
)
127116
}
128117

129118
private fun loaded() {

feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/list/presentation/screens/ListStreamsScreen.kt

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -83,10 +83,9 @@ fun ListStreamsScreen(
8383

8484
HighlightBanner(data = uiState.highlightBanner)
8585

86-
uiState.genres.forEach { genre ->
86+
uiState.streamsCarouselContent.forEach { streamCarouselContent ->
8787
StreamsCarousel(
88-
title = genre.name,
89-
contentList = viewModel.loadMovies(genre),
88+
content = streamCarouselContent,
9089
onNavigateDetailList = onNavigateDetailList,
9190
)
9291
Spacer(modifier = Modifier.height(12.dp))
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
package com.codandotv.streamplayerapp.feature_list_streams.list.presentation.screens
22

3-
import com.codandotv.streamplayerapp.feature_list_streams.list.domain.model.Genre
43
import com.codandotv.streamplayerapp.feature_list_streams.list.domain.model.HighlightBanner
4+
import com.codandotv.streamplayerapp.feature_list_streams.list.presentation.widgets.StreamsCarouselContent
55

66
data class ListStreamsUIState(
77
val highlightBanner: HighlightBanner? = null,
8-
val genres: List<Genre>,
8+
val streamsCarouselContent: List<StreamsCarouselContent>,
99
val isLoading: Boolean
1010
)

feature-list-streams/src/main/java/com/codandotv/streamplayerapp/feature_list_streams/list/presentation/widgets/StreamsCarousel.kt

Lines changed: 12 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@ import androidx.compose.foundation.lazy.rememberLazyListState
1010
import androidx.compose.material3.MaterialTheme
1111
import androidx.compose.material3.Text
1212
import androidx.compose.runtime.Composable
13-
import androidx.compose.runtime.remember
1413
import androidx.compose.ui.Modifier
1514
import androidx.compose.ui.text.font.FontWeight
1615
import androidx.compose.ui.tooling.preview.Preview
@@ -23,21 +22,23 @@ import androidx.paging.compose.itemKey
2322
import kotlinx.coroutines.flow.Flow
2423
import kotlinx.coroutines.flow.emptyFlow
2524

25+
data class StreamsCarouselContent(
26+
val genreTitle: String,
27+
val contentList: Flow<PagingData<StreamsCardContent>>
28+
)
29+
2630
@Composable
2731
fun StreamsCarousel(
28-
title: String,
29-
contentList: Flow<PagingData<StreamsCardContent>>,
32+
content: StreamsCarouselContent,
3033
modifier: Modifier = Modifier,
3134
onNavigateDetailList: (String) -> Unit = {},
3235
) {
33-
val flow = remember { contentList }
34-
35-
val lazyPagingItems = flow.collectAsLazyPagingItems()
36+
val lazyPagingItems = content.contentList.collectAsLazyPagingItems()
3637
val lazyListState = rememberLazyListState()
3738

3839
Column(modifier = modifier) {
3940
Text(
40-
title,
41+
content.genreTitle,
4142
style = MaterialTheme.typography.headlineMedium.copy(
4243
fontWeight = FontWeight.Bold,
4344
fontSize = 20.sp
@@ -73,7 +74,9 @@ fun StreamsCarousel(
7374
@Preview
7475
fun StreamsCarouselPreview() {
7576
StreamsCarousel(
76-
title = "Ação",
77-
contentList = emptyFlow()
77+
content = StreamsCarouselContent(
78+
genreTitle = "Ação",
79+
contentList = emptyFlow()
80+
)
7881
)
7982
}

0 commit comments

Comments
 (0)