diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 80ef6da1..4b82c5df 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -169,6 +169,8 @@ dependencies { // ViewModel 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 implementation(platform("com.google.firebase:firebase-bom:33.8.0")) diff --git a/app/src/main/java/app/closer/MainActivity.kt b/app/src/main/java/app/closer/MainActivity.kt index 9818cdd3..9ebcfb04 100644 --- a/app/src/main/java/app/closer/MainActivity.kt +++ b/app/src/main/java/app/closer/MainActivity.kt @@ -18,7 +18,7 @@ import androidx.compose.runtime.Composable import androidx.compose.runtime.DisposableEffect import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.SideEffect -import androidx.compose.runtime.collectAsState +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember @@ -120,7 +120,7 @@ class MainActivity : AppCompatActivity() { val initialSettings = runBlocking { settingsRepository.settings.first() } AppCompatDelegate.setDefaultNightMode(nightModeFor(initialSettings.themeMode)) setContent { - val settings by settingsRepository.settings.collectAsState(initial = initialSettings) + val settings by settingsRepository.settings.collectAsStateWithLifecycle(initialValue = initialSettings) val systemInDarkTheme = isSystemInDarkTheme() val useDarkTheme = when (settings.themeMode) { ThemeMode.DEVICE -> systemInDarkTheme diff --git a/app/src/main/java/app/closer/ui/activity/ActivityScreen.kt b/app/src/main/java/app/closer/ui/activity/ActivityScreen.kt index 80e3102c..17c80a82 100644 --- a/app/src/main/java/app/closer/ui/activity/ActivityScreen.kt +++ b/app/src/main/java/app/closer/ui/activity/ActivityScreen.kt @@ -16,7 +16,7 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.collectAsState +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -83,7 +83,7 @@ fun ActivityScreen( onNavigate: (String) -> Unit = {}, viewModel: ActivityViewModel = hiltViewModel() ) { - val state by viewModel.uiState.collectAsState() + val state by viewModel.uiState.collectAsStateWithLifecycle() SettingsSubpage(title = "Together", onBack = { onNavigate("back") }) { padding -> if (state.isLoading) { diff --git a/app/src/main/java/app/closer/ui/answers/AnswerHistoryScreen.kt b/app/src/main/java/app/closer/ui/answers/AnswerHistoryScreen.kt index 992736e3..91e1a334 100644 --- a/app/src/main/java/app/closer/ui/answers/AnswerHistoryScreen.kt +++ b/app/src/main/java/app/closer/ui/answers/AnswerHistoryScreen.kt @@ -35,7 +35,7 @@ import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable -import androidx.compose.runtime.collectAsState +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember @@ -67,7 +67,7 @@ fun AnswerHistoryScreen( onNavigate: (String) -> Unit = {}, viewModel: AnswerHistoryViewModel = hiltViewModel() ) { - val state by viewModel.uiState.collectAsState() + val state by viewModel.uiState.collectAsStateWithLifecycle() AnswerHistoryContent( state = state, diff --git a/app/src/main/java/app/closer/ui/answers/AnswerRevealScreen.kt b/app/src/main/java/app/closer/ui/answers/AnswerRevealScreen.kt index 5233249d..23ea3f9d 100644 --- a/app/src/main/java/app/closer/ui/answers/AnswerRevealScreen.kt +++ b/app/src/main/java/app/closer/ui/answers/AnswerRevealScreen.kt @@ -42,7 +42,7 @@ import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.collectAsState +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember @@ -73,7 +73,7 @@ fun AnswerRevealScreen( onNavigate: (String) -> Unit = {}, viewModel: AnswerRevealViewModel = hiltViewModel() ) { - val state by viewModel.uiState.collectAsState() + val state by viewModel.uiState.collectAsStateWithLifecycle() LaunchedEffect(state.isLoading, state.coupleId) { if (!state.isLoading && state.coupleId == null) { diff --git a/app/src/main/java/app/closer/ui/auth/ForgotPasswordScreen.kt b/app/src/main/java/app/closer/ui/auth/ForgotPasswordScreen.kt index 3c3e36fc..ae92921f 100644 --- a/app/src/main/java/app/closer/ui/auth/ForgotPasswordScreen.kt +++ b/app/src/main/java/app/closer/ui/auth/ForgotPasswordScreen.kt @@ -33,7 +33,7 @@ import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBarDefaults import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.collectAsState +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.Alignment @@ -55,7 +55,7 @@ fun ForgotPasswordScreen( onNavigate: (String) -> Unit = {}, viewModel: ForgotPasswordViewModel = hiltViewModel() ) { - val state by viewModel.uiState.collectAsState() + val state by viewModel.uiState.collectAsStateWithLifecycle() val snackbar = remember { SnackbarHostState() } val focusManager = LocalFocusManager.current diff --git a/app/src/main/java/app/closer/ui/auth/LoginScreen.kt b/app/src/main/java/app/closer/ui/auth/LoginScreen.kt index bd2af30f..73cd861d 100644 --- a/app/src/main/java/app/closer/ui/auth/LoginScreen.kt +++ b/app/src/main/java/app/closer/ui/auth/LoginScreen.kt @@ -36,7 +36,7 @@ import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.collectAsState +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope @@ -64,7 +64,7 @@ fun LoginScreen( onNavigate: (String) -> Unit = {}, viewModel: LoginViewModel = hiltViewModel() ) { - val state by viewModel.uiState.collectAsState() + val state by viewModel.uiState.collectAsStateWithLifecycle() val snackbar = remember { SnackbarHostState() } val focusManager = LocalFocusManager.current val context = LocalContext.current diff --git a/app/src/main/java/app/closer/ui/auth/SignUpScreen.kt b/app/src/main/java/app/closer/ui/auth/SignUpScreen.kt index 28e59847..fe7e74b5 100644 --- a/app/src/main/java/app/closer/ui/auth/SignUpScreen.kt +++ b/app/src/main/java/app/closer/ui/auth/SignUpScreen.kt @@ -44,7 +44,7 @@ import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBarDefaults import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.collectAsState +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope @@ -71,7 +71,7 @@ fun SignUpScreen( onNavigate: (String) -> Unit = {}, viewModel: SignUpViewModel = hiltViewModel() ) { - val state by viewModel.uiState.collectAsState() + val state by viewModel.uiState.collectAsStateWithLifecycle() val snackbar = remember { SnackbarHostState() } val focusManager = LocalFocusManager.current val context = LocalContext.current diff --git a/app/src/main/java/app/closer/ui/challenges/ConnectionChallengesScreen.kt b/app/src/main/java/app/closer/ui/challenges/ConnectionChallengesScreen.kt index 078a3203..4286b250 100644 --- a/app/src/main/java/app/closer/ui/challenges/ConnectionChallengesScreen.kt +++ b/app/src/main/java/app/closer/ui/challenges/ConnectionChallengesScreen.kt @@ -41,7 +41,7 @@ import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.collectAsState +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.Alignment @@ -270,7 +270,7 @@ fun ConnectionChallengesScreen( onNavigate: (String) -> Unit = {}, viewModel: ConnectionChallengesViewModel = hiltViewModel() ) { - val state by viewModel.uiState.collectAsState() + val state by viewModel.uiState.collectAsStateWithLifecycle() val snackbarHostState = remember { SnackbarHostState() } LaunchedEffect(state.navigateTo) { diff --git a/app/src/main/java/app/closer/ui/components/GamePromptBanner.kt b/app/src/main/java/app/closer/ui/components/GamePromptBanner.kt index 202454d8..368a94b1 100644 --- a/app/src/main/java/app/closer/ui/components/GamePromptBanner.kt +++ b/app/src/main/java/app/closer/ui/components/GamePromptBanner.kt @@ -36,7 +36,7 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.collectAsState +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember @@ -89,7 +89,7 @@ fun GamePromptBanner( onAction: (kind: GamePromptKind, gameType: String, gameSessionId: String?) -> Unit, viewModel: GamePromptViewModel = hiltViewModel() ) { - val prompt by viewModel.prompt.collectAsState() + val prompt by viewModel.prompt.collectAsStateWithLifecycle() val haptics = LocalHapticFeedback.current // Retain the last prompt so the slide-out animation still has data to render. diff --git a/app/src/main/java/app/closer/ui/components/MessageBubbleOverlay.kt b/app/src/main/java/app/closer/ui/components/MessageBubbleOverlay.kt index ab4bc844..c109aeb9 100644 --- a/app/src/main/java/app/closer/ui/components/MessageBubbleOverlay.kt +++ b/app/src/main/java/app/closer/ui/components/MessageBubbleOverlay.kt @@ -16,7 +16,7 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable 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.platform.LocalHapticFeedback import androidx.compose.runtime.getValue @@ -62,7 +62,7 @@ fun MessageBubbleOverlay( onOpen: (coupleId: String, conversationId: String) -> Unit, viewModel: MessageBubbleViewModel = hiltViewModel() ) { - val bubble by viewModel.bubble.collectAsState() + val bubble by viewModel.bubble.collectAsStateWithLifecycle() val current = bubble ?: return // A soft haptic when a new chat-head arrives (parity with the game banner's "felt" arrival). diff --git a/app/src/main/java/app/closer/ui/components/PremiumUnlockOverlay.kt b/app/src/main/java/app/closer/ui/components/PremiumUnlockOverlay.kt index e5aa21ff..7b92544f 100644 --- a/app/src/main/java/app/closer/ui/components/PremiumUnlockOverlay.kt +++ b/app/src/main/java/app/closer/ui/components/PremiumUnlockOverlay.kt @@ -13,7 +13,7 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.collectAsState +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -84,7 +84,7 @@ class PremiumUnlockViewModel @Inject constructor( fun PremiumUnlockOverlay( viewModel: PremiumUnlockViewModel = hiltViewModel() ) { - val visible by viewModel.visible.collectAsState() + val visible by viewModel.visible.collectAsStateWithLifecycle() if (!visible) return PremiumUnlockModal(onDismiss = viewModel::dismiss) } diff --git a/app/src/main/java/app/closer/ui/dates/BucketListScreen.kt b/app/src/main/java/app/closer/ui/dates/BucketListScreen.kt index 53a47edb..2c921b60 100644 --- a/app/src/main/java/app/closer/ui/dates/BucketListScreen.kt +++ b/app/src/main/java/app/closer/ui/dates/BucketListScreen.kt @@ -38,7 +38,7 @@ import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.ui.graphics.vector.ImageVector import androidx.compose.runtime.Composable -import androidx.compose.runtime.collectAsState +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember @@ -60,7 +60,7 @@ fun BucketListScreen( onNavigate: (String) -> Unit = {}, viewModel: BucketListViewModel = hiltViewModel() ) { - val state by viewModel.uiState.collectAsState() + val state by viewModel.uiState.collectAsStateWithLifecycle() BucketListContent( state = state, diff --git a/app/src/main/java/app/closer/ui/dates/DateBuilderScreen.kt b/app/src/main/java/app/closer/ui/dates/DateBuilderScreen.kt index 8af979b4..79fcac63 100644 --- a/app/src/main/java/app/closer/ui/dates/DateBuilderScreen.kt +++ b/app/src/main/java/app/closer/ui/dates/DateBuilderScreen.kt @@ -43,7 +43,7 @@ import androidx.compose.material3.rememberDatePickerState import androidx.compose.material3.rememberTimePickerState import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.collectAsState +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableIntStateOf import androidx.compose.runtime.mutableStateOf @@ -65,7 +65,7 @@ fun DateBuilderScreen( onNavigate: (String) -> Unit = {}, viewModel: DateBuilderViewModel = hiltViewModel() ) { - val state by viewModel.uiState.collectAsState() + val state by viewModel.uiState.collectAsStateWithLifecycle() val snackbarHostState = remember { SnackbarHostState() } LaunchedEffect(state.saved) { diff --git a/app/src/main/java/app/closer/ui/dates/DateMatchScreen.kt b/app/src/main/java/app/closer/ui/dates/DateMatchScreen.kt index c18ff9f9..c2500583 100644 --- a/app/src/main/java/app/closer/ui/dates/DateMatchScreen.kt +++ b/app/src/main/java/app/closer/ui/dates/DateMatchScreen.kt @@ -39,7 +39,7 @@ import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.collectAsState +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableFloatStateOf import androidx.compose.runtime.remember @@ -75,7 +75,7 @@ fun DateMatchScreen( onNavigate: (String) -> Unit = {}, 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). LaunchedEffect(Unit) { diff --git a/app/src/main/java/app/closer/ui/dates/DateMatchesScreen.kt b/app/src/main/java/app/closer/ui/dates/DateMatchesScreen.kt index f52437e0..a8bb597f 100644 --- a/app/src/main/java/app/closer/ui/dates/DateMatchesScreen.kt +++ b/app/src/main/java/app/closer/ui/dates/DateMatchesScreen.kt @@ -32,7 +32,7 @@ import androidx.compose.runtime.Composable import androidx.compose.foundation.clickable import androidx.compose.material3.TextButton import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.collectAsState +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -63,7 +63,7 @@ fun DateMatchesScreen( onNavigate: (String) -> Unit = {}, viewModel: DateMatchesViewModel = hiltViewModel() ) { - val state by viewModel.uiState.collectAsState() + val state by viewModel.uiState.collectAsStateWithLifecycle() // After marking a date done, open its reflection. LaunchedEffect(Unit) { diff --git a/app/src/main/java/app/closer/ui/dates/DateMemoriesScreen.kt b/app/src/main/java/app/closer/ui/dates/DateMemoriesScreen.kt index 13f3fc5e..d1abbc4f 100644 --- a/app/src/main/java/app/closer/ui/dates/DateMemoriesScreen.kt +++ b/app/src/main/java/app/closer/ui/dates/DateMemoriesScreen.kt @@ -19,7 +19,7 @@ import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable -import androidx.compose.runtime.collectAsState +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember @@ -136,7 +136,7 @@ fun DateMemoriesScreen( onNavigate: (String) -> Unit = {}, viewModel: DateMemoriesViewModel = hiltViewModel() ) { - val state by viewModel.uiState.collectAsState() + val state by viewModel.uiState.collectAsStateWithLifecycle() var pendingDelete by remember { mutableStateOf(null) } SettingsSubpage(title = "Date memories", onBack = { onNavigate("back") }) { padding -> diff --git a/app/src/main/java/app/closer/ui/dates/DateReflectionScreen.kt b/app/src/main/java/app/closer/ui/dates/DateReflectionScreen.kt index 7474233e..09b9f08c 100644 --- a/app/src/main/java/app/closer/ui/dates/DateReflectionScreen.kt +++ b/app/src/main/java/app/closer/ui/dates/DateReflectionScreen.kt @@ -18,7 +18,7 @@ import androidx.compose.material3.OutlinedButton import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.collectAsState +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -259,7 +259,7 @@ fun DateReflectionScreen( onNavigate: (String) -> Unit = {}, viewModel: DateReflectionViewModel = hiltViewModel() ) { - val state by viewModel.uiState.collectAsState() + val state by viewModel.uiState.collectAsStateWithLifecycle() SettingsSubpage(title = "Date reflection", onBack = { onNavigate("back") }) { padding -> when (state.phase) { ReflectionPhase.LOADING -> Box(Modifier.fillMaxSize().padding(padding), Alignment.Center) { CloserHeartLoader() } diff --git a/app/src/main/java/app/closer/ui/desiresync/DesireSyncScreen.kt b/app/src/main/java/app/closer/ui/desiresync/DesireSyncScreen.kt index fbdd51a7..fc6580dd 100644 --- a/app/src/main/java/app/closer/ui/desiresync/DesireSyncScreen.kt +++ b/app/src/main/java/app/closer/ui/desiresync/DesireSyncScreen.kt @@ -41,7 +41,7 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import app.closer.ui.components.CelebrationOverlay -import androidx.compose.runtime.collectAsState +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -406,7 +406,7 @@ fun DesireSyncScreen( onNavigate: (String) -> Unit = {}, viewModel: DesireSyncViewModel = hiltViewModel() ) { - val state by viewModel.uiState.collectAsState() + val state by viewModel.uiState.collectAsStateWithLifecycle() LaunchedEffect(state.navigateTo) { state.navigateTo?.let { @@ -1089,7 +1089,7 @@ fun DSReplayScreen( onNavigate: (String) -> Unit = {}, viewModel: DSReplayViewModel = hiltViewModel() ) { - val state by viewModel.uiState.collectAsState() + val state by viewModel.uiState.collectAsStateWithLifecycle() val phase = state.phase Box( modifier = Modifier diff --git a/app/src/main/java/app/closer/ui/games/WaitingForPartnerScreen.kt b/app/src/main/java/app/closer/ui/games/WaitingForPartnerScreen.kt index e7802368..b6307d1a 100644 --- a/app/src/main/java/app/closer/ui/games/WaitingForPartnerScreen.kt +++ b/app/src/main/java/app/closer/ui/games/WaitingForPartnerScreen.kt @@ -24,7 +24,7 @@ import androidx.compose.ui.res.vectorResource import app.closer.R import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.collectAsState +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -123,7 +123,7 @@ fun WaitingForPartnerScreen( onNavigate: (String) -> Unit = {}, viewModel: WaitingForPartnerViewModel = hiltViewModel() ) { - val state by viewModel.uiState.collectAsState() + val state by viewModel.uiState.collectAsStateWithLifecycle() LaunchedEffect(state.navigateTo) { state.navigateTo?.let { diff --git a/app/src/main/java/app/closer/ui/home/HomeScreen.kt b/app/src/main/java/app/closer/ui/home/HomeScreen.kt index c88d9ab5..3aeb85dc 100644 --- a/app/src/main/java/app/closer/ui/home/HomeScreen.kt +++ b/app/src/main/java/app/closer/ui/home/HomeScreen.kt @@ -60,7 +60,7 @@ import androidx.compose.material3.rememberModalBottomSheetState import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.collectAsState +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember @@ -93,7 +93,7 @@ fun HomeScreen( onNavigate: (String) -> Unit = {}, viewModel: HomeViewModel = hiltViewModel() ) { - val state by viewModel.uiState.collectAsState() + val state by viewModel.uiState.collectAsStateWithLifecycle() val snackbarHostState = remember { SnackbarHostState() } LaunchedEffect(state.partnerLeftEvent, state.partnerName) { diff --git a/app/src/main/java/app/closer/ui/home/PartnerHomeScreen.kt b/app/src/main/java/app/closer/ui/home/PartnerHomeScreen.kt index 3219afc5..8503ac6b 100644 --- a/app/src/main/java/app/closer/ui/home/PartnerHomeScreen.kt +++ b/app/src/main/java/app/closer/ui/home/PartnerHomeScreen.kt @@ -33,7 +33,7 @@ import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBarDefaults import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.collectAsState +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.Alignment @@ -199,7 +199,7 @@ fun PartnerHomeScreen( onNavigate: (String) -> Unit = {}, viewModel: PartnerHomeViewModel = hiltViewModel() ) { - val state by viewModel.uiState.collectAsState() + val state by viewModel.uiState.collectAsStateWithLifecycle() val snackbar = remember { SnackbarHostState() } LaunchedEffect(state.reminderSentEvent) { diff --git a/app/src/main/java/app/closer/ui/howwell/HowWellScreen.kt b/app/src/main/java/app/closer/ui/howwell/HowWellScreen.kt index da7df95f..91795fc6 100644 --- a/app/src/main/java/app/closer/ui/howwell/HowWellScreen.kt +++ b/app/src/main/java/app/closer/ui/howwell/HowWellScreen.kt @@ -41,7 +41,7 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import app.closer.ui.components.CelebrationOverlay -import androidx.compose.runtime.collectAsState +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -447,7 +447,7 @@ fun HowWellScreen( onNavigate: (String) -> Unit = {}, viewModel: HowWellViewModel = hiltViewModel() ) { - val state by viewModel.uiState.collectAsState() + val state by viewModel.uiState.collectAsStateWithLifecycle() LaunchedEffect(state.navigateTo) { state.navigateTo?.let { @@ -1259,7 +1259,7 @@ fun HowWellReplayScreen( onNavigate: (String) -> Unit = {}, viewModel: HowWellReplayViewModel = hiltViewModel() ) { - val state by viewModel.uiState.collectAsState() + val state by viewModel.uiState.collectAsStateWithLifecycle() val phase = state.phase Box( modifier = Modifier diff --git a/app/src/main/java/app/closer/ui/memorylane/MemoryLaneScreen.kt b/app/src/main/java/app/closer/ui/memorylane/MemoryLaneScreen.kt index b4420396..84d1b56b 100644 --- a/app/src/main/java/app/closer/ui/memorylane/MemoryLaneScreen.kt +++ b/app/src/main/java/app/closer/ui/memorylane/MemoryLaneScreen.kt @@ -51,7 +51,7 @@ import androidx.compose.material3.TextButton import androidx.compose.material3.rememberDatePickerState import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.collectAsState +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember @@ -328,7 +328,7 @@ fun MemoryLaneScreen( startingCapsuleId: String? = null, viewModel: MemoryLaneViewModel = hiltViewModel() ) { - val state by viewModel.uiState.collectAsState() + val state by viewModel.uiState.collectAsStateWithLifecycle() val snackbarHostState = remember { SnackbarHostState() } // Deep-link: open a specific capsule once the list is loaded. The flag prevents diff --git a/app/src/main/java/app/closer/ui/messages/ConversationScreen.kt b/app/src/main/java/app/closer/ui/messages/ConversationScreen.kt index 4771ef63..940feb52 100644 --- a/app/src/main/java/app/closer/ui/messages/ConversationScreen.kt +++ b/app/src/main/java/app/closer/ui/messages/ConversationScreen.kt @@ -30,7 +30,7 @@ import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBarDefaults import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.collectAsState +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.compose.runtime.derivedStateOf import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf @@ -60,7 +60,7 @@ fun ConversationScreen( onNavigate: (String) -> Unit = {}, viewModel: ConversationViewModel = hiltViewModel() ) { - val state by viewModel.uiState.collectAsState() + val state by viewModel.uiState.collectAsStateWithLifecycle() val listState = rememberLazyListState() val snackbarHostState = remember { SnackbarHostState() } diff --git a/app/src/main/java/app/closer/ui/messages/MessagesInboxScreen.kt b/app/src/main/java/app/closer/ui/messages/MessagesInboxScreen.kt index ed68049d..612be179 100644 --- a/app/src/main/java/app/closer/ui/messages/MessagesInboxScreen.kt +++ b/app/src/main/java/app/closer/ui/messages/MessagesInboxScreen.kt @@ -19,7 +19,7 @@ import androidx.compose.material3.Icon import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.collectAsState +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -42,7 +42,7 @@ fun MessagesInboxScreen( onNavigate: (String) -> Unit = {}, viewModel: MessagesInboxViewModel = hiltViewModel() ) { - val state by viewModel.uiState.collectAsState() + val state by viewModel.uiState.collectAsStateWithLifecycle() Column( modifier = Modifier diff --git a/app/src/main/java/app/closer/ui/onboarding/CreateProfileScreen.kt b/app/src/main/java/app/closer/ui/onboarding/CreateProfileScreen.kt index f509f851..a1a74d2b 100644 --- a/app/src/main/java/app/closer/ui/onboarding/CreateProfileScreen.kt +++ b/app/src/main/java/app/closer/ui/onboarding/CreateProfileScreen.kt @@ -46,7 +46,7 @@ import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBarDefaults import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.collectAsState +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope @@ -84,7 +84,7 @@ fun CreateProfileScreen( onNavigate: (String) -> Unit = {}, viewModel: CreateProfileViewModel = hiltViewModel() ) { - val state by viewModel.uiState.collectAsState() + val state by viewModel.uiState.collectAsStateWithLifecycle() val snackbar = remember { SnackbarHostState() } val focusManager = LocalFocusManager.current val context = LocalContext.current diff --git a/app/src/main/java/app/closer/ui/onboarding/OnboardingScreen.kt b/app/src/main/java/app/closer/ui/onboarding/OnboardingScreen.kt index 32b170b1..2d862e3f 100644 --- a/app/src/main/java/app/closer/ui/onboarding/OnboardingScreen.kt +++ b/app/src/main/java/app/closer/ui/onboarding/OnboardingScreen.kt @@ -30,7 +30,7 @@ import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.collectAsState +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.compose.runtime.getValue import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Alignment @@ -65,7 +65,7 @@ fun OnboardingScreen( onNavigate: (String) -> Unit = {}, viewModel: OnboardingViewModel = hiltViewModel() ) { - val state by viewModel.uiState.collectAsState() + val state by viewModel.uiState.collectAsStateWithLifecycle() LaunchedEffect(state.navigateTo) { state.navigateTo?.let { dest -> diff --git a/app/src/main/java/app/closer/ui/outcomes/YourProgressScreen.kt b/app/src/main/java/app/closer/ui/outcomes/YourProgressScreen.kt index f44721d9..affdfe80 100644 --- a/app/src/main/java/app/closer/ui/outcomes/YourProgressScreen.kt +++ b/app/src/main/java/app/closer/ui/outcomes/YourProgressScreen.kt @@ -28,7 +28,7 @@ import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBarDefaults import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.collectAsState +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -54,7 +54,7 @@ fun YourProgressScreen( onBack: () -> Unit, viewModel: YourProgressViewModel = hiltViewModel() ) { - val state by viewModel.uiState.collectAsState() + val state by viewModel.uiState.collectAsStateWithLifecycle() LaunchedEffect(Unit) { viewModel.load() } diff --git a/app/src/main/java/app/closer/ui/pairing/AcceptInviteScreen.kt b/app/src/main/java/app/closer/ui/pairing/AcceptInviteScreen.kt index 5f0ba3b9..0b79f6f9 100644 --- a/app/src/main/java/app/closer/ui/pairing/AcceptInviteScreen.kt +++ b/app/src/main/java/app/closer/ui/pairing/AcceptInviteScreen.kt @@ -38,7 +38,7 @@ import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBarDefaults import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.collectAsState +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.Alignment @@ -76,7 +76,7 @@ fun AcceptInviteScreen( onBack: () -> Unit = {}, viewModel: AcceptInviteViewModel = hiltViewModel() ) { - val state by viewModel.uiState.collectAsState() + val state by viewModel.uiState.collectAsStateWithLifecycle() val snackbar = remember { SnackbarHostState() } val focusManager = LocalFocusManager.current diff --git a/app/src/main/java/app/closer/ui/pairing/CreateInviteScreen.kt b/app/src/main/java/app/closer/ui/pairing/CreateInviteScreen.kt index 9ca8343e..e0d817c6 100644 --- a/app/src/main/java/app/closer/ui/pairing/CreateInviteScreen.kt +++ b/app/src/main/java/app/closer/ui/pairing/CreateInviteScreen.kt @@ -38,7 +38,7 @@ import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBarDefaults import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.collectAsState +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.compose.material3.OutlinedTextField import androidx.compose.material3.OutlinedTextFieldDefaults import androidx.compose.runtime.getValue @@ -74,7 +74,7 @@ fun CreateInviteScreen( onBack: () -> Unit = {}, viewModel: CreateInviteViewModel = hiltViewModel() ) { - val state by viewModel.uiState.collectAsState() + val state by viewModel.uiState.collectAsStateWithLifecycle() val snackbar = remember { SnackbarHostState() } val scope = rememberCoroutineScope() val clipboard = LocalClipboardManager.current diff --git a/app/src/main/java/app/closer/ui/pairing/InviteConfirmScreen.kt b/app/src/main/java/app/closer/ui/pairing/InviteConfirmScreen.kt index 175394eb..e6f168e8 100644 --- a/app/src/main/java/app/closer/ui/pairing/InviteConfirmScreen.kt +++ b/app/src/main/java/app/closer/ui/pairing/InviteConfirmScreen.kt @@ -31,7 +31,7 @@ import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBarDefaults import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.collectAsState +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.Alignment @@ -60,7 +60,7 @@ fun InviteConfirmScreen( onBack: () -> Unit = {}, viewModel: InviteConfirmViewModel = hiltViewModel() ) { - val state by viewModel.uiState.collectAsState() + val state by viewModel.uiState.collectAsStateWithLifecycle() val snackbar = remember { SnackbarHostState() } LaunchedEffect(state.navigateTo) { diff --git a/app/src/main/java/app/closer/ui/pairing/PairingSuccessScreen.kt b/app/src/main/java/app/closer/ui/pairing/PairingSuccessScreen.kt index a6fa60da..94cdc996 100644 --- a/app/src/main/java/app/closer/ui/pairing/PairingSuccessScreen.kt +++ b/app/src/main/java/app/closer/ui/pairing/PairingSuccessScreen.kt @@ -36,7 +36,7 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.collectAsState +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember @@ -163,7 +163,7 @@ fun PairingSuccessScreen( onNavigate: (String) -> Unit = {}, viewModel: PairingSuccessViewModel = hiltViewModel() ) { - val state by viewModel.uiState.collectAsState() + val state by viewModel.uiState.collectAsStateWithLifecycle() LaunchedEffect(state.navigateTo) { state.navigateTo?.let { onNavigate(it); viewModel.onNavigated() } diff --git a/app/src/main/java/app/closer/ui/pairing/RecoveryScreen.kt b/app/src/main/java/app/closer/ui/pairing/RecoveryScreen.kt index 27e453e8..eecede8c 100644 --- a/app/src/main/java/app/closer/ui/pairing/RecoveryScreen.kt +++ b/app/src/main/java/app/closer/ui/pairing/RecoveryScreen.kt @@ -28,7 +28,7 @@ import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.collectAsState +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.Alignment @@ -54,7 +54,7 @@ fun RecoveryScreen( onPartnerRestore: () -> Unit = {}, viewModel: RecoveryViewModel = hiltViewModel() ) { - val state by viewModel.uiState.collectAsState() + val state by viewModel.uiState.collectAsStateWithLifecycle() val snackbar = remember { SnackbarHostState() } LaunchedEffect(state.success) { diff --git a/app/src/main/java/app/closer/ui/pairing/RestoreScreens.kt b/app/src/main/java/app/closer/ui/pairing/RestoreScreens.kt index 5766a3d9..b2238be3 100644 --- a/app/src/main/java/app/closer/ui/pairing/RestoreScreens.kt +++ b/app/src/main/java/app/closer/ui/pairing/RestoreScreens.kt @@ -34,7 +34,7 @@ import androidx.compose.material3.SnackbarHostState import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.collectAsState +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.Alignment @@ -65,7 +65,7 @@ fun RestoreRequestScreen( onBack: () -> Unit = {}, viewModel: RestoreViewModel = hiltViewModel() ) { - val state by viewModel.uiState.collectAsState() + val state by viewModel.uiState.collectAsStateWithLifecycle() val snackbar = remember { SnackbarHostState() } LaunchedEffect(state.restoreComplete) { if (state.restoreComplete) onDone() } LaunchedEffect(state.error) { state.error?.let { snackbar.showSnackbar(it); viewModel.dismissError() } } @@ -104,7 +104,7 @@ fun RestoreConsentScreen( onBack: () -> Unit = {}, viewModel: RestoreViewModel = hiltViewModel() ) { - val state by viewModel.uiState.collectAsState() + val state by viewModel.uiState.collectAsStateWithLifecycle() val snackbar = remember { SnackbarHostState() } LaunchedEffect(Unit) { viewModel.observeIncomingRequest() } LaunchedEffect(state.consentComplete) { if (state.consentComplete) onDone() } diff --git a/app/src/main/java/app/closer/ui/paywall/PaywallScreen.kt b/app/src/main/java/app/closer/ui/paywall/PaywallScreen.kt index 735b0e91..1d21b9d5 100644 --- a/app/src/main/java/app/closer/ui/paywall/PaywallScreen.kt +++ b/app/src/main/java/app/closer/ui/paywall/PaywallScreen.kt @@ -39,7 +39,7 @@ import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.collectAsState +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember @@ -83,7 +83,7 @@ fun PaywallScreen( onNavigate: (String) -> Unit = {}, viewModel: PaywallViewModel = hiltViewModel() ) { - val uiState by viewModel.uiState.collectAsState() + val uiState by viewModel.uiState.collectAsStateWithLifecycle() val context = LocalContext.current var showThankYou by remember { mutableStateOf(false) } diff --git a/app/src/main/java/app/closer/ui/play/PlayHubScreen.kt b/app/src/main/java/app/closer/ui/play/PlayHubScreen.kt index 57970b1f..0e801fc2 100644 --- a/app/src/main/java/app/closer/ui/play/PlayHubScreen.kt +++ b/app/src/main/java/app/closer/ui/play/PlayHubScreen.kt @@ -30,7 +30,7 @@ import androidx.compose.ui.res.painterResource import androidx.compose.ui.res.vectorResource import androidx.compose.ui.text.font.FontWeight 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.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp @@ -54,8 +54,8 @@ fun PlayHubScreen( onNavigate: (String) -> Unit = {}, viewModel: PlayHubViewModel = hiltViewModel() ) { - val hasPremium by viewModel.hasPremium.collectAsState() - val isPaired by viewModel.isPaired.collectAsState() + val hasPremium by viewModel.hasPremium.collectAsStateWithLifecycle() + val isPaired by viewModel.isPaired.collectAsStateWithLifecycle() PlayHubContent(onNavigate = onNavigate, hasPremium = hasPremium, isPaired = isPaired) } diff --git a/app/src/main/java/app/closer/ui/questions/DailyQuestionScreen.kt b/app/src/main/java/app/closer/ui/questions/DailyQuestionScreen.kt index 4dcbc739..6215df3f 100644 --- a/app/src/main/java/app/closer/ui/questions/DailyQuestionScreen.kt +++ b/app/src/main/java/app/closer/ui/questions/DailyQuestionScreen.kt @@ -1,7 +1,7 @@ package app.closer.ui.questions import androidx.compose.runtime.Composable -import androidx.compose.runtime.collectAsState +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.compose.runtime.getValue import androidx.compose.ui.tooling.preview.Preview import androidx.hilt.navigation.compose.hiltViewModel @@ -14,7 +14,7 @@ fun DailyQuestionScreen( onBack: () -> Unit = {}, 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 // reveal so users can always navigate back to see both answers (labeled "View reveal"). diff --git a/app/src/main/java/app/closer/ui/questions/QuestionCategoryScreen.kt b/app/src/main/java/app/closer/ui/questions/QuestionCategoryScreen.kt index 2b652150..c4620d16 100644 --- a/app/src/main/java/app/closer/ui/questions/QuestionCategoryScreen.kt +++ b/app/src/main/java/app/closer/ui/questions/QuestionCategoryScreen.kt @@ -34,7 +34,7 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.collectAsState +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.Alignment @@ -61,7 +61,7 @@ fun QuestionCategoryScreen( onNavigate: (String) -> Unit = {}, viewModel: QuestionCategoryViewModel = hiltViewModel() ) { - val state by viewModel.uiState.collectAsState() + val state by viewModel.uiState.collectAsStateWithLifecycle() QuestionCategoryContent( categoryId = categoryId, diff --git a/app/src/main/java/app/closer/ui/questions/QuestionPackLibraryScreen.kt b/app/src/main/java/app/closer/ui/questions/QuestionPackLibraryScreen.kt index 595cad9e..a5e46a89 100644 --- a/app/src/main/java/app/closer/ui/questions/QuestionPackLibraryScreen.kt +++ b/app/src/main/java/app/closer/ui/questions/QuestionPackLibraryScreen.kt @@ -33,7 +33,7 @@ import androidx.compose.material3.MaterialTheme import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.collectAsState +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember @@ -68,7 +68,7 @@ fun QuestionPackLibraryScreen( onNavigate: (String) -> Unit = {}, viewModel: QuestionPackLibraryViewModel = hiltViewModel() ) { - val state by viewModel.uiState.collectAsState() + val state by viewModel.uiState.collectAsStateWithLifecycle() QuestionPackLibraryContent( state = state, diff --git a/app/src/main/java/app/closer/ui/questions/QuestionThreadScreen.kt b/app/src/main/java/app/closer/ui/questions/QuestionThreadScreen.kt index ca5613f2..8e776516 100644 --- a/app/src/main/java/app/closer/ui/questions/QuestionThreadScreen.kt +++ b/app/src/main/java/app/closer/ui/questions/QuestionThreadScreen.kt @@ -29,7 +29,7 @@ import androidx.compose.material3.OutlinedButton import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable -import androidx.compose.runtime.collectAsState +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -58,7 +58,7 @@ fun QuestionThreadScreen( onBack: () -> Unit = {}, viewModel: QuestionThreadViewModel = hiltViewModel() ) { - val state by viewModel.uiState.collectAsState() + val state by viewModel.uiState.collectAsStateWithLifecycle() Box( modifier = Modifier diff --git a/app/src/main/java/app/closer/ui/settings/AccountScreen.kt b/app/src/main/java/app/closer/ui/settings/AccountScreen.kt index ed1510ea..06a6a445 100644 --- a/app/src/main/java/app/closer/ui/settings/AccountScreen.kt +++ b/app/src/main/java/app/closer/ui/settings/AccountScreen.kt @@ -29,7 +29,7 @@ import androidx.compose.material3.Text import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBarDefaults import androidx.compose.runtime.Composable -import androidx.compose.runtime.collectAsState +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope @@ -56,7 +56,7 @@ fun AccountScreen( onNavigate: (String) -> Unit = {}, viewModel: EditProfileViewModel = hiltViewModel() ) { - val state by viewModel.uiState.collectAsState() + val state by viewModel.uiState.collectAsStateWithLifecycle() val snackbar = remember { SnackbarHostState() } val scope = rememberCoroutineScope() val clipboard = LocalClipboardManager.current diff --git a/app/src/main/java/app/closer/ui/settings/AppearanceScreen.kt b/app/src/main/java/app/closer/ui/settings/AppearanceScreen.kt index 5265d87d..78c172a7 100644 --- a/app/src/main/java/app/closer/ui/settings/AppearanceScreen.kt +++ b/app/src/main/java/app/closer/ui/settings/AppearanceScreen.kt @@ -28,7 +28,7 @@ import androidx.compose.material3.Text import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBarDefaults import androidx.compose.runtime.Composable -import androidx.compose.runtime.collectAsState +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -46,7 +46,7 @@ fun AppearanceScreen( onNavigate: (String) -> Unit = {}, viewModel: SettingsViewModel = hiltViewModel() ) { - val state by viewModel.uiState.collectAsState() + val state by viewModel.uiState.collectAsStateWithLifecycle() Scaffold( containerColor = Color.Transparent, diff --git a/app/src/main/java/app/closer/ui/settings/ChangePasswordScreen.kt b/app/src/main/java/app/closer/ui/settings/ChangePasswordScreen.kt index 79161d9b..bf0b13e4 100644 --- a/app/src/main/java/app/closer/ui/settings/ChangePasswordScreen.kt +++ b/app/src/main/java/app/closer/ui/settings/ChangePasswordScreen.kt @@ -26,7 +26,7 @@ import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable -import androidx.compose.runtime.collectAsState +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -131,7 +131,7 @@ fun ChangePasswordScreen( onNavigate: (String) -> Unit = {}, viewModel: ChangePasswordViewModel = hiltViewModel() ) { - val state by viewModel.uiState.collectAsState() + val state by viewModel.uiState.collectAsStateWithLifecycle() SettingsSubpage(title = "Change password", onBack = { onNavigate("back") }) { padding -> Column( diff --git a/app/src/main/java/app/closer/ui/settings/DeleteAccountScreen.kt b/app/src/main/java/app/closer/ui/settings/DeleteAccountScreen.kt index 0a4ed910..eaf73626 100644 --- a/app/src/main/java/app/closer/ui/settings/DeleteAccountScreen.kt +++ b/app/src/main/java/app/closer/ui/settings/DeleteAccountScreen.kt @@ -48,7 +48,7 @@ import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBarDefaults import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.collectAsState +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -153,7 +153,7 @@ fun DeleteAccountScreen( onNavigate: (String) -> Unit = {}, viewModel: DeleteAccountViewModel = hiltViewModel() ) { - val state by viewModel.uiState.collectAsState() + val state by viewModel.uiState.collectAsStateWithLifecycle() LaunchedEffect(state.navigateTo) { state.navigateTo?.let { onNavigate(it); viewModel.onNavigated() } diff --git a/app/src/main/java/app/closer/ui/settings/EditProfileScreen.kt b/app/src/main/java/app/closer/ui/settings/EditProfileScreen.kt index d6c12887..782bff95 100644 --- a/app/src/main/java/app/closer/ui/settings/EditProfileScreen.kt +++ b/app/src/main/java/app/closer/ui/settings/EditProfileScreen.kt @@ -44,7 +44,7 @@ import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBarDefaults import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.collectAsState +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.Alignment @@ -120,7 +120,7 @@ fun EditProfileContent( snackbar: SnackbarHostState? = null, viewModel: EditProfileViewModel = hiltViewModel() ) { - val state by viewModel.uiState.collectAsState() + val state by viewModel.uiState.collectAsStateWithLifecycle() val focusManager = LocalFocusManager.current val context = LocalContext.current val localSnackbar = remember { SnackbarHostState() } diff --git a/app/src/main/java/app/closer/ui/settings/NotificationSettingsScreen.kt b/app/src/main/java/app/closer/ui/settings/NotificationSettingsScreen.kt index 7ec77069..46f58d95 100644 --- a/app/src/main/java/app/closer/ui/settings/NotificationSettingsScreen.kt +++ b/app/src/main/java/app/closer/ui/settings/NotificationSettingsScreen.kt @@ -43,7 +43,7 @@ import androidx.compose.material3.Text import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBarDefaults import androidx.compose.runtime.Composable -import androidx.compose.runtime.collectAsState +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -208,7 +208,7 @@ fun NotificationSettingsScreen( onNavigate: (String) -> Unit = {}, viewModel: NotificationSettingsViewModel = hiltViewModel() ) { - val state by viewModel.uiState.collectAsState() + val state by viewModel.uiState.collectAsStateWithLifecycle() Scaffold( containerColor = Color.Transparent, diff --git a/app/src/main/java/app/closer/ui/settings/RelationshipSettingsScreen.kt b/app/src/main/java/app/closer/ui/settings/RelationshipSettingsScreen.kt index c5898ca2..bacf9fc8 100644 --- a/app/src/main/java/app/closer/ui/settings/RelationshipSettingsScreen.kt +++ b/app/src/main/java/app/closer/ui/settings/RelationshipSettingsScreen.kt @@ -42,7 +42,7 @@ import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBarDefaults import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.collectAsState +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.compose.runtime.getValue import androidx.compose.ui.Modifier import androidx.compose.ui.graphics.Color @@ -95,7 +95,7 @@ fun RelationshipSettingsScreen( onNavigate: (String) -> Unit = {}, viewModel: RelationshipSettingsViewModel = hiltViewModel() ) { - val state by viewModel.uiState.collectAsState() + val state by viewModel.uiState.collectAsStateWithLifecycle() LaunchedEffect(state.navigateTo) { state.navigateTo?.let { onNavigate(it); viewModel.onNavigated() } diff --git a/app/src/main/java/app/closer/ui/settings/SecurityScreen.kt b/app/src/main/java/app/closer/ui/settings/SecurityScreen.kt index cd153b7e..adef62eb 100644 --- a/app/src/main/java/app/closer/ui/settings/SecurityScreen.kt +++ b/app/src/main/java/app/closer/ui/settings/SecurityScreen.kt @@ -33,7 +33,7 @@ import androidx.compose.material3.Switch import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable -import androidx.compose.runtime.collectAsState +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -142,7 +142,7 @@ fun SecurityScreen( onNavigate: (String) -> Unit = {}, viewModel: SecurityViewModel = hiltViewModel() ) { - val state by viewModel.uiState.collectAsState() + val state by viewModel.uiState.collectAsStateWithLifecycle() val context = LocalContext.current fun launchBiometricForPhrase() { diff --git a/app/src/main/java/app/closer/ui/settings/SettingsScreen.kt b/app/src/main/java/app/closer/ui/settings/SettingsScreen.kt index 9594ee46..8ab7f68c 100644 --- a/app/src/main/java/app/closer/ui/settings/SettingsScreen.kt +++ b/app/src/main/java/app/closer/ui/settings/SettingsScreen.kt @@ -42,7 +42,7 @@ import androidx.compose.material3.TopAppBar import androidx.compose.material3.TopAppBarDefaults import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.collectAsState +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember @@ -194,7 +194,7 @@ fun SettingsScreen( onNavigate: (String) -> Unit = {}, viewModel: SettingsViewModel = hiltViewModel() ) { - val state by viewModel.uiState.collectAsState() + val state by viewModel.uiState.collectAsStateWithLifecycle() val snackbar = remember { SnackbarHostState() } LaunchedEffect(state.navigateTo) { state.navigateTo?.let { onNavigate(it); viewModel.onNavigated() } diff --git a/app/src/main/java/app/closer/ui/settings/SubscriptionScreen.kt b/app/src/main/java/app/closer/ui/settings/SubscriptionScreen.kt index 3c82b9e5..1a7691d1 100644 --- a/app/src/main/java/app/closer/ui/settings/SubscriptionScreen.kt +++ b/app/src/main/java/app/closer/ui/settings/SubscriptionScreen.kt @@ -29,7 +29,7 @@ import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.collectAsState +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.Alignment @@ -142,7 +142,7 @@ fun SubscriptionScreen( onNavigate: (String) -> Unit = {}, viewModel: SubscriptionViewModel = hiltViewModel() ) { - val state by viewModel.uiState.collectAsState() + val state by viewModel.uiState.collectAsStateWithLifecycle() val snackbar = remember { SnackbarHostState() } val context = LocalContext.current diff --git a/app/src/main/java/app/closer/ui/thisorthat/ThisOrThatScreen.kt b/app/src/main/java/app/closer/ui/thisorthat/ThisOrThatScreen.kt index ab2fd4de..82e1ae24 100644 --- a/app/src/main/java/app/closer/ui/thisorthat/ThisOrThatScreen.kt +++ b/app/src/main/java/app/closer/ui/thisorthat/ThisOrThatScreen.kt @@ -45,7 +45,7 @@ import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.collectAsState +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember @@ -457,7 +457,7 @@ fun ThisOrThatScreen( onNavigate: (String) -> Unit = {}, viewModel: ThisOrThatViewModel = hiltViewModel() ) { - val state by viewModel.uiState.collectAsState() + val state by viewModel.uiState.collectAsStateWithLifecycle() LaunchedEffect(state.navigateTo) { state.navigateTo?.let { @@ -1370,7 +1370,7 @@ fun ThisOrThatReplayScreen( onNavigate: (String) -> Unit = {}, viewModel: ThisOrThatReplayViewModel = hiltViewModel() ) { - val state by viewModel.uiState.collectAsState() + val state by viewModel.uiState.collectAsStateWithLifecycle() val phase = state.phase Box( modifier = Modifier diff --git a/app/src/main/java/app/closer/ui/wheel/CategoryPickerScreen.kt b/app/src/main/java/app/closer/ui/wheel/CategoryPickerScreen.kt index 0994bfd9..92d4dbba 100644 --- a/app/src/main/java/app/closer/ui/wheel/CategoryPickerScreen.kt +++ b/app/src/main/java/app/closer/ui/wheel/CategoryPickerScreen.kt @@ -26,7 +26,7 @@ import androidx.compose.material3.Surface import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.collectAsState +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -48,7 +48,7 @@ fun CategoryPickerScreen( onNavigate: (String) -> Unit = {}, viewModel: CategoryPickerViewModel = hiltViewModel() ) { - val state by viewModel.uiState.collectAsState() + val state by viewModel.uiState.collectAsStateWithLifecycle() LaunchedEffect(state.navigateTo) { state.navigateTo?.let { diff --git a/app/src/main/java/app/closer/ui/wheel/SpinWheelScreen.kt b/app/src/main/java/app/closer/ui/wheel/SpinWheelScreen.kt index fa756bd6..f7d70157 100644 --- a/app/src/main/java/app/closer/ui/wheel/SpinWheelScreen.kt +++ b/app/src/main/java/app/closer/ui/wheel/SpinWheelScreen.kt @@ -39,7 +39,7 @@ import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.collectAsState +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.compose.runtime.getValue import androidx.compose.runtime.mutableFloatStateOf import androidx.compose.runtime.remember @@ -71,7 +71,7 @@ fun SpinWheelScreen( onBack: () -> Unit = {}, viewModel: SpinWheelViewModel = hiltViewModel() ) { - val state by viewModel.uiState.collectAsState() + val state by viewModel.uiState.collectAsStateWithLifecycle() LaunchedEffect(state.navigateTo) { state.navigateTo?.let { diff --git a/app/src/main/java/app/closer/ui/wheel/WheelCompleteScreen.kt b/app/src/main/java/app/closer/ui/wheel/WheelCompleteScreen.kt index 1c794a60..b7ca1579 100644 --- a/app/src/main/java/app/closer/ui/wheel/WheelCompleteScreen.kt +++ b/app/src/main/java/app/closer/ui/wheel/WheelCompleteScreen.kt @@ -36,7 +36,7 @@ import androidx.compose.runtime.mutableStateOf import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import app.closer.ui.components.CelebrationOverlay -import androidx.compose.runtime.collectAsState +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -209,7 +209,7 @@ fun WheelCompleteScreen( onNavigate: (String) -> Unit = {}, viewModel: WheelCompleteViewModel = hiltViewModel() ) { - val state by viewModel.uiState.collectAsState() + val state by viewModel.uiState.collectAsStateWithLifecycle() LaunchedEffect(state.navigateTo) { state.navigateTo?.let { diff --git a/app/src/main/java/app/closer/ui/wheel/WheelHistoryScreen.kt b/app/src/main/java/app/closer/ui/wheel/WheelHistoryScreen.kt index d8d6cbf5..dfa7b989 100644 --- a/app/src/main/java/app/closer/ui/wheel/WheelHistoryScreen.kt +++ b/app/src/main/java/app/closer/ui/wheel/WheelHistoryScreen.kt @@ -32,7 +32,7 @@ import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.material3.TopAppBar import androidx.compose.runtime.Composable -import androidx.compose.runtime.collectAsState +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -62,7 +62,7 @@ fun GameHistoryScreen( onNavigate: (String) -> Unit = {}, viewModel: GameHistoryViewModel = hiltViewModel() ) { - val state by viewModel.uiState.collectAsState() + val state by viewModel.uiState.collectAsStateWithLifecycle() Scaffold( topBar = { diff --git a/app/src/main/java/app/closer/ui/wheel/WheelSessionScreen.kt b/app/src/main/java/app/closer/ui/wheel/WheelSessionScreen.kt index d4165b2a..6677be4a 100644 --- a/app/src/main/java/app/closer/ui/wheel/WheelSessionScreen.kt +++ b/app/src/main/java/app/closer/ui/wheel/WheelSessionScreen.kt @@ -42,7 +42,7 @@ import androidx.compose.material3.Text import androidx.compose.material3.TextButton import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect -import androidx.compose.runtime.collectAsState +import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.compose.runtime.getValue import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier @@ -70,7 +70,7 @@ fun WheelSessionScreen( onNavigate: (String) -> Unit = {}, viewModel: WheelSessionViewModel = hiltViewModel() ) { - val state by viewModel.uiState.collectAsState() + val state by viewModel.uiState.collectAsStateWithLifecycle() LaunchedEffect(state.navigateTo) { state.navigateTo?.let {