diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 142a1d8296..e1252ef898 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -72,6 +72,7 @@ chucker-library = { module = "com.github.chuckerteam.chucker:library", version.r circuit-foundation = { module = "com.slack.circuit:circuit-foundation", version.ref = "circuit" } circuit-gestureNavigation = { module = "com.slack.circuit:circuitx-gesture-navigation", version.ref = "circuit" } circuit-overlay = { module = "com.slack.circuit:circuit-overlay", version.ref = "circuit" } +circuit-retained = { module = "com.slack.circuit:circuit-retained", version.ref = "circuit" } circuit-runtime = { module = "com.slack.circuit:circuit-runtime", version.ref = "circuit" } compose-material3-windowsizeclass = "dev.chrisbanes.material3:material3-window-size-class-multiplatform:0.3.1" diff --git a/ui/account/build.gradle.kts b/ui/account/build.gradle.kts index 80e2e838c9..574975cca9 100644 --- a/ui/account/build.gradle.kts +++ b/ui/account/build.gradle.kts @@ -24,6 +24,7 @@ kotlin { api(projects.common.ui.screens) api(projects.common.ui.circuitOverlay) // Only for LocalNavigator api(libs.circuit.foundation) + implementation(libs.circuit.retained) implementation(compose.foundation) implementation(compose.material) diff --git a/ui/account/src/commonMain/kotlin/app/tivi/account/AccountPresenter.kt b/ui/account/src/commonMain/kotlin/app/tivi/account/AccountPresenter.kt index febbd241f1..816bded47e 100644 --- a/ui/account/src/commonMain/kotlin/app/tivi/account/AccountPresenter.kt +++ b/ui/account/src/commonMain/kotlin/app/tivi/account/AccountPresenter.kt @@ -5,7 +5,6 @@ package app.tivi.account import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import app.tivi.common.compose.rememberCoroutineScope import app.tivi.data.traktauth.TraktAuthState @@ -16,6 +15,7 @@ import app.tivi.domain.observers.ObserveTraktAuthState import app.tivi.domain.observers.ObserveUserDetails import app.tivi.screens.AccountScreen import app.tivi.screens.SettingsScreen +import com.slack.circuit.retained.collectAsRetainedState import com.slack.circuit.runtime.CircuitContext import com.slack.circuit.runtime.Navigator import com.slack.circuit.runtime.presenter.Presenter @@ -47,8 +47,8 @@ class AccountPresenter( @Composable override fun present(): AccountUiState { - val user by observeUserDetails.flow.collectAsState(null) - val authState by observeTraktAuthState.flow.collectAsState(TraktAuthState.LOGGED_OUT) + val user by observeUserDetails.flow.collectAsRetainedState(null) + val authState by observeTraktAuthState.flow.collectAsRetainedState(TraktAuthState.LOGGED_OUT) val scope = rememberCoroutineScope() LaunchedEffect(Unit) { diff --git a/ui/developer/log/build.gradle.kts b/ui/developer/log/build.gradle.kts index fa161d4e76..d5728be175 100644 --- a/ui/developer/log/build.gradle.kts +++ b/ui/developer/log/build.gradle.kts @@ -22,6 +22,7 @@ kotlin { api(projects.common.ui.screens) api(libs.circuit.foundation) + implementation(libs.circuit.retained) implementation(compose.material3) implementation(compose.animation) diff --git a/ui/developer/settings/build.gradle.kts b/ui/developer/settings/build.gradle.kts index 52d28440ff..3bf6ec4148 100644 --- a/ui/developer/settings/build.gradle.kts +++ b/ui/developer/settings/build.gradle.kts @@ -23,6 +23,7 @@ kotlin { api(projects.common.ui.screens) api(libs.circuit.foundation) + implementation(libs.circuit.retained) implementation(compose.material3) implementation(compose.animation) diff --git a/ui/developer/settings/src/commonMain/kotlin/app/tivi/settings/developer/DevSettingsPresenter.kt b/ui/developer/settings/src/commonMain/kotlin/app/tivi/settings/developer/DevSettingsPresenter.kt index ef00169a93..9be982a3e1 100644 --- a/ui/developer/settings/src/commonMain/kotlin/app/tivi/settings/developer/DevSettingsPresenter.kt +++ b/ui/developer/settings/src/commonMain/kotlin/app/tivi/settings/developer/DevSettingsPresenter.kt @@ -4,12 +4,13 @@ package app.tivi.settings.developer import androidx.compose.runtime.Composable -import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue +import androidx.compose.runtime.remember import app.tivi.screens.DevLogScreen import app.tivi.screens.DevSettingsScreen import app.tivi.settings.TiviPreferences import app.tivi.settings.toggle +import com.slack.circuit.retained.collectAsRetainedState import com.slack.circuit.runtime.CircuitContext import com.slack.circuit.runtime.Navigator import com.slack.circuit.runtime.presenter.Presenter @@ -39,7 +40,8 @@ class DevSettingsPresenter( @Composable override fun present(): DevSettingsUiState { - val hideArtwork by preferences.observeDeveloperHideArtwork().collectAsState(false) + val hideArtwork by remember { preferences.observeDeveloperHideArtwork() } + .collectAsRetainedState(false) fun eventSink(event: DevSettingsUiEvent) { when (event) { diff --git a/ui/discover/build.gradle.kts b/ui/discover/build.gradle.kts index 635e93cbfb..d0120fd14d 100644 --- a/ui/discover/build.gradle.kts +++ b/ui/discover/build.gradle.kts @@ -23,6 +23,7 @@ kotlin { api(projects.common.ui.screens) api(projects.common.ui.circuitOverlay) api(libs.circuit.foundation) + implementation(libs.circuit.retained) implementation(compose.foundation) implementation(compose.material) diff --git a/ui/discover/src/commonMain/kotlin/app/tivi/home/discover/DiscoverPresenter.kt b/ui/discover/src/commonMain/kotlin/app/tivi/home/discover/DiscoverPresenter.kt index f9db90d414..26b26699bd 100644 --- a/ui/discover/src/commonMain/kotlin/app/tivi/home/discover/DiscoverPresenter.kt +++ b/ui/discover/src/commonMain/kotlin/app/tivi/home/discover/DiscoverPresenter.kt @@ -32,6 +32,7 @@ import app.tivi.screens.ShowSeasonsScreen import app.tivi.screens.TrendingShowsScreen import app.tivi.util.Logger import app.tivi.util.onException +import com.slack.circuit.retained.collectAsRetainedState import com.slack.circuit.runtime.CircuitContext import com.slack.circuit.runtime.Navigator import com.slack.circuit.runtime.presenter.Presenter @@ -76,18 +77,18 @@ class DiscoverPresenter( val scope = rememberCoroutineScope() val uiMessageManager = remember { UiMessageManager() } + val trendingItems by observeTrendingShows.flow.collectAsRetainedState(emptyList()) val trendingLoading by updateTrendingShows.inProgress.collectAsState(false) - val trendingItems by observeTrendingShows.flow.collectAsState(emptyList()) - val popularItems by observePopularShows.flow.collectAsState(emptyList()) + val popularItems by observePopularShows.flow.collectAsRetainedState(emptyList()) val popularLoading by updatePopularShows.inProgress.collectAsState(false) - val recommendedItems by observeRecommendedShows.flow.collectAsState(emptyList()) + val recommendedItems by observeRecommendedShows.flow.collectAsRetainedState(emptyList()) val recommendedLoading by updateRecommendedShows.inProgress.collectAsState(false) - val nextShow by observeNextShowEpisodeToWatch.flow.collectAsState(null) - val authState by observeTraktAuthState.flow.collectAsState(TraktAuthState.LOGGED_OUT) - val user by observeUserDetails.flow.collectAsState(null) + val nextShow by observeNextShowEpisodeToWatch.flow.collectAsRetainedState(null) + val authState by observeTraktAuthState.flow.collectAsRetainedState(TraktAuthState.LOGGED_OUT) + val user by observeUserDetails.flow.collectAsRetainedState(null) val message by uiMessageManager.message.collectAsState(null) diff --git a/ui/episode/details/build.gradle.kts b/ui/episode/details/build.gradle.kts index e415a7ee6d..279d066f64 100644 --- a/ui/episode/details/build.gradle.kts +++ b/ui/episode/details/build.gradle.kts @@ -23,6 +23,7 @@ kotlin { api(projects.common.ui.screens) api(projects.common.ui.circuitOverlay) api(libs.circuit.foundation) + implementation(libs.circuit.retained) implementation(compose.foundation) implementation(compose.material) diff --git a/ui/episode/details/src/commonMain/kotlin/app/tivi/episodedetails/EpisodeDetailsPresenter.kt b/ui/episode/details/src/commonMain/kotlin/app/tivi/episodedetails/EpisodeDetailsPresenter.kt index b3a1d37b76..b23343760f 100644 --- a/ui/episode/details/src/commonMain/kotlin/app/tivi/episodedetails/EpisodeDetailsPresenter.kt +++ b/ui/episode/details/src/commonMain/kotlin/app/tivi/episodedetails/EpisodeDetailsPresenter.kt @@ -20,6 +20,7 @@ import app.tivi.screens.EpisodeDetailsScreen import app.tivi.screens.EpisodeTrackScreen import app.tivi.util.Logger import app.tivi.util.onException +import com.slack.circuit.retained.collectAsRetainedState import com.slack.circuit.runtime.CircuitContext import com.slack.circuit.runtime.Navigator import com.slack.circuit.runtime.presenter.Presenter @@ -61,8 +62,8 @@ class EpisodeDetailsPresenter( val refreshing by updateEpisodeDetails.inProgress.collectAsState(false) val message by uiMessageManager.message.collectAsState(null) - val episodeDetails by observeEpisodeDetails.flow.collectAsState(null) - val episodeWatches by observeEpisodeWatches.flow.collectAsState(emptyList()) + val episodeDetails by observeEpisodeDetails.flow.collectAsRetainedState(null) + val episodeWatches by observeEpisodeWatches.flow.collectAsRetainedState(emptyList()) fun eventSink(event: EpisodeDetailsUiEvent) { when (event) { diff --git a/ui/episode/track/build.gradle.kts b/ui/episode/track/build.gradle.kts index ad229cb17a..fa7e1dbbe1 100644 --- a/ui/episode/track/build.gradle.kts +++ b/ui/episode/track/build.gradle.kts @@ -22,6 +22,7 @@ kotlin { api(projects.common.ui.screens) api(libs.circuit.foundation) + implementation(libs.circuit.retained) implementation(compose.foundation) implementation(compose.material) diff --git a/ui/episode/track/src/commonMain/kotlin/app/tivi/episode/track/EpisodeTrackPresenter.kt b/ui/episode/track/src/commonMain/kotlin/app/tivi/episode/track/EpisodeTrackPresenter.kt index 9b122c74fd..3524c9d31d 100644 --- a/ui/episode/track/src/commonMain/kotlin/app/tivi/episode/track/EpisodeTrackPresenter.kt +++ b/ui/episode/track/src/commonMain/kotlin/app/tivi/episode/track/EpisodeTrackPresenter.kt @@ -20,6 +20,7 @@ import app.tivi.domain.observers.ObserveEpisodeDetails import app.tivi.screens.EpisodeTrackScreen import app.tivi.util.Logger import app.tivi.util.onException +import com.slack.circuit.retained.collectAsRetainedState import com.slack.circuit.runtime.CircuitContext import com.slack.circuit.runtime.Navigator import com.slack.circuit.runtime.presenter.Presenter @@ -65,7 +66,7 @@ class EpisodeTrackPresenter( var selectedDate by remember { mutableStateOf(now.date) } var selectedTime by remember { mutableStateOf(now.time) } - val episodeDetails by observeEpisodeDetails.flow.collectAsState(initial = null) + val episodeDetails by observeEpisodeDetails.flow.collectAsRetainedState(initial = null) val refreshing by updateEpisodeDetails.inProgress.collectAsState(initial = false) val submitting by addEpisodeWatch.inProgress.collectAsState(initial = false) diff --git a/ui/library/build.gradle.kts b/ui/library/build.gradle.kts index e9e6736a6b..8d0bb2ab95 100644 --- a/ui/library/build.gradle.kts +++ b/ui/library/build.gradle.kts @@ -23,6 +23,7 @@ kotlin { api(projects.common.ui.screens) api(projects.common.ui.circuitOverlay) api(libs.circuit.foundation) + implementation(libs.circuit.retained) implementation(libs.paging.compose) diff --git a/ui/library/src/commonMain/kotlin/app/tivi/home/library/LibraryPresenter.kt b/ui/library/src/commonMain/kotlin/app/tivi/home/library/LibraryPresenter.kt index fa8fa4c890..b4839c3800 100644 --- a/ui/library/src/commonMain/kotlin/app/tivi/home/library/LibraryPresenter.kt +++ b/ui/library/src/commonMain/kotlin/app/tivi/home/library/LibraryPresenter.kt @@ -8,7 +8,6 @@ import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.produceState import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import app.cash.paging.PagingConfig @@ -31,6 +30,7 @@ import app.tivi.screens.ShowDetailsScreen import app.tivi.settings.TiviPreferences import app.tivi.util.Logger import app.tivi.util.onException +import com.slack.circuit.retained.collectAsRetainedState import com.slack.circuit.runtime.CircuitContext import com.slack.circuit.runtime.Navigator import com.slack.circuit.runtime.presenter.Presenter @@ -81,15 +81,13 @@ class LibraryPresenter( val loading by updateLibraryShows.inProgress.collectAsState(false) val message by uiMessageManager.message.collectAsState(null) - val user by observeUserDetails.flow.collectAsState(null) - val authState by observeTraktAuthState.flow.collectAsState(TraktAuthState.LOGGED_OUT) + val user by observeUserDetails.flow.collectAsRetainedState(null) + val authState by observeTraktAuthState.flow.collectAsRetainedState(TraktAuthState.LOGGED_OUT) - val includeWatchedShows by produceState(false, preferences) { - preferences.observeLibraryWatchedActive().collect { value = it } - } - val includeFollowedShows by produceState(false, preferences) { - preferences.observeLibraryFollowedActive().collect { value = it } - } + val includeWatchedShows by remember { preferences.observeLibraryWatchedActive() } + .collectAsRetainedState(false) + val includeFollowedShows by remember { preferences.observeLibraryFollowedActive() } + .collectAsRetainedState(false) fun eventSink(event: LibraryUiEvent) { when (event) { diff --git a/ui/licenses/build.gradle.kts b/ui/licenses/build.gradle.kts index 0fc418ab29..302f073e32 100644 --- a/ui/licenses/build.gradle.kts +++ b/ui/licenses/build.gradle.kts @@ -21,7 +21,9 @@ kotlin { implementation(projects.common.ui.compose) implementation(projects.data.licenses) // This should really be used through an interactor api(projects.common.ui.screens) + api(libs.circuit.foundation) + implementation(libs.circuit.retained) implementation(compose.material3) implementation(compose.animation) diff --git a/ui/popular/build.gradle.kts b/ui/popular/build.gradle.kts index 71e0673fb2..b7493dae52 100644 --- a/ui/popular/build.gradle.kts +++ b/ui/popular/build.gradle.kts @@ -22,6 +22,7 @@ kotlin { api(projects.common.ui.screens) api(libs.circuit.foundation) + implementation(libs.circuit.retained) implementation(libs.paging.compose) diff --git a/ui/recommended/build.gradle.kts b/ui/recommended/build.gradle.kts index 8be578fb6d..f7bdaad386 100644 --- a/ui/recommended/build.gradle.kts +++ b/ui/recommended/build.gradle.kts @@ -22,6 +22,7 @@ kotlin { api(projects.common.ui.screens) api(libs.circuit.foundation) + implementation(libs.circuit.retained) implementation(libs.paging.compose) diff --git a/ui/root/build.gradle.kts b/ui/root/build.gradle.kts index 1f0c8e1156..fae9aa6202 100644 --- a/ui/root/build.gradle.kts +++ b/ui/root/build.gradle.kts @@ -25,6 +25,7 @@ kotlin { implementation(projects.common.ui.screens) implementation(libs.circuit.foundation) + implementation(libs.circuit.retained) implementation(libs.circuit.gestureNavigation) implementation(libs.circuit.overlay) implementation(projects.common.ui.circuitOverlay) diff --git a/ui/root/src/commonMain/kotlin/app/tivi/home/TiviContent.kt b/ui/root/src/commonMain/kotlin/app/tivi/home/TiviContent.kt index 5352cb83af..8ba62f900d 100644 --- a/ui/root/src/commonMain/kotlin/app/tivi/home/TiviContent.kt +++ b/ui/root/src/commonMain/kotlin/app/tivi/home/TiviContent.kt @@ -31,6 +31,8 @@ import com.seiko.imageloader.LocalImageLoader import com.slack.circuit.backstack.SaveableBackStack import com.slack.circuit.foundation.Circuit import com.slack.circuit.foundation.CircuitCompositionLocals +import com.slack.circuit.retained.LocalRetainedStateRegistry +import com.slack.circuit.retained.continuityRetainedStateRegistry import com.slack.circuit.runtime.Navigator import com.slack.circuit.runtime.screen.Screen import kotlinx.coroutines.CoroutineScope @@ -85,6 +87,7 @@ fun TiviContent( LocalTiviDateFormatter provides tiviDateFormatter, LocalTiviTextCreator provides tiviTextCreator, LocalWindowSizeClass provides calculateWindowSizeClass(), + LocalRetainedStateRegistry provides continuityRetainedStateRegistry(), ) { CircuitCompositionLocals(circuit) { TiviTheme( diff --git a/ui/search/build.gradle.kts b/ui/search/build.gradle.kts index 7264fcaf16..82686d9ff4 100644 --- a/ui/search/build.gradle.kts +++ b/ui/search/build.gradle.kts @@ -23,6 +23,7 @@ kotlin { api(projects.common.ui.screens) api(libs.circuit.foundation) + implementation(libs.circuit.retained) implementation(compose.foundation) implementation(compose.material) diff --git a/ui/settings/build.gradle.kts b/ui/settings/build.gradle.kts index a5c25bce2d..a8d32fff06 100644 --- a/ui/settings/build.gradle.kts +++ b/ui/settings/build.gradle.kts @@ -23,6 +23,7 @@ kotlin { api(projects.common.ui.screens) api(libs.circuit.foundation) + implementation(libs.circuit.retained) implementation(compose.materialIconsExtended) implementation(compose.material3) diff --git a/ui/settings/src/commonMain/kotlin/app/tivi/settings/SettingsPresenter.kt b/ui/settings/src/commonMain/kotlin/app/tivi/settings/SettingsPresenter.kt index 0245364bb5..f25bae096a 100644 --- a/ui/settings/src/commonMain/kotlin/app/tivi/settings/SettingsPresenter.kt +++ b/ui/settings/src/commonMain/kotlin/app/tivi/settings/SettingsPresenter.kt @@ -4,7 +4,6 @@ package app.tivi.settings import androidx.compose.runtime.Composable -import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import app.tivi.app.ApplicationInfo @@ -13,6 +12,7 @@ import app.tivi.screens.DevSettingsScreen import app.tivi.screens.LicensesScreen import app.tivi.screens.SettingsScreen import app.tivi.screens.UrlScreen +import com.slack.circuit.retained.collectAsRetainedState import com.slack.circuit.runtime.CircuitContext import com.slack.circuit.runtime.Navigator import com.slack.circuit.runtime.presenter.Presenter @@ -44,16 +44,16 @@ class SettingsPresenter( @Composable override fun present(): SettingsUiState { val theme by remember { preferences.observeTheme() } - .collectAsState(TiviPreferences.Theme.SYSTEM) + .collectAsRetainedState(TiviPreferences.Theme.SYSTEM) val useDynamicColors by remember { preferences.observeUseDynamicColors() } - .collectAsState(false) + .collectAsRetainedState(false) val useLessData by remember { preferences.observeUseLessData() } - .collectAsState(false) + .collectAsRetainedState(false) val ignoreSpecials by remember { preferences.observeIgnoreSpecials() } - .collectAsState(true) + .collectAsRetainedState(true) fun eventSink(event: SettingsUiEvent) { when (event) { diff --git a/ui/show/details/build.gradle.kts b/ui/show/details/build.gradle.kts index de5e879512..1ecf4bde8c 100644 --- a/ui/show/details/build.gradle.kts +++ b/ui/show/details/build.gradle.kts @@ -22,6 +22,7 @@ kotlin { api(projects.common.ui.screens) api(libs.circuit.foundation) + implementation(libs.circuit.retained) implementation(compose.foundation) implementation(compose.material) diff --git a/ui/show/details/src/commonMain/kotlin/app/tivi/showdetails/details/ShowDetailsPresenter.kt b/ui/show/details/src/commonMain/kotlin/app/tivi/showdetails/details/ShowDetailsPresenter.kt index 055abb0fa4..61ee832d4e 100644 --- a/ui/show/details/src/commonMain/kotlin/app/tivi/showdetails/details/ShowDetailsPresenter.kt +++ b/ui/show/details/src/commonMain/kotlin/app/tivi/showdetails/details/ShowDetailsPresenter.kt @@ -33,6 +33,7 @@ import app.tivi.screens.ShowDetailsScreen import app.tivi.screens.ShowSeasonsScreen import app.tivi.util.Logger import app.tivi.util.onException +import com.slack.circuit.retained.collectAsRetainedState import com.slack.circuit.runtime.CircuitContext import com.slack.circuit.runtime.Navigator import com.slack.circuit.runtime.presenter.Presenter @@ -82,8 +83,8 @@ class ShowDetailsPresenter( val uiMessageManager = remember { UiMessageManager() } - val isFollowed by observeShowFollowStatus.flow.collectAsState(false) - val show by observeShowDetails.flow.collectAsState(TiviShow.EMPTY_SHOW) + val isFollowed by observeShowFollowStatus.flow.collectAsRetainedState(false) + val show by observeShowDetails.flow.collectAsRetainedState(TiviShow.EMPTY_SHOW) val refreshing by produceState(false) { combine( updateShowDetails.inProgress, @@ -92,10 +93,10 @@ class ShowDetailsPresenter( transform = { values -> values.any { it } }, ).collect { value = it } } - val relatedShows by observeRelatedShows.flow.collectAsState(emptyList()) - val nextEpisode by observeNextEpisodeToWatch.flow.collectAsState(null) - val seasons by observeShowSeasons.flow.collectAsState(emptyList()) - val stats by observeShowViewStats.flow.collectAsState(null) + val relatedShows by observeRelatedShows.flow.collectAsRetainedState(emptyList()) + val nextEpisode by observeNextEpisodeToWatch.flow.collectAsRetainedState(null) + val seasons by observeShowSeasons.flow.collectAsRetainedState(emptyList()) + val stats by observeShowViewStats.flow.collectAsRetainedState(null) val message by uiMessageManager.message.collectAsState(null) fun eventSink(event: ShowDetailsUiEvent) { diff --git a/ui/show/seasons/build.gradle.kts b/ui/show/seasons/build.gradle.kts index 7282081a06..fecb22e50f 100644 --- a/ui/show/seasons/build.gradle.kts +++ b/ui/show/seasons/build.gradle.kts @@ -22,6 +22,7 @@ kotlin { api(projects.common.ui.screens) api(libs.circuit.foundation) + implementation(libs.circuit.retained) implementation(compose.foundation) implementation(compose.material) diff --git a/ui/show/seasons/src/commonMain/kotlin/app/tivi/showdetails/seasons/ShowSeasonsPresenter.kt b/ui/show/seasons/src/commonMain/kotlin/app/tivi/showdetails/seasons/ShowSeasonsPresenter.kt index 5f803f7aa6..d00b9e2631 100644 --- a/ui/show/seasons/src/commonMain/kotlin/app/tivi/showdetails/seasons/ShowSeasonsPresenter.kt +++ b/ui/show/seasons/src/commonMain/kotlin/app/tivi/showdetails/seasons/ShowSeasonsPresenter.kt @@ -19,6 +19,7 @@ import app.tivi.screens.EpisodeDetailsScreen import app.tivi.screens.ShowSeasonsScreen import app.tivi.util.Logger import app.tivi.util.onException +import com.slack.circuit.retained.collectAsRetainedState import com.slack.circuit.runtime.CircuitContext import com.slack.circuit.runtime.Navigator import com.slack.circuit.runtime.presenter.Presenter @@ -56,8 +57,9 @@ class ShowSeasonsPresenter( val uiMessageManager = remember { UiMessageManager() } - val seasons by observeShowSeasons.flow.collectAsState(emptyList()) - val show by observeShowDetails.flow.collectAsState(TiviShow.EMPTY_SHOW) + val seasons by observeShowSeasons.flow.collectAsRetainedState(emptyList()) + val show by observeShowDetails.flow.collectAsRetainedState(TiviShow.EMPTY_SHOW) + val refreshing by updateShowSeasons.inProgress.collectAsState(false) val message by uiMessageManager.message.collectAsState(null) diff --git a/ui/trending/build.gradle.kts b/ui/trending/build.gradle.kts index 44f8d1348a..d3e49fb02a 100644 --- a/ui/trending/build.gradle.kts +++ b/ui/trending/build.gradle.kts @@ -22,6 +22,7 @@ kotlin { api(projects.common.ui.screens) api(libs.circuit.foundation) + implementation(libs.circuit.retained) implementation(libs.paging.compose) diff --git a/ui/upnext/build.gradle.kts b/ui/upnext/build.gradle.kts index 1ee8e7be30..103f66ae0f 100644 --- a/ui/upnext/build.gradle.kts +++ b/ui/upnext/build.gradle.kts @@ -23,6 +23,7 @@ kotlin { api(projects.common.ui.screens) api(projects.common.ui.circuitOverlay) api(libs.circuit.foundation) + implementation(libs.circuit.retained) implementation(libs.paging.compose) diff --git a/ui/upnext/src/commonMain/kotlin/app/tivi/home/upnext/UpNextPresenter.kt b/ui/upnext/src/commonMain/kotlin/app/tivi/home/upnext/UpNextPresenter.kt index c7c383dd7d..2bf88a4230 100644 --- a/ui/upnext/src/commonMain/kotlin/app/tivi/home/upnext/UpNextPresenter.kt +++ b/ui/upnext/src/commonMain/kotlin/app/tivi/home/upnext/UpNextPresenter.kt @@ -8,7 +8,6 @@ import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.collectAsState import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.produceState import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import app.cash.paging.PagingConfig @@ -33,6 +32,7 @@ import app.tivi.screens.UpNextScreen import app.tivi.settings.TiviPreferences import app.tivi.util.Logger import app.tivi.util.onException +import com.slack.circuit.retained.collectAsRetainedState import com.slack.circuit.runtime.CircuitContext import com.slack.circuit.runtime.Navigator import com.slack.circuit.runtime.presenter.Presenter @@ -83,12 +83,11 @@ class UpNextPresenter( val loading by updateUpNextEpisodes.inProgress.collectAsState(false) val message by uiMessageManager.message.collectAsState(null) - val user by observeUserDetails.flow.collectAsState(null) - val authState by observeTraktAuthState.flow.collectAsState(TraktAuthState.LOGGED_OUT) + val user by observeUserDetails.flow.collectAsRetainedState(null) + val authState by observeTraktAuthState.flow.collectAsRetainedState(TraktAuthState.LOGGED_OUT) - val followedShowsOnly by produceState(false, preferences) { - preferences.observeUpNextFollowedOnly().collect { value = it } - } + val followedShowsOnly by remember { preferences.observeUpNextFollowedOnly() } + .collectAsRetainedState(false) fun eventSink(event: UpNextUiEvent) { when (event) {