From 6803e30b54e37500f470bfc0c5b47fc9ac2251c6 Mon Sep 17 00:00:00 2001 From: Brandon McAnsh Date: Thu, 25 Jun 2026 15:04:20 -0400 Subject: [PATCH 1/2] chore(chat): return to chat with IME open after sending cash Signed-off-by: Brandon McAnsh --- .../com/flipcash/app/core/chat/ChatStep.kt | 7 +++- .../flipcash/app/messenger/ChatFlowScreen.kt | 40 +++++++++++++------ 2 files changed, 34 insertions(+), 13 deletions(-) diff --git a/apps/flipcash/core/src/main/kotlin/com/flipcash/app/core/chat/ChatStep.kt b/apps/flipcash/core/src/main/kotlin/com/flipcash/app/core/chat/ChatStep.kt index ab86d3645..db9c440d3 100644 --- a/apps/flipcash/core/src/main/kotlin/com/flipcash/app/core/chat/ChatStep.kt +++ b/apps/flipcash/core/src/main/kotlin/com/flipcash/app/core/chat/ChatStep.kt @@ -2,9 +2,14 @@ package com.flipcash.app.core.chat import android.os.Parcelable import com.getcode.navigation.flow.FlowStep +import com.getcode.navigation.results.NavigationRetVal import kotlinx.parcelize.Parcelize import kotlinx.serialization.Serializable +@Parcelize +@Serializable +data object ChatSendResult : Parcelable + @Serializable sealed interface ChatStep : FlowStep, Parcelable { @Parcelize @@ -13,5 +18,5 @@ sealed interface ChatStep : FlowStep, Parcelable { @Parcelize @Serializable - data object AmountEntry : ChatStep + data object AmountEntry : ChatStep, NavigationRetVal } diff --git a/apps/flipcash/features/messenger/src/main/kotlin/com/flipcash/app/messenger/ChatFlowScreen.kt b/apps/flipcash/features/messenger/src/main/kotlin/com/flipcash/app/messenger/ChatFlowScreen.kt index 8c8005d8a..dcd6cf84d 100644 --- a/apps/flipcash/features/messenger/src/main/kotlin/com/flipcash/app/messenger/ChatFlowScreen.kt +++ b/apps/flipcash/features/messenger/src/main/kotlin/com/flipcash/app/messenger/ChatFlowScreen.kt @@ -2,6 +2,7 @@ package com.flipcash.app.messenger import android.os.Parcelable import androidx.compose.runtime.Composable +import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.lifecycle.compose.collectAsStateWithLifecycle @@ -10,17 +11,21 @@ import androidx.navigation3.runtime.NavKey import androidx.navigation3.runtime.entryProvider import com.flipcash.app.core.AppRoute import com.flipcash.app.core.chat.ChatIdentifier +import com.flipcash.app.core.chat.ChatSendResult import com.flipcash.app.core.chat.ChatStep import com.flipcash.app.messenger.internal.ChatViewModel import com.flipcash.app.messenger.internal.screens.MessengerScreen import com.getcode.navigation.annotatedEntry -import com.getcode.navigation.flowAnnotatedEntry import com.getcode.navigation.core.LocalCodeNavigator import com.getcode.navigation.flow.FlowHost +import com.getcode.navigation.flow.LocalOuterCodeNavigator import com.getcode.navigation.flow.flowSharedViewModel import com.getcode.navigation.flow.rememberFlowNavigator import com.getcode.navigation.flow.rememberInitialStack +import com.getcode.navigation.results.NavResultOrCanceled import com.getcode.navigation.results.NavResultStateRegistry +import com.getcode.navigation.results.navigateForResult +import com.getcode.navigation.results.resultBackNavigator import kotlinx.coroutines.flow.filterIsInstance import kotlinx.coroutines.flow.map @@ -46,7 +51,7 @@ private fun chatEntryProvider( annotatedEntry { FlowConversationScreen(identifier) } - flowAnnotatedEntry { + annotatedEntry { FlowAmountEntryScreen() } } @@ -55,6 +60,7 @@ private fun chatEntryProvider( private fun FlowConversationScreen(identifier: ChatIdentifier) { val viewModel = flowSharedViewModel() val flowNavigator = rememberFlowNavigator() + val navigator = LocalCodeNavigator.current LaunchedEffect(viewModel, identifier) { viewModel.dispatchEvent(ChatViewModel.Event.OnChatOpened(identifier)) @@ -64,7 +70,11 @@ private fun FlowConversationScreen(identifier: ChatIdentifier) { viewModel.eventFlow .filterIsInstance() .collect { - flowNavigator.navigateTo(ChatStep.AmountEntry) + navigator.navigateForResult(ChatStep.AmountEntry) { result -> + if (result is NavResultOrCanceled.ReturnValue) { + viewModel.dispatchEvent(ChatViewModel.Event.OnStartMessageInput) + } + } } } @@ -85,14 +95,20 @@ private fun FlowAmountEntryScreen() { val viewModel = flowSharedViewModel() val state by viewModel.stateFlow.collectAsStateWithLifecycle() val flowNavigator = rememberFlowNavigator() + val resultBack = resultBackNavigator() - ChatAmountEntryContent( - amountDelegate = viewModel.amountDelegate, - resolveState = state.resolveState, - token = state.token, - eventFlow = viewModel.eventFlow, - onConfirm = { viewModel.dispatchEvent(ChatViewModel.Event.OnConfirmRequested) }, - onSendComplete = { flowNavigator.back() }, - onExit = { flowNavigator.back() } - ) + // Re-provide the outer navigator so ChatAmountEntryContent can push + // app-level routes (RegionSelection, TokenSelection, etc.) + val outerNavigator = LocalOuterCodeNavigator.current + CompositionLocalProvider(LocalCodeNavigator provides outerNavigator) { + ChatAmountEntryContent( + amountDelegate = viewModel.amountDelegate, + resolveState = state.resolveState, + token = state.token, + eventFlow = viewModel.eventFlow, + onConfirm = { viewModel.dispatchEvent(ChatViewModel.Event.OnConfirmRequested) }, + onSendComplete = { resultBack.returnValue(ChatSendResult) }, + onExit = { flowNavigator.back() }, + ) + } } From ad4725cf90fa81cb58faac9ce11ec61e3a27357c Mon Sep 17 00:00:00 2001 From: Brandon McAnsh Date: Thu, 25 Jun 2026 15:05:54 -0400 Subject: [PATCH 2/2] chore: fix swap VM error test Signed-off-by: Brandon McAnsh --- .../com/flipcash/app/tokens/ui/SwapViewModelErrorTest.kt | 3 +++ 1 file changed, 3 insertions(+) diff --git a/apps/flipcash/shared/tokens/src/test/kotlin/com/flipcash/app/tokens/ui/SwapViewModelErrorTest.kt b/apps/flipcash/shared/tokens/src/test/kotlin/com/flipcash/app/tokens/ui/SwapViewModelErrorTest.kt index 10e7187a5..0a56c2233 100644 --- a/apps/flipcash/shared/tokens/src/test/kotlin/com/flipcash/app/tokens/ui/SwapViewModelErrorTest.kt +++ b/apps/flipcash/shared/tokens/src/test/kotlin/com/flipcash/app/tokens/ui/SwapViewModelErrorTest.kt @@ -24,6 +24,7 @@ import com.getcode.util.resources.FakeResourceHelper import com.flipcash.app.core.MainCoroutineRule import com.flipcash.app.core.dispatchers.TestDispatchers import com.flipcash.app.onramp.PhantomWalletController +import com.flipcash.app.userflags.UserFlagsCoordinator import io.mockk.every import io.mockk.mockk import io.mockk.mockkStatic @@ -63,6 +64,7 @@ class SwapViewModelErrorTest { private val purchaseMethodController = mockk(relaxed = true) private val coinbaseOnRampController = mockk(relaxed = true) private val phantomWalletController = mockk(relaxed = true) + private val userFlagsCoordinator = mockk(relaxed = true) private val accountCluster = mockk(relaxed = true) @@ -103,6 +105,7 @@ class SwapViewModelErrorTest { coinbaseOnRampController = coinbaseOnRampController, phantomWalletController = phantomWalletController, dispatchers = dispatchers, + userFlags = userFlagsCoordinator, ) }