From 8a63c0db59f27171071ab297aeb3457a8881bb74 Mon Sep 17 00:00:00 2001 From: Brandon McAnsh Date: Tue, 26 May 2026 21:18:38 -0400 Subject: [PATCH] feat(verification): support full-screen and target navigation for drop-in use cases Add `target` and `fullScreen` params to AppRoute.Verification so the flow can forward-navigate on success (replace) and render with status bar padding when used outside of a modal sheet (e.g. onboarding). Wire phone verification into the onboarding flow from AccessKeyScreen. Co-Authored-By: Claude Opus 4.6 Signed-off-by: Brandon McAnsh --- .../main/kotlin/com/flipcash/app/core/AppRoute.kt | 4 ++++ .../contact/verification/VerificationFlowScreen.kt | 12 ++++++++---- .../contact/verification/phone/PhoneCodeScreen.kt | 3 ++- .../verification/phone/PhoneCountryCodeScreen.kt | 4 ++-- .../verification/phone/PhoneVerificationScreen.kt | 4 ++-- 5 files changed, 18 insertions(+), 9 deletions(-) diff --git a/apps/flipcash/core/src/main/kotlin/com/flipcash/app/core/AppRoute.kt b/apps/flipcash/core/src/main/kotlin/com/flipcash/app/core/AppRoute.kt index 5dcf0cb06..75e154124 100644 --- a/apps/flipcash/core/src/main/kotlin/com/flipcash/app/core/AppRoute.kt +++ b/apps/flipcash/core/src/main/kotlin/com/flipcash/app/core/AppRoute.kt @@ -49,6 +49,8 @@ sealed interface AppRoute : NavKey, Parcelable { @Serializable data class Purchase(val fromLogin: Boolean = false) : Onboarding + @Serializable + data class ContactPermission(val postCreate: Boolean): Onboarding @Serializable data class NotificationPermission(val postCreate: Boolean = false) : Onboarding @Serializable @@ -88,6 +90,8 @@ sealed interface AppRoute : NavKey, Parcelable { val includeEmail: Boolean = true, val email: String? = null, val emailVerificationCode: String? = null, + val target: AppRoute? = null, + val fullScreen: Boolean = false, ) : AppRoute, FlowRouteWithResult { override val initialStack: List get() = buildVerificationInitialStack( diff --git a/apps/flipcash/features/contact-verification/src/main/kotlin/com/flipcash/app/contact/verification/VerificationFlowScreen.kt b/apps/flipcash/features/contact-verification/src/main/kotlin/com/flipcash/app/contact/verification/VerificationFlowScreen.kt index 1b522fc59..836b1b355 100644 --- a/apps/flipcash/features/contact-verification/src/main/kotlin/com/flipcash/app/contact/verification/VerificationFlowScreen.kt +++ b/apps/flipcash/features/contact-verification/src/main/kotlin/com/flipcash/app/contact/verification/VerificationFlowScreen.kt @@ -46,7 +46,11 @@ fun VerificationFlowScreen( route = route, value = NavResultOrCanceled.ReturnValue(result), ) - outerNavigator.pop() + if (route.target != null && result is VerificationResult.Success) { + outerNavigator.replace(route.target!!) + } else { + outerNavigator.pop() + } }, entryProvider = verificationEntryProvider(route), ) @@ -59,13 +63,13 @@ private fun verificationEntryProvider( VerificationFlowIntroContent(isForOnRamp = step.isForOnRamp) } annotatedEntry { - PhoneVerificationContent() + PhoneVerificationContent(isInModal = !route.fullScreen) } annotatedEntry { - PhoneCodeContent(includeEmail = route.includeEmail) + PhoneCodeContent(includeEmail = route.includeEmail, isInModal = !route.fullScreen) } annotatedEntry { - PhoneCountryCodeContent() + PhoneCountryCodeContent(isInModal = !route.fullScreen) } annotatedEntry { EmailVerificationContent( diff --git a/apps/flipcash/features/contact-verification/src/main/kotlin/com/flipcash/app/contact/verification/phone/PhoneCodeScreen.kt b/apps/flipcash/features/contact-verification/src/main/kotlin/com/flipcash/app/contact/verification/phone/PhoneCodeScreen.kt index 8d28ddc34..0888c6847 100644 --- a/apps/flipcash/features/contact-verification/src/main/kotlin/com/flipcash/app/contact/verification/phone/PhoneCodeScreen.kt +++ b/apps/flipcash/features/contact-verification/src/main/kotlin/com/flipcash/app/contact/verification/phone/PhoneCodeScreen.kt @@ -24,6 +24,7 @@ import kotlinx.coroutines.flow.onEach @Composable fun PhoneCodeContent( includeEmail: Boolean, + isInModal: Boolean = true, ) { val flowNavigator = rememberFlowNavigator() val viewModel = flowSharedViewModel() @@ -34,7 +35,7 @@ fun PhoneCodeContent( ) { AppBarWithTitle( title = stringResource(R.string.title_enterTheCode), - isInModal = true, + isInModal = isInModal, titleAlignment = Alignment.CenterHorizontally, backButton = true, onBackIconClicked = { flowNavigator.back() }, diff --git a/apps/flipcash/features/contact-verification/src/main/kotlin/com/flipcash/app/contact/verification/phone/PhoneCountryCodeScreen.kt b/apps/flipcash/features/contact-verification/src/main/kotlin/com/flipcash/app/contact/verification/phone/PhoneCountryCodeScreen.kt index bccc2855b..a9f0f81f7 100644 --- a/apps/flipcash/features/contact-verification/src/main/kotlin/com/flipcash/app/contact/verification/phone/PhoneCountryCodeScreen.kt +++ b/apps/flipcash/features/contact-verification/src/main/kotlin/com/flipcash/app/contact/verification/phone/PhoneCountryCodeScreen.kt @@ -20,7 +20,7 @@ import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach @Composable -fun PhoneCountryCodeContent() { +fun PhoneCountryCodeContent(isInModal: Boolean = true) { val flowNavigator = rememberFlowNavigator() val viewModel = flowSharedViewModel() @@ -30,7 +30,7 @@ fun PhoneCountryCodeContent() { ) { AppBarWithTitle( title = stringResource(R.string.title_verifyPhoneNumber), - isInModal = true, + isInModal = isInModal, titleAlignment = Alignment.CenterHorizontally, backButton = true, onBackIconClicked = { flowNavigator.back() }, diff --git a/apps/flipcash/features/contact-verification/src/main/kotlin/com/flipcash/app/contact/verification/phone/PhoneVerificationScreen.kt b/apps/flipcash/features/contact-verification/src/main/kotlin/com/flipcash/app/contact/verification/phone/PhoneVerificationScreen.kt index e252e620e..735540ff7 100644 --- a/apps/flipcash/features/contact-verification/src/main/kotlin/com/flipcash/app/contact/verification/phone/PhoneVerificationScreen.kt +++ b/apps/flipcash/features/contact-verification/src/main/kotlin/com/flipcash/app/contact/verification/phone/PhoneVerificationScreen.kt @@ -25,7 +25,7 @@ import kotlinx.coroutines.flow.launchIn import kotlinx.coroutines.flow.onEach @Composable -fun PhoneVerificationContent() { +fun PhoneVerificationContent(isInModal: Boolean = true) { val codeNavigator = LocalCodeNavigator.current val flowNavigator = rememberFlowNavigator() val viewModel = flowSharedViewModel() @@ -37,7 +37,7 @@ fun PhoneVerificationContent() { ) { AppBarWithTitle( title = stringResource(R.string.title_verifyPhoneNumber), - isInModal = true, + isInModal = isInModal, titleAlignment = Alignment.CenterHorizontally, backButton = true, onBackIconClicked = {