refactor(ui): standardize on collectAsStateWithLifecycle

Migrate all 56 Compose screens from collectAsState() to the lifecycle-aware
collectAsStateWithLifecycle() (added androidx.lifecycle:lifecycle-runtime-compose).
Upstream flow collection now pauses when the UI isn't visible instead of running
in the background — the modern, recommended idiom, and it unifies the two files
already using it with the rest of the app.

No behavior change for visible screens; compiles + unit suite green.

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
This commit is contained in:
null 2026-07-06 21:30:48 -05:00
parent eeac3c9383
commit 61a8609298
57 changed files with 119 additions and 117 deletions

View File

@ -169,6 +169,8 @@ dependencies {
// ViewModel // ViewModel
implementation("androidx.lifecycle:lifecycle-viewmodel-compose:2.8.7") implementation("androidx.lifecycle:lifecycle-viewmodel-compose:2.8.7")
// Lifecycle-aware Compose state collection (collectAsStateWithLifecycle)
implementation("androidx.lifecycle:lifecycle-runtime-compose:2.8.7")
// Firebase // Firebase
implementation(platform("com.google.firebase:firebase-bom:33.8.0")) implementation(platform("com.google.firebase:firebase-bom:33.8.0"))

View File

@ -18,7 +18,7 @@ import androidx.compose.runtime.Composable
import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.DisposableEffect
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.SideEffect import androidx.compose.runtime.SideEffect
import androidx.compose.runtime.collectAsState import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
@ -120,7 +120,7 @@ class MainActivity : AppCompatActivity() {
val initialSettings = runBlocking { settingsRepository.settings.first() } val initialSettings = runBlocking { settingsRepository.settings.first() }
AppCompatDelegate.setDefaultNightMode(nightModeFor(initialSettings.themeMode)) AppCompatDelegate.setDefaultNightMode(nightModeFor(initialSettings.themeMode))
setContent { setContent {
val settings by settingsRepository.settings.collectAsState(initial = initialSettings) val settings by settingsRepository.settings.collectAsStateWithLifecycle(initialValue = initialSettings)
val systemInDarkTheme = isSystemInDarkTheme() val systemInDarkTheme = isSystemInDarkTheme()
val useDarkTheme = when (settings.themeMode) { val useDarkTheme = when (settings.themeMode) {
ThemeMode.DEVICE -> systemInDarkTheme ThemeMode.DEVICE -> systemInDarkTheme

View File

@ -16,7 +16,7 @@ import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
@ -83,7 +83,7 @@ fun ActivityScreen(
onNavigate: (String) -> Unit = {}, onNavigate: (String) -> Unit = {},
viewModel: ActivityViewModel = hiltViewModel() viewModel: ActivityViewModel = hiltViewModel()
) { ) {
val state by viewModel.uiState.collectAsState() val state by viewModel.uiState.collectAsStateWithLifecycle()
SettingsSubpage(title = "Together", onBack = { onNavigate("back") }) { padding -> SettingsSubpage(title = "Together", onBack = { onNavigate("back") }) { padding ->
if (state.isLoading) { if (state.isLoading) {

View File

@ -35,7 +35,7 @@ import androidx.compose.material3.Surface
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.material3.TextButton import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
@ -67,7 +67,7 @@ fun AnswerHistoryScreen(
onNavigate: (String) -> Unit = {}, onNavigate: (String) -> Unit = {},
viewModel: AnswerHistoryViewModel = hiltViewModel() viewModel: AnswerHistoryViewModel = hiltViewModel()
) { ) {
val state by viewModel.uiState.collectAsState() val state by viewModel.uiState.collectAsStateWithLifecycle()
AnswerHistoryContent( AnswerHistoryContent(
state = state, state = state,

View File

@ -42,7 +42,7 @@ import androidx.compose.material3.Surface
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
@ -73,7 +73,7 @@ fun AnswerRevealScreen(
onNavigate: (String) -> Unit = {}, onNavigate: (String) -> Unit = {},
viewModel: AnswerRevealViewModel = hiltViewModel() viewModel: AnswerRevealViewModel = hiltViewModel()
) { ) {
val state by viewModel.uiState.collectAsState() val state by viewModel.uiState.collectAsStateWithLifecycle()
LaunchedEffect(state.isLoading, state.coupleId) { LaunchedEffect(state.isLoading, state.coupleId) {
if (!state.isLoading && state.coupleId == null) { if (!state.isLoading && state.coupleId == null) {

View File

@ -33,7 +33,7 @@ import androidx.compose.material3.TopAppBar
import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
@ -55,7 +55,7 @@ fun ForgotPasswordScreen(
onNavigate: (String) -> Unit = {}, onNavigate: (String) -> Unit = {},
viewModel: ForgotPasswordViewModel = hiltViewModel() viewModel: ForgotPasswordViewModel = hiltViewModel()
) { ) {
val state by viewModel.uiState.collectAsState() val state by viewModel.uiState.collectAsStateWithLifecycle()
val snackbar = remember { SnackbarHostState() } val snackbar = remember { SnackbarHostState() }
val focusManager = LocalFocusManager.current val focusManager = LocalFocusManager.current

View File

@ -36,7 +36,7 @@ import androidx.compose.material3.Text
import androidx.compose.material3.TextButton import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.rememberCoroutineScope
@ -64,7 +64,7 @@ fun LoginScreen(
onNavigate: (String) -> Unit = {}, onNavigate: (String) -> Unit = {},
viewModel: LoginViewModel = hiltViewModel() viewModel: LoginViewModel = hiltViewModel()
) { ) {
val state by viewModel.uiState.collectAsState() val state by viewModel.uiState.collectAsStateWithLifecycle()
val snackbar = remember { SnackbarHostState() } val snackbar = remember { SnackbarHostState() }
val focusManager = LocalFocusManager.current val focusManager = LocalFocusManager.current
val context = LocalContext.current val context = LocalContext.current

View File

@ -44,7 +44,7 @@ import androidx.compose.material3.TopAppBar
import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.rememberCoroutineScope
@ -71,7 +71,7 @@ fun SignUpScreen(
onNavigate: (String) -> Unit = {}, onNavigate: (String) -> Unit = {},
viewModel: SignUpViewModel = hiltViewModel() viewModel: SignUpViewModel = hiltViewModel()
) { ) {
val state by viewModel.uiState.collectAsState() val state by viewModel.uiState.collectAsStateWithLifecycle()
val snackbar = remember { SnackbarHostState() } val snackbar = remember { SnackbarHostState() }
val focusManager = LocalFocusManager.current val focusManager = LocalFocusManager.current
val context = LocalContext.current val context = LocalContext.current

View File

@ -41,7 +41,7 @@ import androidx.compose.material3.Surface
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
@ -270,7 +270,7 @@ fun ConnectionChallengesScreen(
onNavigate: (String) -> Unit = {}, onNavigate: (String) -> Unit = {},
viewModel: ConnectionChallengesViewModel = hiltViewModel() viewModel: ConnectionChallengesViewModel = hiltViewModel()
) { ) {
val state by viewModel.uiState.collectAsState() val state by viewModel.uiState.collectAsStateWithLifecycle()
val snackbarHostState = remember { SnackbarHostState() } val snackbarHostState = remember { SnackbarHostState() }
LaunchedEffect(state.navigateTo) { LaunchedEffect(state.navigateTo) {

View File

@ -36,7 +36,7 @@ import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
@ -89,7 +89,7 @@ fun GamePromptBanner(
onAction: (kind: GamePromptKind, gameType: String, gameSessionId: String?) -> Unit, onAction: (kind: GamePromptKind, gameType: String, gameSessionId: String?) -> Unit,
viewModel: GamePromptViewModel = hiltViewModel() viewModel: GamePromptViewModel = hiltViewModel()
) { ) {
val prompt by viewModel.prompt.collectAsState() val prompt by viewModel.prompt.collectAsStateWithLifecycle()
val haptics = LocalHapticFeedback.current val haptics = LocalHapticFeedback.current
// Retain the last prompt so the slide-out animation still has data to render. // Retain the last prompt so the slide-out animation still has data to render.

View File

@ -16,7 +16,7 @@ import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.compose.ui.hapticfeedback.HapticFeedbackType import androidx.compose.ui.hapticfeedback.HapticFeedbackType
import androidx.compose.ui.platform.LocalHapticFeedback import androidx.compose.ui.platform.LocalHapticFeedback
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
@ -62,7 +62,7 @@ fun MessageBubbleOverlay(
onOpen: (coupleId: String, conversationId: String) -> Unit, onOpen: (coupleId: String, conversationId: String) -> Unit,
viewModel: MessageBubbleViewModel = hiltViewModel() viewModel: MessageBubbleViewModel = hiltViewModel()
) { ) {
val bubble by viewModel.bubble.collectAsState() val bubble by viewModel.bubble.collectAsStateWithLifecycle()
val current = bubble ?: return val current = bubble ?: return
// A soft haptic when a new chat-head arrives (parity with the game banner's "felt" arrival). // A soft haptic when a new chat-head arrives (parity with the game banner's "felt" arrival).

View File

@ -13,7 +13,7 @@ import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface import androidx.compose.material3.Surface
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
@ -84,7 +84,7 @@ class PremiumUnlockViewModel @Inject constructor(
fun PremiumUnlockOverlay( fun PremiumUnlockOverlay(
viewModel: PremiumUnlockViewModel = hiltViewModel() viewModel: PremiumUnlockViewModel = hiltViewModel()
) { ) {
val visible by viewModel.visible.collectAsState() val visible by viewModel.visible.collectAsStateWithLifecycle()
if (!visible) return if (!visible) return
PremiumUnlockModal(onDismiss = viewModel::dismiss) PremiumUnlockModal(onDismiss = viewModel::dismiss)
} }

View File

@ -38,7 +38,7 @@ import androidx.compose.material3.Text
import androidx.compose.material3.TextButton import androidx.compose.material3.TextButton
import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.ui.graphics.vector.ImageVector
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
@ -60,7 +60,7 @@ fun BucketListScreen(
onNavigate: (String) -> Unit = {}, onNavigate: (String) -> Unit = {},
viewModel: BucketListViewModel = hiltViewModel() viewModel: BucketListViewModel = hiltViewModel()
) { ) {
val state by viewModel.uiState.collectAsState() val state by viewModel.uiState.collectAsStateWithLifecycle()
BucketListContent( BucketListContent(
state = state, state = state,

View File

@ -43,7 +43,7 @@ import androidx.compose.material3.rememberDatePickerState
import androidx.compose.material3.rememberTimePickerState import androidx.compose.material3.rememberTimePickerState
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableIntStateOf
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
@ -65,7 +65,7 @@ fun DateBuilderScreen(
onNavigate: (String) -> Unit = {}, onNavigate: (String) -> Unit = {},
viewModel: DateBuilderViewModel = hiltViewModel() viewModel: DateBuilderViewModel = hiltViewModel()
) { ) {
val state by viewModel.uiState.collectAsState() val state by viewModel.uiState.collectAsStateWithLifecycle()
val snackbarHostState = remember { SnackbarHostState() } val snackbarHostState = remember { SnackbarHostState() }
LaunchedEffect(state.saved) { LaunchedEffect(state.saved) {

View File

@ -39,7 +39,7 @@ import androidx.compose.material3.Surface
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableFloatStateOf import androidx.compose.runtime.mutableFloatStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
@ -75,7 +75,7 @@ fun DateMatchScreen(
onNavigate: (String) -> Unit = {}, onNavigate: (String) -> Unit = {},
viewModel: DateMatchViewModel = hiltViewModel() viewModel: DateMatchViewModel = hiltViewModel()
) { ) {
val state by viewModel.uiState.collectAsState() val state by viewModel.uiState.collectAsStateWithLifecycle()
// A-201: a free couple expressing interest in a premium idea routes to the paywall (couple-shared). // A-201: a free couple expressing interest in a premium idea routes to the paywall (couple-shared).
LaunchedEffect(Unit) { LaunchedEffect(Unit) {

View File

@ -32,7 +32,7 @@ import androidx.compose.runtime.Composable
import androidx.compose.foundation.clickable import androidx.compose.foundation.clickable
import androidx.compose.material3.TextButton import androidx.compose.material3.TextButton
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
@ -63,7 +63,7 @@ fun DateMatchesScreen(
onNavigate: (String) -> Unit = {}, onNavigate: (String) -> Unit = {},
viewModel: DateMatchesViewModel = hiltViewModel() viewModel: DateMatchesViewModel = hiltViewModel()
) { ) {
val state by viewModel.uiState.collectAsState() val state by viewModel.uiState.collectAsStateWithLifecycle()
// After marking a date done, open its reflection. // After marking a date done, open its reflection.
LaunchedEffect(Unit) { LaunchedEffect(Unit) {

View File

@ -19,7 +19,7 @@ import androidx.compose.material3.Surface
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.material3.TextButton import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
@ -136,7 +136,7 @@ fun DateMemoriesScreen(
onNavigate: (String) -> Unit = {}, onNavigate: (String) -> Unit = {},
viewModel: DateMemoriesViewModel = hiltViewModel() viewModel: DateMemoriesViewModel = hiltViewModel()
) { ) {
val state by viewModel.uiState.collectAsState() val state by viewModel.uiState.collectAsStateWithLifecycle()
var pendingDelete by remember { mutableStateOf<DateMemory?>(null) } var pendingDelete by remember { mutableStateOf<DateMemory?>(null) }
SettingsSubpage(title = "Date memories", onBack = { onNavigate("back") }) { padding -> SettingsSubpage(title = "Date memories", onBack = { onNavigate("back") }) { padding ->

View File

@ -18,7 +18,7 @@ import androidx.compose.material3.OutlinedButton
import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.OutlinedTextField
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
@ -259,7 +259,7 @@ fun DateReflectionScreen(
onNavigate: (String) -> Unit = {}, onNavigate: (String) -> Unit = {},
viewModel: DateReflectionViewModel = hiltViewModel() viewModel: DateReflectionViewModel = hiltViewModel()
) { ) {
val state by viewModel.uiState.collectAsState() val state by viewModel.uiState.collectAsStateWithLifecycle()
SettingsSubpage(title = "Date reflection", onBack = { onNavigate("back") }) { padding -> SettingsSubpage(title = "Date reflection", onBack = { onNavigate("back") }) { padding ->
when (state.phase) { when (state.phase) {
ReflectionPhase.LOADING -> Box(Modifier.fillMaxSize().padding(padding), Alignment.Center) { CloserHeartLoader() } ReflectionPhase.LOADING -> Box(Modifier.fillMaxSize().padding(padding), Alignment.Center) { CloserHeartLoader() }

View File

@ -41,7 +41,7 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import app.closer.ui.components.CelebrationOverlay import app.closer.ui.components.CelebrationOverlay
import androidx.compose.runtime.collectAsState import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
@ -406,7 +406,7 @@ fun DesireSyncScreen(
onNavigate: (String) -> Unit = {}, onNavigate: (String) -> Unit = {},
viewModel: DesireSyncViewModel = hiltViewModel() viewModel: DesireSyncViewModel = hiltViewModel()
) { ) {
val state by viewModel.uiState.collectAsState() val state by viewModel.uiState.collectAsStateWithLifecycle()
LaunchedEffect(state.navigateTo) { LaunchedEffect(state.navigateTo) {
state.navigateTo?.let { state.navigateTo?.let {
@ -1089,7 +1089,7 @@ fun DSReplayScreen(
onNavigate: (String) -> Unit = {}, onNavigate: (String) -> Unit = {},
viewModel: DSReplayViewModel = hiltViewModel() viewModel: DSReplayViewModel = hiltViewModel()
) { ) {
val state by viewModel.uiState.collectAsState() val state by viewModel.uiState.collectAsStateWithLifecycle()
val phase = state.phase val phase = state.phase
Box( Box(
modifier = Modifier modifier = Modifier

View File

@ -24,7 +24,7 @@ import androidx.compose.ui.res.vectorResource
import app.closer.R import app.closer.R
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
@ -123,7 +123,7 @@ fun WaitingForPartnerScreen(
onNavigate: (String) -> Unit = {}, onNavigate: (String) -> Unit = {},
viewModel: WaitingForPartnerViewModel = hiltViewModel() viewModel: WaitingForPartnerViewModel = hiltViewModel()
) { ) {
val state by viewModel.uiState.collectAsState() val state by viewModel.uiState.collectAsStateWithLifecycle()
LaunchedEffect(state.navigateTo) { LaunchedEffect(state.navigateTo) {
state.navigateTo?.let { state.navigateTo?.let {

View File

@ -60,7 +60,7 @@ import androidx.compose.material3.rememberModalBottomSheetState
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
@ -93,7 +93,7 @@ fun HomeScreen(
onNavigate: (String) -> Unit = {}, onNavigate: (String) -> Unit = {},
viewModel: HomeViewModel = hiltViewModel() viewModel: HomeViewModel = hiltViewModel()
) { ) {
val state by viewModel.uiState.collectAsState() val state by viewModel.uiState.collectAsStateWithLifecycle()
val snackbarHostState = remember { SnackbarHostState() } val snackbarHostState = remember { SnackbarHostState() }
LaunchedEffect(state.partnerLeftEvent, state.partnerName) { LaunchedEffect(state.partnerLeftEvent, state.partnerName) {

View File

@ -33,7 +33,7 @@ import androidx.compose.material3.TopAppBar
import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
@ -199,7 +199,7 @@ fun PartnerHomeScreen(
onNavigate: (String) -> Unit = {}, onNavigate: (String) -> Unit = {},
viewModel: PartnerHomeViewModel = hiltViewModel() viewModel: PartnerHomeViewModel = hiltViewModel()
) { ) {
val state by viewModel.uiState.collectAsState() val state by viewModel.uiState.collectAsStateWithLifecycle()
val snackbar = remember { SnackbarHostState() } val snackbar = remember { SnackbarHostState() }
LaunchedEffect(state.reminderSentEvent) { LaunchedEffect(state.reminderSentEvent) {

View File

@ -41,7 +41,7 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import app.closer.ui.components.CelebrationOverlay import app.closer.ui.components.CelebrationOverlay
import androidx.compose.runtime.collectAsState import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
@ -447,7 +447,7 @@ fun HowWellScreen(
onNavigate: (String) -> Unit = {}, onNavigate: (String) -> Unit = {},
viewModel: HowWellViewModel = hiltViewModel() viewModel: HowWellViewModel = hiltViewModel()
) { ) {
val state by viewModel.uiState.collectAsState() val state by viewModel.uiState.collectAsStateWithLifecycle()
LaunchedEffect(state.navigateTo) { LaunchedEffect(state.navigateTo) {
state.navigateTo?.let { state.navigateTo?.let {
@ -1259,7 +1259,7 @@ fun HowWellReplayScreen(
onNavigate: (String) -> Unit = {}, onNavigate: (String) -> Unit = {},
viewModel: HowWellReplayViewModel = hiltViewModel() viewModel: HowWellReplayViewModel = hiltViewModel()
) { ) {
val state by viewModel.uiState.collectAsState() val state by viewModel.uiState.collectAsStateWithLifecycle()
val phase = state.phase val phase = state.phase
Box( Box(
modifier = Modifier modifier = Modifier

View File

@ -51,7 +51,7 @@ import androidx.compose.material3.TextButton
import androidx.compose.material3.rememberDatePickerState import androidx.compose.material3.rememberDatePickerState
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
@ -328,7 +328,7 @@ fun MemoryLaneScreen(
startingCapsuleId: String? = null, startingCapsuleId: String? = null,
viewModel: MemoryLaneViewModel = hiltViewModel() viewModel: MemoryLaneViewModel = hiltViewModel()
) { ) {
val state by viewModel.uiState.collectAsState() val state by viewModel.uiState.collectAsStateWithLifecycle()
val snackbarHostState = remember { SnackbarHostState() } val snackbarHostState = remember { SnackbarHostState() }
// Deep-link: open a specific capsule once the list is loaded. The flag prevents // Deep-link: open a specific capsule once the list is loaded. The flag prevents

View File

@ -30,7 +30,7 @@ import androidx.compose.material3.TopAppBar
import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.derivedStateOf
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
@ -60,7 +60,7 @@ fun ConversationScreen(
onNavigate: (String) -> Unit = {}, onNavigate: (String) -> Unit = {},
viewModel: ConversationViewModel = hiltViewModel() viewModel: ConversationViewModel = hiltViewModel()
) { ) {
val state by viewModel.uiState.collectAsState() val state by viewModel.uiState.collectAsStateWithLifecycle()
val listState = rememberLazyListState() val listState = rememberLazyListState()
val snackbarHostState = remember { SnackbarHostState() } val snackbarHostState = remember { SnackbarHostState() }

View File

@ -19,7 +19,7 @@ import androidx.compose.material3.Icon
import androidx.compose.material3.MaterialTheme import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
@ -42,7 +42,7 @@ fun MessagesInboxScreen(
onNavigate: (String) -> Unit = {}, onNavigate: (String) -> Unit = {},
viewModel: MessagesInboxViewModel = hiltViewModel() viewModel: MessagesInboxViewModel = hiltViewModel()
) { ) {
val state by viewModel.uiState.collectAsState() val state by viewModel.uiState.collectAsStateWithLifecycle()
Column( Column(
modifier = Modifier modifier = Modifier

View File

@ -46,7 +46,7 @@ import androidx.compose.material3.TopAppBar
import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.rememberCoroutineScope
@ -84,7 +84,7 @@ fun CreateProfileScreen(
onNavigate: (String) -> Unit = {}, onNavigate: (String) -> Unit = {},
viewModel: CreateProfileViewModel = hiltViewModel() viewModel: CreateProfileViewModel = hiltViewModel()
) { ) {
val state by viewModel.uiState.collectAsState() val state by viewModel.uiState.collectAsStateWithLifecycle()
val snackbar = remember { SnackbarHostState() } val snackbar = remember { SnackbarHostState() }
val focusManager = LocalFocusManager.current val focusManager = LocalFocusManager.current
val context = LocalContext.current val context = LocalContext.current

View File

@ -30,7 +30,7 @@ import androidx.compose.material3.Text
import androidx.compose.material3.TextButton import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.rememberCoroutineScope
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
@ -65,7 +65,7 @@ fun OnboardingScreen(
onNavigate: (String) -> Unit = {}, onNavigate: (String) -> Unit = {},
viewModel: OnboardingViewModel = hiltViewModel() viewModel: OnboardingViewModel = hiltViewModel()
) { ) {
val state by viewModel.uiState.collectAsState() val state by viewModel.uiState.collectAsStateWithLifecycle()
LaunchedEffect(state.navigateTo) { LaunchedEffect(state.navigateTo) {
state.navigateTo?.let { dest -> state.navigateTo?.let { dest ->

View File

@ -28,7 +28,7 @@ import androidx.compose.material3.TopAppBar
import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
@ -54,7 +54,7 @@ fun YourProgressScreen(
onBack: () -> Unit, onBack: () -> Unit,
viewModel: YourProgressViewModel = hiltViewModel() viewModel: YourProgressViewModel = hiltViewModel()
) { ) {
val state by viewModel.uiState.collectAsState() val state by viewModel.uiState.collectAsStateWithLifecycle()
LaunchedEffect(Unit) { viewModel.load() } LaunchedEffect(Unit) { viewModel.load() }

View File

@ -38,7 +38,7 @@ import androidx.compose.material3.TopAppBar
import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
@ -76,7 +76,7 @@ fun AcceptInviteScreen(
onBack: () -> Unit = {}, onBack: () -> Unit = {},
viewModel: AcceptInviteViewModel = hiltViewModel() viewModel: AcceptInviteViewModel = hiltViewModel()
) { ) {
val state by viewModel.uiState.collectAsState() val state by viewModel.uiState.collectAsStateWithLifecycle()
val snackbar = remember { SnackbarHostState() } val snackbar = remember { SnackbarHostState() }
val focusManager = LocalFocusManager.current val focusManager = LocalFocusManager.current

View File

@ -38,7 +38,7 @@ import androidx.compose.material3.TopAppBar
import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.OutlinedTextField
import androidx.compose.material3.OutlinedTextFieldDefaults import androidx.compose.material3.OutlinedTextFieldDefaults
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
@ -74,7 +74,7 @@ fun CreateInviteScreen(
onBack: () -> Unit = {}, onBack: () -> Unit = {},
viewModel: CreateInviteViewModel = hiltViewModel() viewModel: CreateInviteViewModel = hiltViewModel()
) { ) {
val state by viewModel.uiState.collectAsState() val state by viewModel.uiState.collectAsStateWithLifecycle()
val snackbar = remember { SnackbarHostState() } val snackbar = remember { SnackbarHostState() }
val scope = rememberCoroutineScope() val scope = rememberCoroutineScope()
val clipboard = LocalClipboardManager.current val clipboard = LocalClipboardManager.current

View File

@ -31,7 +31,7 @@ import androidx.compose.material3.TopAppBar
import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
@ -60,7 +60,7 @@ fun InviteConfirmScreen(
onBack: () -> Unit = {}, onBack: () -> Unit = {},
viewModel: InviteConfirmViewModel = hiltViewModel() viewModel: InviteConfirmViewModel = hiltViewModel()
) { ) {
val state by viewModel.uiState.collectAsState() val state by viewModel.uiState.collectAsStateWithLifecycle()
val snackbar = remember { SnackbarHostState() } val snackbar = remember { SnackbarHostState() }
LaunchedEffect(state.navigateTo) { LaunchedEffect(state.navigateTo) {

View File

@ -36,7 +36,7 @@ import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
@ -163,7 +163,7 @@ fun PairingSuccessScreen(
onNavigate: (String) -> Unit = {}, onNavigate: (String) -> Unit = {},
viewModel: PairingSuccessViewModel = hiltViewModel() viewModel: PairingSuccessViewModel = hiltViewModel()
) { ) {
val state by viewModel.uiState.collectAsState() val state by viewModel.uiState.collectAsStateWithLifecycle()
LaunchedEffect(state.navigateTo) { LaunchedEffect(state.navigateTo) {
state.navigateTo?.let { onNavigate(it); viewModel.onNavigated() } state.navigateTo?.let { onNavigate(it); viewModel.onNavigated() }

View File

@ -28,7 +28,7 @@ import androidx.compose.material3.SnackbarHostState
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
@ -54,7 +54,7 @@ fun RecoveryScreen(
onPartnerRestore: () -> Unit = {}, onPartnerRestore: () -> Unit = {},
viewModel: RecoveryViewModel = hiltViewModel() viewModel: RecoveryViewModel = hiltViewModel()
) { ) {
val state by viewModel.uiState.collectAsState() val state by viewModel.uiState.collectAsStateWithLifecycle()
val snackbar = remember { SnackbarHostState() } val snackbar = remember { SnackbarHostState() }
LaunchedEffect(state.success) { LaunchedEffect(state.success) {

View File

@ -34,7 +34,7 @@ import androidx.compose.material3.SnackbarHostState
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
@ -65,7 +65,7 @@ fun RestoreRequestScreen(
onBack: () -> Unit = {}, onBack: () -> Unit = {},
viewModel: RestoreViewModel = hiltViewModel() viewModel: RestoreViewModel = hiltViewModel()
) { ) {
val state by viewModel.uiState.collectAsState() val state by viewModel.uiState.collectAsStateWithLifecycle()
val snackbar = remember { SnackbarHostState() } val snackbar = remember { SnackbarHostState() }
LaunchedEffect(state.restoreComplete) { if (state.restoreComplete) onDone() } LaunchedEffect(state.restoreComplete) { if (state.restoreComplete) onDone() }
LaunchedEffect(state.error) { state.error?.let { snackbar.showSnackbar(it); viewModel.dismissError() } } LaunchedEffect(state.error) { state.error?.let { snackbar.showSnackbar(it); viewModel.dismissError() } }
@ -104,7 +104,7 @@ fun RestoreConsentScreen(
onBack: () -> Unit = {}, onBack: () -> Unit = {},
viewModel: RestoreViewModel = hiltViewModel() viewModel: RestoreViewModel = hiltViewModel()
) { ) {
val state by viewModel.uiState.collectAsState() val state by viewModel.uiState.collectAsStateWithLifecycle()
val snackbar = remember { SnackbarHostState() } val snackbar = remember { SnackbarHostState() }
LaunchedEffect(Unit) { viewModel.observeIncomingRequest() } LaunchedEffect(Unit) { viewModel.observeIncomingRequest() }
LaunchedEffect(state.consentComplete) { if (state.consentComplete) onDone() } LaunchedEffect(state.consentComplete) { if (state.consentComplete) onDone() }

View File

@ -39,7 +39,7 @@ import androidx.compose.material3.Text
import androidx.compose.material3.TextButton import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
@ -83,7 +83,7 @@ fun PaywallScreen(
onNavigate: (String) -> Unit = {}, onNavigate: (String) -> Unit = {},
viewModel: PaywallViewModel = hiltViewModel() viewModel: PaywallViewModel = hiltViewModel()
) { ) {
val uiState by viewModel.uiState.collectAsState() val uiState by viewModel.uiState.collectAsStateWithLifecycle()
val context = LocalContext.current val context = LocalContext.current
var showThankYou by remember { mutableStateOf(false) } var showThankYou by remember { mutableStateOf(false) }

View File

@ -30,7 +30,7 @@ import androidx.compose.ui.res.painterResource
import androidx.compose.ui.res.vectorResource import androidx.compose.ui.res.vectorResource
import androidx.compose.ui.text.font.FontWeight import androidx.compose.ui.text.font.FontWeight
import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.text.style.TextOverflow
import androidx.compose.runtime.collectAsState import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import androidx.compose.ui.unit.dp import androidx.compose.ui.unit.dp
@ -54,8 +54,8 @@ fun PlayHubScreen(
onNavigate: (String) -> Unit = {}, onNavigate: (String) -> Unit = {},
viewModel: PlayHubViewModel = hiltViewModel() viewModel: PlayHubViewModel = hiltViewModel()
) { ) {
val hasPremium by viewModel.hasPremium.collectAsState() val hasPremium by viewModel.hasPremium.collectAsStateWithLifecycle()
val isPaired by viewModel.isPaired.collectAsState() val isPaired by viewModel.isPaired.collectAsStateWithLifecycle()
PlayHubContent(onNavigate = onNavigate, hasPremium = hasPremium, isPaired = isPaired) PlayHubContent(onNavigate = onNavigate, hasPremium = hasPremium, isPaired = isPaired)
} }

View File

@ -1,7 +1,7 @@
package app.closer.ui.questions package app.closer.ui.questions
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.Preview
import androidx.hilt.navigation.compose.hiltViewModel import androidx.hilt.navigation.compose.hiltViewModel
@ -14,7 +14,7 @@ fun DailyQuestionScreen(
onBack: () -> Unit = {}, onBack: () -> Unit = {},
viewModel: DailyQuestionViewModel = hiltViewModel() viewModel: DailyQuestionViewModel = hiltViewModel()
) { ) {
val state by viewModel.uiState.collectAsState() val state by viewModel.uiState.collectAsStateWithLifecycle()
// The reveal route is available whenever both answered, and remains available after // The reveal route is available whenever both answered, and remains available after
// reveal so users can always navigate back to see both answers (labeled "View reveal"). // reveal so users can always navigate back to see both answers (labeled "View reveal").

View File

@ -34,7 +34,7 @@ import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface import androidx.compose.material3.Surface
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
@ -61,7 +61,7 @@ fun QuestionCategoryScreen(
onNavigate: (String) -> Unit = {}, onNavigate: (String) -> Unit = {},
viewModel: QuestionCategoryViewModel = hiltViewModel() viewModel: QuestionCategoryViewModel = hiltViewModel()
) { ) {
val state by viewModel.uiState.collectAsState() val state by viewModel.uiState.collectAsStateWithLifecycle()
QuestionCategoryContent( QuestionCategoryContent(
categoryId = categoryId, categoryId = categoryId,

View File

@ -33,7 +33,7 @@ import androidx.compose.material3.MaterialTheme
import androidx.compose.material3.Surface import androidx.compose.material3.Surface
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
@ -68,7 +68,7 @@ fun QuestionPackLibraryScreen(
onNavigate: (String) -> Unit = {}, onNavigate: (String) -> Unit = {},
viewModel: QuestionPackLibraryViewModel = hiltViewModel() viewModel: QuestionPackLibraryViewModel = hiltViewModel()
) { ) {
val state by viewModel.uiState.collectAsState() val state by viewModel.uiState.collectAsStateWithLifecycle()
QuestionPackLibraryContent( QuestionPackLibraryContent(
state = state, state = state,

View File

@ -29,7 +29,7 @@ import androidx.compose.material3.OutlinedButton
import androidx.compose.material3.Surface import androidx.compose.material3.Surface
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
@ -58,7 +58,7 @@ fun QuestionThreadScreen(
onBack: () -> Unit = {}, onBack: () -> Unit = {},
viewModel: QuestionThreadViewModel = hiltViewModel() viewModel: QuestionThreadViewModel = hiltViewModel()
) { ) {
val state by viewModel.uiState.collectAsState() val state by viewModel.uiState.collectAsStateWithLifecycle()
Box( Box(
modifier = Modifier modifier = Modifier

View File

@ -29,7 +29,7 @@ import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBar
import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.rememberCoroutineScope
@ -56,7 +56,7 @@ fun AccountScreen(
onNavigate: (String) -> Unit = {}, onNavigate: (String) -> Unit = {},
viewModel: EditProfileViewModel = hiltViewModel() viewModel: EditProfileViewModel = hiltViewModel()
) { ) {
val state by viewModel.uiState.collectAsState() val state by viewModel.uiState.collectAsStateWithLifecycle()
val snackbar = remember { SnackbarHostState() } val snackbar = remember { SnackbarHostState() }
val scope = rememberCoroutineScope() val scope = rememberCoroutineScope()
val clipboard = LocalClipboardManager.current val clipboard = LocalClipboardManager.current

View File

@ -28,7 +28,7 @@ import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBar
import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
@ -46,7 +46,7 @@ fun AppearanceScreen(
onNavigate: (String) -> Unit = {}, onNavigate: (String) -> Unit = {},
viewModel: SettingsViewModel = hiltViewModel() viewModel: SettingsViewModel = hiltViewModel()
) { ) {
val state by viewModel.uiState.collectAsState() val state by viewModel.uiState.collectAsStateWithLifecycle()
Scaffold( Scaffold(
containerColor = Color.Transparent, containerColor = Color.Transparent,

View File

@ -26,7 +26,7 @@ import androidx.compose.material3.Surface
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.material3.TextButton import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
@ -131,7 +131,7 @@ fun ChangePasswordScreen(
onNavigate: (String) -> Unit = {}, onNavigate: (String) -> Unit = {},
viewModel: ChangePasswordViewModel = hiltViewModel() viewModel: ChangePasswordViewModel = hiltViewModel()
) { ) {
val state by viewModel.uiState.collectAsState() val state by viewModel.uiState.collectAsStateWithLifecycle()
SettingsSubpage(title = "Change password", onBack = { onNavigate("back") }) { padding -> SettingsSubpage(title = "Change password", onBack = { onNavigate("back") }) { padding ->
Column( Column(

View File

@ -48,7 +48,7 @@ import androidx.compose.material3.TopAppBar
import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
@ -153,7 +153,7 @@ fun DeleteAccountScreen(
onNavigate: (String) -> Unit = {}, onNavigate: (String) -> Unit = {},
viewModel: DeleteAccountViewModel = hiltViewModel() viewModel: DeleteAccountViewModel = hiltViewModel()
) { ) {
val state by viewModel.uiState.collectAsState() val state by viewModel.uiState.collectAsStateWithLifecycle()
LaunchedEffect(state.navigateTo) { LaunchedEffect(state.navigateTo) {
state.navigateTo?.let { onNavigate(it); viewModel.onNavigated() } state.navigateTo?.let { onNavigate(it); viewModel.onNavigated() }

View File

@ -44,7 +44,7 @@ import androidx.compose.material3.TopAppBar
import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
@ -120,7 +120,7 @@ fun EditProfileContent(
snackbar: SnackbarHostState? = null, snackbar: SnackbarHostState? = null,
viewModel: EditProfileViewModel = hiltViewModel() viewModel: EditProfileViewModel = hiltViewModel()
) { ) {
val state by viewModel.uiState.collectAsState() val state by viewModel.uiState.collectAsStateWithLifecycle()
val focusManager = LocalFocusManager.current val focusManager = LocalFocusManager.current
val context = LocalContext.current val context = LocalContext.current
val localSnackbar = remember { SnackbarHostState() } val localSnackbar = remember { SnackbarHostState() }

View File

@ -43,7 +43,7 @@ import androidx.compose.material3.Text
import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBar
import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
@ -208,7 +208,7 @@ fun NotificationSettingsScreen(
onNavigate: (String) -> Unit = {}, onNavigate: (String) -> Unit = {},
viewModel: NotificationSettingsViewModel = hiltViewModel() viewModel: NotificationSettingsViewModel = hiltViewModel()
) { ) {
val state by viewModel.uiState.collectAsState() val state by viewModel.uiState.collectAsStateWithLifecycle()
Scaffold( Scaffold(
containerColor = Color.Transparent, containerColor = Color.Transparent,

View File

@ -42,7 +42,7 @@ import androidx.compose.material3.TopAppBar
import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
import androidx.compose.ui.graphics.Color import androidx.compose.ui.graphics.Color
@ -95,7 +95,7 @@ fun RelationshipSettingsScreen(
onNavigate: (String) -> Unit = {}, onNavigate: (String) -> Unit = {},
viewModel: RelationshipSettingsViewModel = hiltViewModel() viewModel: RelationshipSettingsViewModel = hiltViewModel()
) { ) {
val state by viewModel.uiState.collectAsState() val state by viewModel.uiState.collectAsStateWithLifecycle()
LaunchedEffect(state.navigateTo) { LaunchedEffect(state.navigateTo) {
state.navigateTo?.let { onNavigate(it); viewModel.onNavigated() } state.navigateTo?.let { onNavigate(it); viewModel.onNavigated() }

View File

@ -33,7 +33,7 @@ import androidx.compose.material3.Switch
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.material3.TextButton import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
@ -142,7 +142,7 @@ fun SecurityScreen(
onNavigate: (String) -> Unit = {}, onNavigate: (String) -> Unit = {},
viewModel: SecurityViewModel = hiltViewModel() viewModel: SecurityViewModel = hiltViewModel()
) { ) {
val state by viewModel.uiState.collectAsState() val state by viewModel.uiState.collectAsStateWithLifecycle()
val context = LocalContext.current val context = LocalContext.current
fun launchBiometricForPhrase() { fun launchBiometricForPhrase() {

View File

@ -42,7 +42,7 @@ import androidx.compose.material3.TopAppBar
import androidx.compose.material3.TopAppBarDefaults import androidx.compose.material3.TopAppBarDefaults
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
@ -194,7 +194,7 @@ fun SettingsScreen(
onNavigate: (String) -> Unit = {}, onNavigate: (String) -> Unit = {},
viewModel: SettingsViewModel = hiltViewModel() viewModel: SettingsViewModel = hiltViewModel()
) { ) {
val state by viewModel.uiState.collectAsState() val state by viewModel.uiState.collectAsStateWithLifecycle()
val snackbar = remember { SnackbarHostState() } val snackbar = remember { SnackbarHostState() }
LaunchedEffect(state.navigateTo) { LaunchedEffect(state.navigateTo) {
state.navigateTo?.let { onNavigate(it); viewModel.onNavigated() } state.navigateTo?.let { onNavigate(it); viewModel.onNavigated() }

View File

@ -29,7 +29,7 @@ import androidx.compose.material3.Text
import androidx.compose.material3.TextButton import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
@ -142,7 +142,7 @@ fun SubscriptionScreen(
onNavigate: (String) -> Unit = {}, onNavigate: (String) -> Unit = {},
viewModel: SubscriptionViewModel = hiltViewModel() viewModel: SubscriptionViewModel = hiltViewModel()
) { ) {
val state by viewModel.uiState.collectAsState() val state by viewModel.uiState.collectAsStateWithLifecycle()
val snackbar = remember { SnackbarHostState() } val snackbar = remember { SnackbarHostState() }
val context = LocalContext.current val context = LocalContext.current

View File

@ -45,7 +45,7 @@ import androidx.compose.material3.Text
import androidx.compose.material3.TextButton import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
@ -457,7 +457,7 @@ fun ThisOrThatScreen(
onNavigate: (String) -> Unit = {}, onNavigate: (String) -> Unit = {},
viewModel: ThisOrThatViewModel = hiltViewModel() viewModel: ThisOrThatViewModel = hiltViewModel()
) { ) {
val state by viewModel.uiState.collectAsState() val state by viewModel.uiState.collectAsStateWithLifecycle()
LaunchedEffect(state.navigateTo) { LaunchedEffect(state.navigateTo) {
state.navigateTo?.let { state.navigateTo?.let {
@ -1370,7 +1370,7 @@ fun ThisOrThatReplayScreen(
onNavigate: (String) -> Unit = {}, onNavigate: (String) -> Unit = {},
viewModel: ThisOrThatReplayViewModel = hiltViewModel() viewModel: ThisOrThatReplayViewModel = hiltViewModel()
) { ) {
val state by viewModel.uiState.collectAsState() val state by viewModel.uiState.collectAsStateWithLifecycle()
val phase = state.phase val phase = state.phase
Box( Box(
modifier = Modifier modifier = Modifier

View File

@ -26,7 +26,7 @@ import androidx.compose.material3.Surface
import androidx.compose.material3.Text import androidx.compose.material3.Text
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
@ -48,7 +48,7 @@ fun CategoryPickerScreen(
onNavigate: (String) -> Unit = {}, onNavigate: (String) -> Unit = {},
viewModel: CategoryPickerViewModel = hiltViewModel() viewModel: CategoryPickerViewModel = hiltViewModel()
) { ) {
val state by viewModel.uiState.collectAsState() val state by viewModel.uiState.collectAsStateWithLifecycle()
LaunchedEffect(state.navigateTo) { LaunchedEffect(state.navigateTo) {
state.navigateTo?.let { state.navigateTo?.let {

View File

@ -39,7 +39,7 @@ import androidx.compose.material3.Text
import androidx.compose.material3.TextButton import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableFloatStateOf import androidx.compose.runtime.mutableFloatStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
@ -71,7 +71,7 @@ fun SpinWheelScreen(
onBack: () -> Unit = {}, onBack: () -> Unit = {},
viewModel: SpinWheelViewModel = hiltViewModel() viewModel: SpinWheelViewModel = hiltViewModel()
) { ) {
val state by viewModel.uiState.collectAsState() val state by viewModel.uiState.collectAsStateWithLifecycle()
LaunchedEffect(state.navigateTo) { LaunchedEffect(state.navigateTo) {
state.navigateTo?.let { state.navigateTo?.let {

View File

@ -36,7 +36,7 @@ import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.remember import androidx.compose.runtime.remember
import androidx.compose.runtime.setValue import androidx.compose.runtime.setValue
import app.closer.ui.components.CelebrationOverlay import app.closer.ui.components.CelebrationOverlay
import androidx.compose.runtime.collectAsState import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
@ -209,7 +209,7 @@ fun WheelCompleteScreen(
onNavigate: (String) -> Unit = {}, onNavigate: (String) -> Unit = {},
viewModel: WheelCompleteViewModel = hiltViewModel() viewModel: WheelCompleteViewModel = hiltViewModel()
) { ) {
val state by viewModel.uiState.collectAsState() val state by viewModel.uiState.collectAsStateWithLifecycle()
LaunchedEffect(state.navigateTo) { LaunchedEffect(state.navigateTo) {
state.navigateTo?.let { state.navigateTo?.let {

View File

@ -32,7 +32,7 @@ import androidx.compose.material3.Text
import androidx.compose.material3.TextButton import androidx.compose.material3.TextButton
import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBar
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
@ -62,7 +62,7 @@ fun GameHistoryScreen(
onNavigate: (String) -> Unit = {}, onNavigate: (String) -> Unit = {},
viewModel: GameHistoryViewModel = hiltViewModel() viewModel: GameHistoryViewModel = hiltViewModel()
) { ) {
val state by viewModel.uiState.collectAsState() val state by viewModel.uiState.collectAsStateWithLifecycle()
Scaffold( Scaffold(
topBar = { topBar = {

View File

@ -42,7 +42,7 @@ import androidx.compose.material3.Text
import androidx.compose.material3.TextButton import androidx.compose.material3.TextButton
import androidx.compose.runtime.Composable import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.collectAsState import androidx.lifecycle.compose.collectAsStateWithLifecycle
import androidx.compose.runtime.getValue import androidx.compose.runtime.getValue
import androidx.compose.ui.Alignment import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier import androidx.compose.ui.Modifier
@ -70,7 +70,7 @@ fun WheelSessionScreen(
onNavigate: (String) -> Unit = {}, onNavigate: (String) -> Unit = {},
viewModel: WheelSessionViewModel = hiltViewModel() viewModel: WheelSessionViewModel = hiltViewModel()
) { ) {
val state by viewModel.uiState.collectAsState() val state by viewModel.uiState.collectAsStateWithLifecycle()
LaunchedEffect(state.navigateTo) { LaunchedEffect(state.navigateTo) {
state.navigateTo?.let { state.navigateTo?.let {