Skip to content

Commit c415ac7

Browse files
authored
chore(chat): return to chat with IME open after sending cash (#987)
* chore(chat): return to chat with IME open after sending cash Signed-off-by: Brandon McAnsh <git@bmcreations.dev> * chore: fix swap VM error test Signed-off-by: Brandon McAnsh <git@bmcreations.dev> --------- Signed-off-by: Brandon McAnsh <git@bmcreations.dev>
1 parent 197b5ea commit c415ac7

3 files changed

Lines changed: 37 additions & 13 deletions

File tree

apps/flipcash/core/src/main/kotlin/com/flipcash/app/core/chat/ChatStep.kt

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,9 +2,14 @@ package com.flipcash.app.core.chat
22

33
import android.os.Parcelable
44
import com.getcode.navigation.flow.FlowStep
5+
import com.getcode.navigation.results.NavigationRetVal
56
import kotlinx.parcelize.Parcelize
67
import kotlinx.serialization.Serializable
78

9+
@Parcelize
10+
@Serializable
11+
data object ChatSendResult : Parcelable
12+
813
@Serializable
914
sealed interface ChatStep : FlowStep, Parcelable {
1015
@Parcelize
@@ -13,5 +18,5 @@ sealed interface ChatStep : FlowStep, Parcelable {
1318

1419
@Parcelize
1520
@Serializable
16-
data object AmountEntry : ChatStep
21+
data object AmountEntry : ChatStep, NavigationRetVal<ChatSendResult>
1722
}

apps/flipcash/features/messenger/src/main/kotlin/com/flipcash/app/messenger/ChatFlowScreen.kt

Lines changed: 28 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,7 @@ package com.flipcash.app.messenger
22

33
import android.os.Parcelable
44
import androidx.compose.runtime.Composable
5+
import androidx.compose.runtime.CompositionLocalProvider
56
import androidx.compose.runtime.LaunchedEffect
67
import androidx.compose.runtime.getValue
78
import androidx.lifecycle.compose.collectAsStateWithLifecycle
@@ -10,17 +11,21 @@ import androidx.navigation3.runtime.NavKey
1011
import androidx.navigation3.runtime.entryProvider
1112
import com.flipcash.app.core.AppRoute
1213
import com.flipcash.app.core.chat.ChatIdentifier
14+
import com.flipcash.app.core.chat.ChatSendResult
1315
import com.flipcash.app.core.chat.ChatStep
1416
import com.flipcash.app.messenger.internal.ChatViewModel
1517
import com.flipcash.app.messenger.internal.screens.MessengerScreen
1618
import com.getcode.navigation.annotatedEntry
17-
import com.getcode.navigation.flowAnnotatedEntry
1819
import com.getcode.navigation.core.LocalCodeNavigator
1920
import com.getcode.navigation.flow.FlowHost
21+
import com.getcode.navigation.flow.LocalOuterCodeNavigator
2022
import com.getcode.navigation.flow.flowSharedViewModel
2123
import com.getcode.navigation.flow.rememberFlowNavigator
2224
import com.getcode.navigation.flow.rememberInitialStack
25+
import com.getcode.navigation.results.NavResultOrCanceled
2326
import com.getcode.navigation.results.NavResultStateRegistry
27+
import com.getcode.navigation.results.navigateForResult
28+
import com.getcode.navigation.results.resultBackNavigator
2429
import kotlinx.coroutines.flow.filterIsInstance
2530
import kotlinx.coroutines.flow.map
2631

@@ -46,7 +51,7 @@ private fun chatEntryProvider(
4651
annotatedEntry<ChatStep.Conversation> {
4752
FlowConversationScreen(identifier)
4853
}
49-
flowAnnotatedEntry<ChatStep.AmountEntry> {
54+
annotatedEntry<ChatStep.AmountEntry> {
5055
FlowAmountEntryScreen()
5156
}
5257
}
@@ -55,6 +60,7 @@ private fun chatEntryProvider(
5560
private fun FlowConversationScreen(identifier: ChatIdentifier) {
5661
val viewModel = flowSharedViewModel<ChatViewModel>()
5762
val flowNavigator = rememberFlowNavigator<ChatStep, Parcelable>()
63+
val navigator = LocalCodeNavigator.current
5864

5965
LaunchedEffect(viewModel, identifier) {
6066
viewModel.dispatchEvent(ChatViewModel.Event.OnChatOpened(identifier))
@@ -64,7 +70,11 @@ private fun FlowConversationScreen(identifier: ChatIdentifier) {
6470
viewModel.eventFlow
6571
.filterIsInstance<ChatViewModel.Event.NavigateToAmountEntry>()
6672
.collect {
67-
flowNavigator.navigateTo(ChatStep.AmountEntry)
73+
navigator.navigateForResult<ChatSendResult>(ChatStep.AmountEntry) { result ->
74+
if (result is NavResultOrCanceled.ReturnValue) {
75+
viewModel.dispatchEvent(ChatViewModel.Event.OnStartMessageInput)
76+
}
77+
}
6878
}
6979
}
7080

@@ -85,14 +95,20 @@ private fun FlowAmountEntryScreen() {
8595
val viewModel = flowSharedViewModel<ChatViewModel>()
8696
val state by viewModel.stateFlow.collectAsStateWithLifecycle()
8797
val flowNavigator = rememberFlowNavigator<ChatStep, Parcelable>()
98+
val resultBack = resultBackNavigator<ChatSendResult>()
8899

89-
ChatAmountEntryContent(
90-
amountDelegate = viewModel.amountDelegate,
91-
resolveState = state.resolveState,
92-
token = state.token,
93-
eventFlow = viewModel.eventFlow,
94-
onConfirm = { viewModel.dispatchEvent(ChatViewModel.Event.OnConfirmRequested) },
95-
onSendComplete = { flowNavigator.back() },
96-
onExit = { flowNavigator.back() }
97-
)
100+
// Re-provide the outer navigator so ChatAmountEntryContent can push
101+
// app-level routes (RegionSelection, TokenSelection, etc.)
102+
val outerNavigator = LocalOuterCodeNavigator.current
103+
CompositionLocalProvider(LocalCodeNavigator provides outerNavigator) {
104+
ChatAmountEntryContent(
105+
amountDelegate = viewModel.amountDelegate,
106+
resolveState = state.resolveState,
107+
token = state.token,
108+
eventFlow = viewModel.eventFlow,
109+
onConfirm = { viewModel.dispatchEvent(ChatViewModel.Event.OnConfirmRequested) },
110+
onSendComplete = { resultBack.returnValue(ChatSendResult) },
111+
onExit = { flowNavigator.back() },
112+
)
113+
}
98114
}

apps/flipcash/shared/tokens/src/test/kotlin/com/flipcash/app/tokens/ui/SwapViewModelErrorTest.kt

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import com.getcode.util.resources.FakeResourceHelper
2424
import com.flipcash.app.core.MainCoroutineRule
2525
import com.flipcash.app.core.dispatchers.TestDispatchers
2626
import com.flipcash.app.onramp.PhantomWalletController
27+
import com.flipcash.app.userflags.UserFlagsCoordinator
2728
import io.mockk.every
2829
import io.mockk.mockk
2930
import io.mockk.mockkStatic
@@ -63,6 +64,7 @@ class SwapViewModelErrorTest {
6364
private val purchaseMethodController = mockk<PurchaseMethodController>(relaxed = true)
6465
private val coinbaseOnRampController = mockk<CoinbaseOnRampController>(relaxed = true)
6566
private val phantomWalletController = mockk<PhantomWalletController>(relaxed = true)
67+
private val userFlagsCoordinator = mockk<UserFlagsCoordinator>(relaxed = true)
6668

6769
private val accountCluster = mockk<AccountCluster>(relaxed = true)
6870

@@ -103,6 +105,7 @@ class SwapViewModelErrorTest {
103105
coinbaseOnRampController = coinbaseOnRampController,
104106
phantomWalletController = phantomWalletController,
105107
dispatchers = dispatchers,
108+
userFlags = userFlagsCoordinator,
106109
)
107110
}
108111

0 commit comments

Comments
 (0)