From a6b696bcd17b82eb29ee486c5089fe15018a2187 Mon Sep 17 00:00:00 2001 From: Brandon McAnsh Date: Wed, 17 Jun 2026 17:58:15 -0400 Subject: [PATCH] feat(ui/navigation): rebuild modal bottom sheet scene strategy to better support IME transitions Signed-off-by: Brandon McAnsh --- .../ui/previews/AppBarTitlePreviews.kt | 1 - .../app/advanced/AdvancedFeaturesScreen.kt | 1 - .../app/appsettings/AppSettingsScreen.kt | 1 - .../flipcash/app/backupkey/BackupKeyScreen.kt | 1 - .../com/flipcash/app/balance/BalanceScreen.kt | 1 - .../com/flipcash/app/cash/CashScreen.kt | 1 - .../verification/VerificationFlowScreen.kt | 5 +- .../email/EmailMagicLinkScreen.kt | 1 - .../email/EmailVerificationScreen.kt | 1 - .../internal/VerificationFlowIntroScreen.kt | 2 - .../verification/phone/PhoneCodeScreen.kt | 2 - .../phone/PhoneCountryCodeScreen.kt | 3 +- .../phone/PhoneVerificationScreen.kt | 3 +- .../components/CurrencyCreatorTopBar.kt | 1 - .../app/deposit/DepositDestinationScreen.kt | 1 - .../flipcash/app/deposit/DepositFlowScreen.kt | 1 - .../internal/UsdcDepositInformationScreen.kt | 1 - .../app/devicelogs/DeviceLogsScreen.kt | 1 - .../flipcash/app/directsend/SendFlowScreen.kt | 5 +- .../internal/screens/ContactListScreen.kt | 1 - .../screens/ContactsPermissionGateScreen.kt | 1 - .../screens/PhoneGateLandingScreen.kt | 1 - .../app/discovery/TokenDiscoveryScreen.kt | 2 - .../kotlin/com/flipcash/app/lab/LabsScreen.kt | 2 - .../flipcash/app/lab/NavBarSettingsScreen.kt | 1 - .../app/menu/internal/MenuScreenContent.kt | 1 - .../app/messenger/ChatAmountEntryScreen.kt | 1 - .../flipcash/app/myaccount/MyAccountScreen.kt | 1 - .../app/myaccount/UserProfileScreen.kt | 1 - .../flipcash/app/shareapp/ShareAppScreen.kt | 1 - .../app/tokens/PhantomWalletScreens.kt | 2 - .../flipcash/app/tokens/SwapEntryScreen.kt | 1 - .../flipcash/app/tokens/TokenInfoScreen.kt | 1 - .../flipcash/app/tokens/TokenSelectScreen.kt | 1 - .../app/tokens/TokenSellReceiptScreen.kt | 1 - .../internal/TokenTxProcessingScreen.kt | 1 - .../transactions/TransactionHistoryScreen.kt | 1 - .../flipcash/app/userflags/UserFlagsScreen.kt | 1 - .../app/withdrawal/WithdrawalFlowScreen.kt | 1 - .../UsdcWithdrawalInformationScreen.kt | 1 - .../screens/WithdrawalConfirmationScreen.kt | 1 - .../screens/WithdrawalDestinationScreen.kt | 1 - .../internal/screens/WithdrawalEntryScreen.kt | 1 - .../shared/amountentry/AmountEntryScreen.kt | 84 +++---- .../components/AnimatedContactListPreview.kt | 3 +- .../app/currency/RegionSelectionScreen.kt | 1 - .../transfers/TransferInformationalScreen.kt | 1 - build.gradle.kts | 1 + gradle/libs.versions.toml | 3 + .../com/getcode/ui/components/TitleBar.kt | 18 +- .../kotlin/com/getcode/ui/theme/CodeButton.kt | 2 +- ui/navigation/build.gradle.kts | 1 + .../scenes/ModalBottomSheetSceneStrategy.kt | 238 ++++++++---------- 53 files changed, 172 insertions(+), 240 deletions(-) diff --git a/apps/flipcash/core/src/main/kotlin/com/flipcash/app/core/internal/ui/previews/AppBarTitlePreviews.kt b/apps/flipcash/core/src/main/kotlin/com/flipcash/app/core/internal/ui/previews/AppBarTitlePreviews.kt index e8f8443d9..f6101c1e8 100644 --- a/apps/flipcash/core/src/main/kotlin/com/flipcash/app/core/internal/ui/previews/AppBarTitlePreviews.kt +++ b/apps/flipcash/core/src/main/kotlin/com/flipcash/app/core/internal/ui/previews/AppBarTitlePreviews.kt @@ -14,7 +14,6 @@ private fun AppBarTitleOnGivePreview() { FlipcashPreview(showBackground = true) { AppBarWithTitle( - isInModal = true, leftIcon = { AppBarDefaults.UpNavigation() { }}, title = { TokenSelectionPill( diff --git a/apps/flipcash/features/advanced/src/main/kotlin/com/flipcash/app/advanced/AdvancedFeaturesScreen.kt b/apps/flipcash/features/advanced/src/main/kotlin/com/flipcash/app/advanced/AdvancedFeaturesScreen.kt index 59dd03e2e..fa5921b15 100644 --- a/apps/flipcash/features/advanced/src/main/kotlin/com/flipcash/app/advanced/AdvancedFeaturesScreen.kt +++ b/apps/flipcash/features/advanced/src/main/kotlin/com/flipcash/app/advanced/AdvancedFeaturesScreen.kt @@ -34,7 +34,6 @@ fun AdvancedFeaturesScreen() { AppBarWithTitle( title = stringResource(R.string.title_advancedFeatures), titleAlignment = Alignment.CenterHorizontally, - isInModal = true, backButton = true, onBackIconClicked = { navigator.pop() } ) diff --git a/apps/flipcash/features/appsettings/src/main/kotlin/com/flipcash/app/appsettings/AppSettingsScreen.kt b/apps/flipcash/features/appsettings/src/main/kotlin/com/flipcash/app/appsettings/AppSettingsScreen.kt index 0d7eb09a0..506beb434 100644 --- a/apps/flipcash/features/appsettings/src/main/kotlin/com/flipcash/app/appsettings/AppSettingsScreen.kt +++ b/apps/flipcash/features/appsettings/src/main/kotlin/com/flipcash/app/appsettings/AppSettingsScreen.kt @@ -23,7 +23,6 @@ fun AppSettingsScreen() { title = stringResource(R.string.title_appSettings), titleAlignment = Alignment.CenterHorizontally, backButton = true, - isInModal = true, onBackIconClicked = navigator::pop ) diff --git a/apps/flipcash/features/backupkey/src/main/kotlin/com/flipcash/app/backupkey/BackupKeyScreen.kt b/apps/flipcash/features/backupkey/src/main/kotlin/com/flipcash/app/backupkey/BackupKeyScreen.kt index 70266fed3..f89b9732a 100644 --- a/apps/flipcash/features/backupkey/src/main/kotlin/com/flipcash/app/backupkey/BackupKeyScreen.kt +++ b/apps/flipcash/features/backupkey/src/main/kotlin/com/flipcash/app/backupkey/BackupKeyScreen.kt @@ -24,7 +24,6 @@ fun BackupKeyScreen() { ) { AppBarWithTitle( title = stringResource(R.string.title_accessKey), - isInModal = true, titleAlignment = Alignment.CenterHorizontally, backButton = true, onBackIconClicked = { navigator.pop() }, diff --git a/apps/flipcash/features/balance/src/main/kotlin/com/flipcash/app/balance/BalanceScreen.kt b/apps/flipcash/features/balance/src/main/kotlin/com/flipcash/app/balance/BalanceScreen.kt index 25b07dabd..1dbcc837a 100644 --- a/apps/flipcash/features/balance/src/main/kotlin/com/flipcash/app/balance/BalanceScreen.kt +++ b/apps/flipcash/features/balance/src/main/kotlin/com/flipcash/app/balance/BalanceScreen.kt @@ -31,7 +31,6 @@ fun BalanceScreen() { ) { AppBarWithTitle( title = stringResource(R.string.title_wallet), - isInModal = true, titleAlignment = Alignment.CenterHorizontally, endContent = { AppBarDefaults.Close { navigator.hide() } diff --git a/apps/flipcash/features/cash/src/main/kotlin/com/flipcash/app/cash/CashScreen.kt b/apps/flipcash/features/cash/src/main/kotlin/com/flipcash/app/cash/CashScreen.kt index 55314c727..3fa78b741 100644 --- a/apps/flipcash/features/cash/src/main/kotlin/com/flipcash/app/cash/CashScreen.kt +++ b/apps/flipcash/features/cash/src/main/kotlin/com/flipcash/app/cash/CashScreen.kt @@ -50,7 +50,6 @@ fun CashScreen( horizontalAlignment = Alignment.CenterHorizontally, ) { AppBarWithTitle( - isInModal = true, title = { TokenSelectionPill(state.token?.token) { navigator.push( 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 78bd39e4f..5f9966dfa 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 @@ -63,17 +63,16 @@ private fun verificationEntryProvider( VerificationFlowIntroContent(isForOnRamp = step.isForOnRamp) } annotatedEntry { - PhoneVerificationContent(isInModal = !route.fullScreen) + PhoneVerificationContent() } annotatedEntry { PhoneCodeContent( includeEmail = route.includeEmail, - isInModal = !route.fullScreen, linkForPayment = route.linkForPayment, ) } annotatedEntry { - PhoneCountryCodeContent(isInModal = !route.fullScreen) + PhoneCountryCodeContent() } annotatedEntry { EmailVerificationContent( diff --git a/apps/flipcash/features/contact-verification/src/main/kotlin/com/flipcash/app/contact/verification/email/EmailMagicLinkScreen.kt b/apps/flipcash/features/contact-verification/src/main/kotlin/com/flipcash/app/contact/verification/email/EmailMagicLinkScreen.kt index 4f3a13957..8b1a8de36 100644 --- a/apps/flipcash/features/contact-verification/src/main/kotlin/com/flipcash/app/contact/verification/email/EmailMagicLinkScreen.kt +++ b/apps/flipcash/features/contact-verification/src/main/kotlin/com/flipcash/app/contact/verification/email/EmailMagicLinkScreen.kt @@ -48,7 +48,6 @@ fun EmailMagicLinkContent( ) { AppBarWithTitle( title = stringResource(R.string.title_connectEmailAddress), - isInModal = true, titleAlignment = Alignment.CenterHorizontally, backButton = true, onBackIconClicked = { flowNavigator.back() }, diff --git a/apps/flipcash/features/contact-verification/src/main/kotlin/com/flipcash/app/contact/verification/email/EmailVerificationScreen.kt b/apps/flipcash/features/contact-verification/src/main/kotlin/com/flipcash/app/contact/verification/email/EmailVerificationScreen.kt index ed7b2b955..75c1cd9e1 100644 --- a/apps/flipcash/features/contact-verification/src/main/kotlin/com/flipcash/app/contact/verification/email/EmailVerificationScreen.kt +++ b/apps/flipcash/features/contact-verification/src/main/kotlin/com/flipcash/app/contact/verification/email/EmailVerificationScreen.kt @@ -44,7 +44,6 @@ fun EmailVerificationContent( ) { AppBarWithTitle( title = stringResource(R.string.title_connectEmailAddress), - isInModal = true, titleAlignment = Alignment.CenterHorizontally, backButton = true, onBackIconClicked = { diff --git a/apps/flipcash/features/contact-verification/src/main/kotlin/com/flipcash/app/contact/verification/internal/VerificationFlowIntroScreen.kt b/apps/flipcash/features/contact-verification/src/main/kotlin/com/flipcash/app/contact/verification/internal/VerificationFlowIntroScreen.kt index d45a2b14b..2d3bfbec5 100644 --- a/apps/flipcash/features/contact-verification/src/main/kotlin/com/flipcash/app/contact/verification/internal/VerificationFlowIntroScreen.kt +++ b/apps/flipcash/features/contact-verification/src/main/kotlin/com/flipcash/app/contact/verification/internal/VerificationFlowIntroScreen.kt @@ -70,14 +70,12 @@ private fun VerificationFlowIntroScreenContent( topBar = { if (isSheetRoot) { AppBarWithTitle( - isInModal = true, endContent = { AppBarDefaults.Close { navigator.hide() } }, ) } else { AppBarWithTitle( - isInModal = true, backButton = true, onBackIconClicked = { navigator.pop() }, ) 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 889e0942c..32b50d8b3 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,7 +24,6 @@ import kotlinx.coroutines.flow.onEach @Composable fun PhoneCodeContent( includeEmail: Boolean, - isInModal: Boolean = true, linkForPayment: Boolean = false, ) { val flowNavigator = rememberFlowNavigator() @@ -36,7 +35,6 @@ fun PhoneCodeContent( ) { AppBarWithTitle( title = stringResource(R.string.title_enterTheCode), - 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 a9f0f81f7..be94c1541 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(isInModal: Boolean = true) { +fun PhoneCountryCodeContent() { val flowNavigator = rememberFlowNavigator() val viewModel = flowSharedViewModel() @@ -30,7 +30,6 @@ fun PhoneCountryCodeContent(isInModal: Boolean = true) { ) { AppBarWithTitle( title = stringResource(R.string.title_verifyPhoneNumber), - 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 23754fcbc..1f1a5091f 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(isInModal: Boolean = true) { +fun PhoneVerificationContent() { val codeNavigator = LocalCodeNavigator.current val flowNavigator = rememberFlowNavigator() val viewModel = flowSharedViewModel() @@ -37,7 +37,6 @@ fun PhoneVerificationContent(isInModal: Boolean = true) { ) { AppBarWithTitle( title = stringResource(R.string.title_connectPhoneNumber), - isInModal = isInModal, titleAlignment = Alignment.CenterHorizontally, backButton = true, onBackIconClicked = { diff --git a/apps/flipcash/features/currency-creator/src/main/kotlin/com/flipcash/app/currencycreator/internal/components/CurrencyCreatorTopBar.kt b/apps/flipcash/features/currency-creator/src/main/kotlin/com/flipcash/app/currencycreator/internal/components/CurrencyCreatorTopBar.kt index bdff2e295..aeb24273e 100644 --- a/apps/flipcash/features/currency-creator/src/main/kotlin/com/flipcash/app/currencycreator/internal/components/CurrencyCreatorTopBar.kt +++ b/apps/flipcash/features/currency-creator/src/main/kotlin/com/flipcash/app/currencycreator/internal/components/CurrencyCreatorTopBar.kt @@ -63,7 +63,6 @@ internal fun CurrencyCreatorTopBar( val keyboard = rememberKeyboardController() AppBarWithTitle( - isInModal = true, title = { mainContent?.invoke() ?: defaultMainContent() }, titleAlignment = Alignment.CenterHorizontally, leftIcon = { diff --git a/apps/flipcash/features/deposit/src/main/kotlin/com/flipcash/app/deposit/DepositDestinationScreen.kt b/apps/flipcash/features/deposit/src/main/kotlin/com/flipcash/app/deposit/DepositDestinationScreen.kt index 93d125332..0d4df34ea 100644 --- a/apps/flipcash/features/deposit/src/main/kotlin/com/flipcash/app/deposit/DepositDestinationScreen.kt +++ b/apps/flipcash/features/deposit/src/main/kotlin/com/flipcash/app/deposit/DepositDestinationScreen.kt @@ -28,7 +28,6 @@ fun DepositDestinationScreen(mint: Mint) { ) { AppBarWithTitle( title = stringResource(R.string.title_depositToken, state.tokenName.orEmpty()), - isInModal = true, titleAlignment = Alignment.CenterHorizontally, backButton = true, onBackIconClicked = { navigator.pop() }, diff --git a/apps/flipcash/features/deposit/src/main/kotlin/com/flipcash/app/deposit/DepositFlowScreen.kt b/apps/flipcash/features/deposit/src/main/kotlin/com/flipcash/app/deposit/DepositFlowScreen.kt index 6f5754bc9..e9c4ec52b 100644 --- a/apps/flipcash/features/deposit/src/main/kotlin/com/flipcash/app/deposit/DepositFlowScreen.kt +++ b/apps/flipcash/features/deposit/src/main/kotlin/com/flipcash/app/deposit/DepositFlowScreen.kt @@ -108,7 +108,6 @@ private fun DepositSelectTokenScreen() { horizontalAlignment = Alignment.CenterHorizontally, ) { AppBarWithTitle( - isInModal = true, title = stringResource(R.string.title_selectCurrency), backButton = true, onBackIconClicked = { flowNavigator.back() }, diff --git a/apps/flipcash/features/deposit/src/main/kotlin/com/flipcash/app/deposit/internal/UsdcDepositInformationScreen.kt b/apps/flipcash/features/deposit/src/main/kotlin/com/flipcash/app/deposit/internal/UsdcDepositInformationScreen.kt index 8a2acc2c0..4c1b19aac 100644 --- a/apps/flipcash/features/deposit/src/main/kotlin/com/flipcash/app/deposit/internal/UsdcDepositInformationScreen.kt +++ b/apps/flipcash/features/deposit/src/main/kotlin/com/flipcash/app/deposit/internal/UsdcDepositInformationScreen.kt @@ -33,7 +33,6 @@ internal fun UsdcDepositInformationScreen(showOtherOptions: Boolean) { topBar = { AppBarWithTitle( title = stringResource(R.string.title_deposit), - isInModal = true, backButton = true, onBackIconClicked = { flowNavigator.back() }, titleAlignment = Alignment.CenterHorizontally, diff --git a/apps/flipcash/features/device-logs/src/main/kotlin/com/flipcash/app/devicelogs/DeviceLogsScreen.kt b/apps/flipcash/features/device-logs/src/main/kotlin/com/flipcash/app/devicelogs/DeviceLogsScreen.kt index 0a3738abf..6b8000d92 100644 --- a/apps/flipcash/features/device-logs/src/main/kotlin/com/flipcash/app/devicelogs/DeviceLogsScreen.kt +++ b/apps/flipcash/features/device-logs/src/main/kotlin/com/flipcash/app/devicelogs/DeviceLogsScreen.kt @@ -45,7 +45,6 @@ fun DeviceLogsScreen() { AppBarWithTitle( title = stringResource(R.string.title_deviceLogs), titleAlignment = Alignment.CenterHorizontally, - isInModal = true, backButton = true, onBackIconClicked = { navigator.pop() }, endContent = { diff --git a/apps/flipcash/features/direct-send/src/main/kotlin/com/flipcash/app/directsend/SendFlowScreen.kt b/apps/flipcash/features/direct-send/src/main/kotlin/com/flipcash/app/directsend/SendFlowScreen.kt index 59715adf9..e69ca5482 100644 --- a/apps/flipcash/features/direct-send/src/main/kotlin/com/flipcash/app/directsend/SendFlowScreen.kt +++ b/apps/flipcash/features/direct-send/src/main/kotlin/com/flipcash/app/directsend/SendFlowScreen.kt @@ -21,13 +21,14 @@ import com.getcode.navigation.flow.FlowHost import com.getcode.navigation.flow.flowSharedViewModel import com.getcode.navigation.results.NavResultStateRegistry import com.getcode.navigation.scenes.LocalBottomSheetDismissDispatcher +import com.getcode.ui.utils.rememberKeyboardController @Composable fun SendFlowScreen(resultStateRegistry: NavResultStateRegistry) { val sheetDismiss = LocalBottomSheetDismissDispatcher.current val viewModel = hiltViewModel() val state by viewModel.stateFlow.collectAsStateWithLifecycle() - + val keyboard = rememberKeyboardController() FlowHost( steps = state.steps, resumeAt = 0, @@ -36,7 +37,7 @@ fun SendFlowScreen(resultStateRegistry: NavResultStateRegistry) { when (reason) { is FlowExitReason.Completed, FlowExitReason.BackedOutOfRoot, - FlowExitReason.Canceled -> sheetDismiss() + FlowExitReason.Canceled -> keyboard.hideIfVisible { sheetDismiss() } } }, entryProvider = sendEntryProvider(), diff --git a/apps/flipcash/features/direct-send/src/main/kotlin/com/flipcash/app/directsend/internal/screens/ContactListScreen.kt b/apps/flipcash/features/direct-send/src/main/kotlin/com/flipcash/app/directsend/internal/screens/ContactListScreen.kt index 4f21c980f..81ff10309 100644 --- a/apps/flipcash/features/direct-send/src/main/kotlin/com/flipcash/app/directsend/internal/screens/ContactListScreen.kt +++ b/apps/flipcash/features/direct-send/src/main/kotlin/com/flipcash/app/directsend/internal/screens/ContactListScreen.kt @@ -118,7 +118,6 @@ internal fun ContactListScreen() { AppBarWithTitle( title = stringResource(R.string.title_send), titleAlignment = Alignment.CenterHorizontally, - isInModal = true, endContent = { AppBarDefaults.Close { flowNavigator.exitCanceled() } }, diff --git a/apps/flipcash/features/direct-send/src/main/kotlin/com/flipcash/app/directsend/internal/screens/ContactsPermissionGateScreen.kt b/apps/flipcash/features/direct-send/src/main/kotlin/com/flipcash/app/directsend/internal/screens/ContactsPermissionGateScreen.kt index 241097756..5c2c1805e 100644 --- a/apps/flipcash/features/direct-send/src/main/kotlin/com/flipcash/app/directsend/internal/screens/ContactsPermissionGateScreen.kt +++ b/apps/flipcash/features/direct-send/src/main/kotlin/com/flipcash/app/directsend/internal/screens/ContactsPermissionGateScreen.kt @@ -60,7 +60,6 @@ internal fun ContactsPermissionGateScreen() { topBar = { AppBarWithTitle( title = "", - isInModal = true, endContent = { AppBarDefaults.Close { flowNavigator.exitCanceled() } }, diff --git a/apps/flipcash/features/direct-send/src/main/kotlin/com/flipcash/app/directsend/internal/screens/PhoneGateLandingScreen.kt b/apps/flipcash/features/direct-send/src/main/kotlin/com/flipcash/app/directsend/internal/screens/PhoneGateLandingScreen.kt index 8a8268d72..ebb7a6fc0 100644 --- a/apps/flipcash/features/direct-send/src/main/kotlin/com/flipcash/app/directsend/internal/screens/PhoneGateLandingScreen.kt +++ b/apps/flipcash/features/direct-send/src/main/kotlin/com/flipcash/app/directsend/internal/screens/PhoneGateLandingScreen.kt @@ -36,7 +36,6 @@ internal fun PhoneGateLandingScreen() { topBar = { AppBarWithTitle( title = "", - isInModal = true, endContent = { AppBarDefaults.Close { flowNavigator.exitCanceled() } }, diff --git a/apps/flipcash/features/discovery/src/main/kotlin/com/flipcash/app/discovery/TokenDiscoveryScreen.kt b/apps/flipcash/features/discovery/src/main/kotlin/com/flipcash/app/discovery/TokenDiscoveryScreen.kt index 38bf369d5..436e26a56 100644 --- a/apps/flipcash/features/discovery/src/main/kotlin/com/flipcash/app/discovery/TokenDiscoveryScreen.kt +++ b/apps/flipcash/features/discovery/src/main/kotlin/com/flipcash/app/discovery/TokenDiscoveryScreen.kt @@ -36,7 +36,6 @@ fun TokenDiscoveryScreen() { if (isSheetRoot) { AppBarWithTitle( title = stringResource(R.string.title_discoverCurrencies), - isInModal = true, titleAlignment = Alignment.CenterHorizontally, endContent = { AppBarDefaults.Close { navigator.hide() } @@ -45,7 +44,6 @@ fun TokenDiscoveryScreen() { } else { AppBarWithTitle( title = stringResource(R.string.title_discoverCurrencies), - isInModal = true, titleAlignment = Alignment.CenterHorizontally, backButton = true, onBackIconClicked = { navigator.pop() }, diff --git a/apps/flipcash/features/lab/src/main/kotlin/com/flipcash/app/lab/LabsScreen.kt b/apps/flipcash/features/lab/src/main/kotlin/com/flipcash/app/lab/LabsScreen.kt index e6c390c4f..e2ffb8e49 100644 --- a/apps/flipcash/features/lab/src/main/kotlin/com/flipcash/app/lab/LabsScreen.kt +++ b/apps/flipcash/features/lab/src/main/kotlin/com/flipcash/app/lab/LabsScreen.kt @@ -27,7 +27,6 @@ fun LabsScreen(onboarding: Boolean = false) { AppBarWithTitle( title = stringResource(R.string.title_betaFlags), titleAlignment = Alignment.CenterHorizontally, - isInModal = true, endContent = { AppBarDefaults.Close { navigator.hide() } } @@ -37,7 +36,6 @@ fun LabsScreen(onboarding: Boolean = false) { title = stringResource(R.string.title_betaFlags), titleAlignment = Alignment.CenterHorizontally, backButton = true, - isInModal = true, onBackIconClicked = navigator::pop ) } diff --git a/apps/flipcash/features/lab/src/main/kotlin/com/flipcash/app/lab/NavBarSettingsScreen.kt b/apps/flipcash/features/lab/src/main/kotlin/com/flipcash/app/lab/NavBarSettingsScreen.kt index f593d15e5..6770a5426 100644 --- a/apps/flipcash/features/lab/src/main/kotlin/com/flipcash/app/lab/NavBarSettingsScreen.kt +++ b/apps/flipcash/features/lab/src/main/kotlin/com/flipcash/app/lab/NavBarSettingsScreen.kt @@ -20,7 +20,6 @@ fun NavBarSettingsScreen() { AppBarWithTitle( title = "", titleAlignment = Alignment.CenterHorizontally, - isInModal = true, endContent = { AppBarDefaults.Close { dismiss() } } diff --git a/apps/flipcash/features/menu/src/main/kotlin/com/flipcash/app/menu/internal/MenuScreenContent.kt b/apps/flipcash/features/menu/src/main/kotlin/com/flipcash/app/menu/internal/MenuScreenContent.kt index 938f9ccdb..d078f138c 100644 --- a/apps/flipcash/features/menu/src/main/kotlin/com/flipcash/app/menu/internal/MenuScreenContent.kt +++ b/apps/flipcash/features/menu/src/main/kotlin/com/flipcash/app/menu/internal/MenuScreenContent.kt @@ -51,7 +51,6 @@ internal fun MenuScreenContent(viewModel: MenuScreenViewModel) { topBar = { AppBarWithTitle( modifier = Modifier.fillMaxWidth(), - isInModal = true, title = stringResource(R.string.title_settings), titleAlignment = Alignment.CenterHorizontally, endContent = { AppBarDefaults.Close { navigator.hide() } }, diff --git a/apps/flipcash/features/messenger/src/main/kotlin/com/flipcash/app/messenger/ChatAmountEntryScreen.kt b/apps/flipcash/features/messenger/src/main/kotlin/com/flipcash/app/messenger/ChatAmountEntryScreen.kt index 7daf061e4..289eaf32f 100644 --- a/apps/flipcash/features/messenger/src/main/kotlin/com/flipcash/app/messenger/ChatAmountEntryScreen.kt +++ b/apps/flipcash/features/messenger/src/main/kotlin/com/flipcash/app/messenger/ChatAmountEntryScreen.kt @@ -93,7 +93,6 @@ internal fun ChatAmountEntryContent( onChangeCurrency = { navigator.push(AppRoute.Main.RegionSelection) }, appBar = { AppBarWithTitle( - isInModal = true, title = { TokenSelectionPill(token) { navigator.push( diff --git a/apps/flipcash/features/myaccount/src/main/kotlin/com/flipcash/app/myaccount/MyAccountScreen.kt b/apps/flipcash/features/myaccount/src/main/kotlin/com/flipcash/app/myaccount/MyAccountScreen.kt index 3e73486cd..b5db14823 100644 --- a/apps/flipcash/features/myaccount/src/main/kotlin/com/flipcash/app/myaccount/MyAccountScreen.kt +++ b/apps/flipcash/features/myaccount/src/main/kotlin/com/flipcash/app/myaccount/MyAccountScreen.kt @@ -37,7 +37,6 @@ fun MyAccountScreen() { text = stringResource(R.string.title_myAccount), ) }, - isInModal = true, titleAlignment = Alignment.CenterHorizontally, leftIcon = { AppBarDefaults.UpNavigation { navigator.pop() } }, ) diff --git a/apps/flipcash/features/myaccount/src/main/kotlin/com/flipcash/app/myaccount/UserProfileScreen.kt b/apps/flipcash/features/myaccount/src/main/kotlin/com/flipcash/app/myaccount/UserProfileScreen.kt index 620bd0bb2..0ba098cd0 100644 --- a/apps/flipcash/features/myaccount/src/main/kotlin/com/flipcash/app/myaccount/UserProfileScreen.kt +++ b/apps/flipcash/features/myaccount/src/main/kotlin/com/flipcash/app/myaccount/UserProfileScreen.kt @@ -37,7 +37,6 @@ fun UserProfileScreen() { text = stringResource(R.string.title_userProfile), ) }, - isInModal = true, titleAlignment = Alignment.CenterHorizontally, leftIcon = { AppBarDefaults.UpNavigation { navigator.pop() } }, ) diff --git a/apps/flipcash/features/shareapp/src/main/kotlin/com/flipcash/app/shareapp/ShareAppScreen.kt b/apps/flipcash/features/shareapp/src/main/kotlin/com/flipcash/app/shareapp/ShareAppScreen.kt index d1c48d68c..13a6b62dd 100644 --- a/apps/flipcash/features/shareapp/src/main/kotlin/com/flipcash/app/shareapp/ShareAppScreen.kt +++ b/apps/flipcash/features/shareapp/src/main/kotlin/com/flipcash/app/shareapp/ShareAppScreen.kt @@ -21,7 +21,6 @@ fun ShareAppScreen() { modifier = androidx.compose.ui.Modifier.fillMaxSize(), ) { AppBarWithTitle( - isInModal = true, titleAlignment = androidx.compose.ui.Alignment.CenterHorizontally, endContent = { AppBarDefaults.Close { navigator.hide() } } ) diff --git a/apps/flipcash/features/tokens/src/main/kotlin/com/flipcash/app/tokens/PhantomWalletScreens.kt b/apps/flipcash/features/tokens/src/main/kotlin/com/flipcash/app/tokens/PhantomWalletScreens.kt index d6ee1bcd3..dc9fddeb3 100644 --- a/apps/flipcash/features/tokens/src/main/kotlin/com/flipcash/app/tokens/PhantomWalletScreens.kt +++ b/apps/flipcash/features/tokens/src/main/kotlin/com/flipcash/app/tokens/PhantomWalletScreens.kt @@ -58,7 +58,6 @@ internal fun PhantomConnectConfirmationScreen() { topBar = { AppBarWithTitle( title = stringResource(R.string.title_purchase), - isInModal = true, backButton = true, onBackIconClicked = { flowNavigator.back() }, titleAlignment = Alignment.CenterHorizontally, @@ -148,7 +147,6 @@ internal fun PhantomTransactionConfirmationScreen() { topBar = { AppBarWithTitle( title = stringResource(R.string.title_purchase), - isInModal = true, backButton = true, onBackIconClicked = { flowNavigator.back() }, titleAlignment = Alignment.CenterHorizontally, diff --git a/apps/flipcash/features/tokens/src/main/kotlin/com/flipcash/app/tokens/SwapEntryScreen.kt b/apps/flipcash/features/tokens/src/main/kotlin/com/flipcash/app/tokens/SwapEntryScreen.kt index f8e3a7d68..4972bbdcf 100644 --- a/apps/flipcash/features/tokens/src/main/kotlin/com/flipcash/app/tokens/SwapEntryScreen.kt +++ b/apps/flipcash/features/tokens/src/main/kotlin/com/flipcash/app/tokens/SwapEntryScreen.kt @@ -48,7 +48,6 @@ internal fun SwapEntryScreen( horizontalAlignment = Alignment.CenterHorizontally, ) { AppBarWithTitle( - isInModal = true, title = when (purpose) { is SwapPurpose.Buy if purpose.fundingSource != FundingSource.Flexible -> stringResource(R.string.title_amountToDeposit) diff --git a/apps/flipcash/features/tokens/src/main/kotlin/com/flipcash/app/tokens/TokenInfoScreen.kt b/apps/flipcash/features/tokens/src/main/kotlin/com/flipcash/app/tokens/TokenInfoScreen.kt index d073a323c..6aad0cf0b 100644 --- a/apps/flipcash/features/tokens/src/main/kotlin/com/flipcash/app/tokens/TokenInfoScreen.kt +++ b/apps/flipcash/features/tokens/src/main/kotlin/com/flipcash/app/tokens/TokenInfoScreen.kt @@ -52,7 +52,6 @@ fun TokenInfoScreen( val viewModel = hiltViewModel() val state by viewModel.stateFlow.collectAsStateWithLifecycle() AppBarWithTitle( - isInModal = true, title = { state.token.dataOrNull?.let { token -> TokenIconWithName( diff --git a/apps/flipcash/features/tokens/src/main/kotlin/com/flipcash/app/tokens/TokenSelectScreen.kt b/apps/flipcash/features/tokens/src/main/kotlin/com/flipcash/app/tokens/TokenSelectScreen.kt index 6a306b981..00b80431e 100644 --- a/apps/flipcash/features/tokens/src/main/kotlin/com/flipcash/app/tokens/TokenSelectScreen.kt +++ b/apps/flipcash/features/tokens/src/main/kotlin/com/flipcash/app/tokens/TokenSelectScreen.kt @@ -31,7 +31,6 @@ fun TokenSelectScreen(purpose: TokenPurpose) { horizontalAlignment = Alignment.CenterHorizontally, ) { AppBarWithTitle( - isInModal = true, title = stringResource(R.string.title_selectCurrency), backButton = true, onBackIconClicked = { navigator.pop() }, diff --git a/apps/flipcash/features/tokens/src/main/kotlin/com/flipcash/app/tokens/TokenSellReceiptScreen.kt b/apps/flipcash/features/tokens/src/main/kotlin/com/flipcash/app/tokens/TokenSellReceiptScreen.kt index 0c7380803..a9293236f 100644 --- a/apps/flipcash/features/tokens/src/main/kotlin/com/flipcash/app/tokens/TokenSellReceiptScreen.kt +++ b/apps/flipcash/features/tokens/src/main/kotlin/com/flipcash/app/tokens/TokenSellReceiptScreen.kt @@ -33,7 +33,6 @@ internal fun SellReceiptScreen() { horizontalAlignment = Alignment.CenterHorizontally, ) { AppBarWithTitle( - isInModal = true, title = stringResource(R.string.title_sellToken, state.tokenName), titleAlignment = Alignment.CenterHorizontally, backButton = true, diff --git a/apps/flipcash/features/tokens/src/main/kotlin/com/flipcash/app/tokens/internal/TokenTxProcessingScreen.kt b/apps/flipcash/features/tokens/src/main/kotlin/com/flipcash/app/tokens/internal/TokenTxProcessingScreen.kt index 327c19e69..ceda7c220 100644 --- a/apps/flipcash/features/tokens/src/main/kotlin/com/flipcash/app/tokens/internal/TokenTxProcessingScreen.kt +++ b/apps/flipcash/features/tokens/src/main/kotlin/com/flipcash/app/tokens/internal/TokenTxProcessingScreen.kt @@ -54,7 +54,6 @@ private fun TokenTxProcessingScreen( processingState = state.processingProgress, topBar = { AppBarWithTitle( - isInModal = true, title = when (val purpose = state.purpose) { is SwapPurpose.Buy if purpose.fundingSource != FundingSource.Flexible -> stringResource(R.string.title_depositingToken, state.tokenName) diff --git a/apps/flipcash/features/transactions/src/main/kotlin/com/flipcash/app/transactions/TransactionHistoryScreen.kt b/apps/flipcash/features/transactions/src/main/kotlin/com/flipcash/app/transactions/TransactionHistoryScreen.kt index 292863fa6..7249bed11 100644 --- a/apps/flipcash/features/transactions/src/main/kotlin/com/flipcash/app/transactions/TransactionHistoryScreen.kt +++ b/apps/flipcash/features/transactions/src/main/kotlin/com/flipcash/app/transactions/TransactionHistoryScreen.kt @@ -23,7 +23,6 @@ fun TransactionHistoryScreen(mint: Mint) { horizontalAlignment = Alignment.CenterHorizontally, ) { AppBarWithTitle( - isInModal = true, title = stringResource(R.string.title_transactionHistory), titleAlignment = Alignment.CenterHorizontally, backButton = true, diff --git a/apps/flipcash/features/userflags/src/main/kotlin/com/flipcash/app/userflags/UserFlagsScreen.kt b/apps/flipcash/features/userflags/src/main/kotlin/com/flipcash/app/userflags/UserFlagsScreen.kt index ff13297a6..a5dffbc3d 100644 --- a/apps/flipcash/features/userflags/src/main/kotlin/com/flipcash/app/userflags/UserFlagsScreen.kt +++ b/apps/flipcash/features/userflags/src/main/kotlin/com/flipcash/app/userflags/UserFlagsScreen.kt @@ -27,7 +27,6 @@ fun UserFlagsScreen() { title = stringResource(R.string.title_userFlags), titleAlignment = Alignment.CenterHorizontally, backButton = true, - isInModal = true, onBackIconClicked = navigator::pop, endContent = { AppBarDefaults.Reset { viewModel.dispatchEvent(UserFlagsViewModel.Event.Reset) } diff --git a/apps/flipcash/features/withdrawal/src/main/kotlin/com/flipcash/app/withdrawal/WithdrawalFlowScreen.kt b/apps/flipcash/features/withdrawal/src/main/kotlin/com/flipcash/app/withdrawal/WithdrawalFlowScreen.kt index 90e69bb2e..2e52df7fa 100644 --- a/apps/flipcash/features/withdrawal/src/main/kotlin/com/flipcash/app/withdrawal/WithdrawalFlowScreen.kt +++ b/apps/flipcash/features/withdrawal/src/main/kotlin/com/flipcash/app/withdrawal/WithdrawalFlowScreen.kt @@ -113,7 +113,6 @@ private fun WithdrawalSelectTokenScreen() { horizontalAlignment = Alignment.CenterHorizontally, ) { AppBarWithTitle( - isInModal = true, title = stringResource(R.string.title_selectCurrency), backButton = true, onBackIconClicked = { flowNavigator.back() }, diff --git a/apps/flipcash/features/withdrawal/src/main/kotlin/com/flipcash/app/withdrawal/internal/screens/UsdcWithdrawalInformationScreen.kt b/apps/flipcash/features/withdrawal/src/main/kotlin/com/flipcash/app/withdrawal/internal/screens/UsdcWithdrawalInformationScreen.kt index 5efe0d176..d4bc48723 100644 --- a/apps/flipcash/features/withdrawal/src/main/kotlin/com/flipcash/app/withdrawal/internal/screens/UsdcWithdrawalInformationScreen.kt +++ b/apps/flipcash/features/withdrawal/src/main/kotlin/com/flipcash/app/withdrawal/internal/screens/UsdcWithdrawalInformationScreen.kt @@ -40,7 +40,6 @@ internal fun UsdcWithdrawalInformationScreen(showOtherOptions: Boolean) { topBar = { AppBarWithTitle( title = stringResource(R.string.title_withdraw), - isInModal = true, backButton = true, onBackIconClicked = { flowNavigator.back() }, titleAlignment = Alignment.CenterHorizontally, diff --git a/apps/flipcash/features/withdrawal/src/main/kotlin/com/flipcash/app/withdrawal/internal/screens/WithdrawalConfirmationScreen.kt b/apps/flipcash/features/withdrawal/src/main/kotlin/com/flipcash/app/withdrawal/internal/screens/WithdrawalConfirmationScreen.kt index e970c470d..f9b4227d1 100644 --- a/apps/flipcash/features/withdrawal/src/main/kotlin/com/flipcash/app/withdrawal/internal/screens/WithdrawalConfirmationScreen.kt +++ b/apps/flipcash/features/withdrawal/src/main/kotlin/com/flipcash/app/withdrawal/internal/screens/WithdrawalConfirmationScreen.kt @@ -38,7 +38,6 @@ internal fun WithdrawalConfirmationScreen() { ) { AppBarWithTitle( title = stringResource(R.string.title_withdraw), - isInModal = true, titleAlignment = Alignment.CenterHorizontally, backButton = true, onBackIconClicked = { flowNavigator.back() }, diff --git a/apps/flipcash/features/withdrawal/src/main/kotlin/com/flipcash/app/withdrawal/internal/screens/WithdrawalDestinationScreen.kt b/apps/flipcash/features/withdrawal/src/main/kotlin/com/flipcash/app/withdrawal/internal/screens/WithdrawalDestinationScreen.kt index 5266e3979..4fa7a8847 100644 --- a/apps/flipcash/features/withdrawal/src/main/kotlin/com/flipcash/app/withdrawal/internal/screens/WithdrawalDestinationScreen.kt +++ b/apps/flipcash/features/withdrawal/src/main/kotlin/com/flipcash/app/withdrawal/internal/screens/WithdrawalDestinationScreen.kt @@ -29,7 +29,6 @@ internal fun WithdrawalDestinationScreen() { ) { AppBarWithTitle( title = stringResource(R.string.title_withdraw), - isInModal = true, titleAlignment = Alignment.CenterHorizontally, backButton = true, onBackIconClicked = { flowNavigator.back() }, diff --git a/apps/flipcash/features/withdrawal/src/main/kotlin/com/flipcash/app/withdrawal/internal/screens/WithdrawalEntryScreen.kt b/apps/flipcash/features/withdrawal/src/main/kotlin/com/flipcash/app/withdrawal/internal/screens/WithdrawalEntryScreen.kt index eedfc0a71..a1313e856 100644 --- a/apps/flipcash/features/withdrawal/src/main/kotlin/com/flipcash/app/withdrawal/internal/screens/WithdrawalEntryScreen.kt +++ b/apps/flipcash/features/withdrawal/src/main/kotlin/com/flipcash/app/withdrawal/internal/screens/WithdrawalEntryScreen.kt @@ -35,7 +35,6 @@ internal fun WithdrawalEntryScreen( ) { AppBarWithTitle( title = stringResource(R.string.title_withdraw), - isInModal = true, backButton = true, onBackIconClicked = { flowNavigator.back() }, titleAlignment = Alignment.CenterHorizontally, diff --git a/apps/flipcash/shared/amount-entry/src/main/kotlin/com/flipcash/shared/amountentry/AmountEntryScreen.kt b/apps/flipcash/shared/amount-entry/src/main/kotlin/com/flipcash/shared/amountentry/AmountEntryScreen.kt index 7db2943b5..70dfa92b2 100644 --- a/apps/flipcash/shared/amount-entry/src/main/kotlin/com/flipcash/shared/amountentry/AmountEntryScreen.kt +++ b/apps/flipcash/shared/amount-entry/src/main/kotlin/com/flipcash/shared/amountentry/AmountEntryScreen.kt @@ -1,7 +1,6 @@ package com.flipcash.shared.amountentry import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.navigationBarsPadding @@ -16,6 +15,7 @@ import com.getcode.theme.CodeTheme import com.getcode.ui.components.SlideToConfirm import com.getcode.ui.theme.ButtonState import com.getcode.ui.theme.CodeButton +import com.getcode.ui.theme.CodeScaffold @Composable fun AmountEntryScreen( @@ -27,15 +27,49 @@ fun AmountEntryScreen( val delegateState by controller.state.collectAsStateWithLifecycle() val config by controller.config.collectAsStateWithLifecycle() - Column( - modifier = Modifier.fillMaxSize(), - ) { - appBar?.invoke() + CodeScaffold( + topBar = { appBar?.invoke() }, + bottomBar = { + Box( + modifier = Modifier + .fillMaxWidth() + .navigationBarsPadding() + .fillMaxWidth() + .padding(horizontal = CodeTheme.dimens.inset) + .padding(bottom = CodeTheme.dimens.grid.x2), + ) { + when (config.action.style) { + ConfirmationStyle.Button -> { + CodeButton( + enabled = config.canConfirm && config.action.loadingState.isIdle, + modifier = Modifier.fillMaxWidth(), + buttonState = ButtonState.Filled, + isLoading = config.action.loadingState.loading, + isSuccess = config.action.loadingState.success, + text = config.action.label, + ) { + onConfirm() + } + } + ConfirmationStyle.Slide -> { + SlideToConfirm( + onConfirm = onConfirm, + modifier = Modifier.fillMaxWidth(), + enabled = config.canConfirm && config.action.loadingState.isIdle, + isLoading = config.action.loadingState.loading, + isSuccess = config.action.loadingState.success, + label = config.action.label, + ) + } + } + } + }, + ) { padding -> AmountWithKeypad( modifier = Modifier - .fillMaxWidth() - .weight(1f), + .fillMaxSize() + .padding(padding), amountAnimatedModel = delegateState.amountAnimatedModel, currencyFlag = delegateState.currency.selected?.resId, prefix = delegateState.currency.selected?.symbol.orEmpty(), @@ -53,41 +87,5 @@ fun AmountEntryScreen( onBackspace = { controller.onBackspace() }, onDecimal = { controller.onDecimal() }, ) - - Box(modifier = Modifier.fillMaxWidth()) { - when (config.action.style) { - ConfirmationStyle.Button -> { - CodeButton( - enabled = config.canConfirm && config.action.loadingState.isIdle, - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = CodeTheme.dimens.inset) - .padding(bottom = CodeTheme.dimens.grid.x2) - .navigationBarsPadding(), - buttonState = ButtonState.Filled, - isLoading = config.action.loadingState.loading, - isSuccess = config.action.loadingState.success, - text = config.action.label, - ) { - onConfirm() - } - } - - ConfirmationStyle.Slide -> { - SlideToConfirm( - onConfirm = onConfirm, - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = CodeTheme.dimens.inset) - .padding(bottom = CodeTheme.dimens.grid.x2) - .navigationBarsPadding(), - enabled = config.canConfirm && config.action.loadingState.isIdle, - isLoading = config.action.loadingState.loading, - isSuccess = config.action.loadingState.success, - label = config.action.label, - ) - } - } - } } } diff --git a/apps/flipcash/shared/permissions/src/main/kotlin/com/flipcash/app/permissions/internal/contacts/components/AnimatedContactListPreview.kt b/apps/flipcash/shared/permissions/src/main/kotlin/com/flipcash/app/permissions/internal/contacts/components/AnimatedContactListPreview.kt index 8cf1bb2c9..ac7560cdc 100644 --- a/apps/flipcash/shared/permissions/src/main/kotlin/com/flipcash/app/permissions/internal/contacts/components/AnimatedContactListPreview.kt +++ b/apps/flipcash/shared/permissions/src/main/kotlin/com/flipcash/app/permissions/internal/contacts/components/AnimatedContactListPreview.kt @@ -33,6 +33,7 @@ import com.flipcash.app.core.ui.ScreenFrame import com.getcode.theme.CodeTheme import com.getcode.theme.White20 import kotlinx.coroutines.delay +import kotlin.time.Duration.Companion.milliseconds private data class ContactRow(val nameFraction: Float, val subtitleFraction: Float) @@ -91,7 +92,7 @@ internal fun AnimatedContactListPreview(animate: Boolean = true) { LaunchedEffect(Unit) { if (animate) { - delay(300) + delay(300.milliseconds) alpha.animateTo(1f, tween(600)) } } diff --git a/apps/flipcash/shared/region-selection/ui/src/main/kotlin/com/flipcash/app/currency/RegionSelectionScreen.kt b/apps/flipcash/shared/region-selection/ui/src/main/kotlin/com/flipcash/app/currency/RegionSelectionScreen.kt index d7950f68c..9d49961ce 100644 --- a/apps/flipcash/shared/region-selection/ui/src/main/kotlin/com/flipcash/app/currency/RegionSelectionScreen.kt +++ b/apps/flipcash/shared/region-selection/ui/src/main/kotlin/com/flipcash/app/currency/RegionSelectionScreen.kt @@ -22,7 +22,6 @@ fun RegionSelectionScreen() { ) { AppBarWithTitle( title = stringResource(R.string.title_selectRegion), - isInModal = true, titleAlignment = Alignment.CenterHorizontally, backButton = true, onBackIconClicked = { diff --git a/apps/flipcash/shared/transfers/src/main/kotlin/com/flipcash/app/transfers/TransferInformationalScreen.kt b/apps/flipcash/shared/transfers/src/main/kotlin/com/flipcash/app/transfers/TransferInformationalScreen.kt index 40cf65ebf..08debb113 100644 --- a/apps/flipcash/shared/transfers/src/main/kotlin/com/flipcash/app/transfers/TransferInformationalScreen.kt +++ b/apps/flipcash/shared/transfers/src/main/kotlin/com/flipcash/app/transfers/TransferInformationalScreen.kt @@ -40,7 +40,6 @@ fun TransferInformationalScreen( title = direction.title, titleAlignment = Alignment.CenterHorizontally, backButton = true, - isInModal = true, onBackIconClicked = navigator::pop ) }, diff --git a/build.gradle.kts b/build.gradle.kts index 1f0c7fb16..a732502ba 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -41,6 +41,7 @@ allprojects { resolutionStrategy { force(libs.kotlinx.serialization.core.get().toString()) force(libs.kotlinx.serialization.json.get().toString()) + force(libs.kotlin.metadata.jvm.get().toString()) } } diff --git a/gradle/libs.versions.toml b/gradle/libs.versions.toml index 0dc2235ee..7e61f3f2c 100644 --- a/gradle/libs.versions.toml +++ b/gradle/libs.versions.toml @@ -91,6 +91,7 @@ bugsnag = "6.26.0" bugsnag-agp = "8.2.0" bugsnag-gradle-plugin = "1.1.0" rinku = "1.6.0" +compose-unstyled = "2.7.0" haze = "2.0.0-alpha03" cloudy = "0.5.0" phantom-connect-kmp = "2.0.2-1.0.0" @@ -162,6 +163,7 @@ hilt-android-test = { module = "com.google.dagger:hilt-android-testing", version hilt-nav-compose = { module = "androidx.hilt:hilt-navigation-compose", version.ref = "hilt-jetpack" } # Kotlin +kotlin-metadata-jvm = { module = "org.jetbrains.kotlin:kotlin-metadata-jvm", version.ref = "kotlin" } kotlin-stdlib = { module = "org.jetbrains.kotlin:kotlin-stdlib", version.ref = "kotlin" } kotlin-reflect = { module = "org.jetbrains.kotlin:kotlin-reflect", version.ref = "kotlin" } kotlin-test-junit = { module = "org.jetbrains.kotlin:kotlin-test-junit", version.ref = "kotlin" } @@ -263,6 +265,7 @@ haze-blur = { module = "dev.chrisbanes.haze:haze-blur", version.ref = "haze" } haze-materials = { module = "dev.chrisbanes.haze:haze-blur-materials", version.ref = "haze" } phantom-connect = { module = "dev.bmcreations:phantom-connect", version.ref = "phantom-connect-kmp" } phantom-connect-wallet = { module = "dev.bmcreations:phantom-connect-wallet", version.ref = "phantom-connect-kmp" } +compose-unstyled-bottom-sheet = { module = "com.composables:composeunstyled-bottom-sheet", version.ref = "compose-unstyled" } rinku = { module = "dev.theolm:rinku", version.ref = "rinku" } rinku-compose = { module = "dev.theolm:rinku-compose-ext", version.ref = "rinku" } event-bus = { module = "io.github.hoc081098:channel-event-bus", version.ref = "event-bus" } diff --git a/ui/components/src/main/kotlin/com/getcode/ui/components/TitleBar.kt b/ui/components/src/main/kotlin/com/getcode/ui/components/TitleBar.kt index 55abfaac3..44e86486c 100644 --- a/ui/components/src/main/kotlin/com/getcode/ui/components/TitleBar.kt +++ b/ui/components/src/main/kotlin/com/getcode/ui/components/TitleBar.kt @@ -7,6 +7,7 @@ import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.requiredSize +import androidx.compose.foundation.layout.statusBars import androidx.compose.foundation.layout.statusBarsIgnoringVisibility import androidx.compose.foundation.layout.windowInsetsPadding import androidx.compose.material3.Icon @@ -29,9 +30,9 @@ import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.dp import com.getcode.navigation.flow.FlowDismissStyle import com.getcode.navigation.flow.LocalFlowDismissStyle +import com.getcode.navigation.scenes.LocalSheetNavigator import com.getcode.theme.CodeTheme import com.getcode.theme.DesignSystem -import com.getcode.ui.core.addIf import com.getcode.ui.utils.calculateHorizontalPadding import kotlin.math.max @@ -154,7 +155,6 @@ object AppBarDefaults { @Composable fun AppBarWithTitle( modifier: Modifier = Modifier, - isInModal: Boolean = false, title: String = "", titleAlignment: Alignment.Horizontal = Alignment.Start, contentPadding: PaddingValues = AppBarDefaults.ContentPadding, @@ -167,7 +167,6 @@ fun AppBarWithTitle( TopAppBarBase( modifier = modifier, - isInModal = isInModal, contentPadding = contentPadding, leftIcon = { if (backButton && !showClose) { @@ -189,7 +188,6 @@ fun AppBarWithTitle( @Composable fun AppBarWithTitle( modifier: Modifier = Modifier, - isInModal: Boolean = false, title: String = "", contentPadding: PaddingValues = AppBarDefaults.ContentPadding, titleAlignment: Alignment.Horizontal = Alignment.Start, @@ -198,7 +196,6 @@ fun AppBarWithTitle( ) { TopAppBarBase( modifier = modifier, - isInModal = isInModal, leftIcon = startContent, contentPadding = contentPadding, titleRegion = { @@ -212,7 +209,6 @@ fun AppBarWithTitle( @Composable fun AppBarWithTitle( modifier: Modifier = Modifier, - isInModal: Boolean = false, title: @Composable () -> Unit, titleAlignment: Alignment.Horizontal = Alignment.Start, contentPadding: PaddingValues = AppBarDefaults.ContentPadding, @@ -221,7 +217,6 @@ fun AppBarWithTitle( ) { TopAppBarBase( modifier = modifier, - isInModal = isInModal, leftIcon = leftIcon, rightContents = rightContents, contentPadding = contentPadding, @@ -234,7 +229,6 @@ fun AppBarWithTitle( @Composable private fun TopAppBarBase( modifier: Modifier = Modifier, - isInModal: Boolean = false, contentPadding: PaddingValues = AppBarDefaults.ContentPadding, leftIcon: @Composable () -> Unit = { }, titleRegion: @Composable () -> Unit = { }, @@ -262,9 +256,15 @@ private fun TopAppBarBase( } + val isInsideSheet = LocalSheetNavigator.current != null + SubcomposeLayout( modifier = modifier - .addIf(!isInModal) { Modifier.windowInsetsPadding(WindowInsets.statusBarsIgnoringVisibility) } + .then( + if (!isInsideSheet) { + Modifier.windowInsetsPadding(WindowInsets.statusBars) + } else Modifier + ) .height(56.dp), ) { constraints -> // Measure left icon, if provided diff --git a/ui/components/src/main/kotlin/com/getcode/ui/theme/CodeButton.kt b/ui/components/src/main/kotlin/com/getcode/ui/theme/CodeButton.kt index 96b800840..511f5f181 100644 --- a/ui/components/src/main/kotlin/com/getcode/ui/theme/CodeButton.kt +++ b/ui/components/src/main/kotlin/com/getcode/ui/theme/CodeButton.kt @@ -344,7 +344,7 @@ fun CodeButton( Box( modifier = Modifier .addIf(size.isSpecified) { Modifier.size(size) } - .addIf(size.isUnspecified) { Modifier.measured { size = it } } + .addIf(size.isUnspecified) { Modifier.measured { if (it.width > 0.dp && it.height > 0.dp) size = it } } .width(IntrinsicSize.Max) .height(IntrinsicSize.Min) ) { diff --git a/ui/navigation/build.gradle.kts b/ui/navigation/build.gradle.kts index 240738d43..b18bd1ff5 100644 --- a/ui/navigation/build.gradle.kts +++ b/ui/navigation/build.gradle.kts @@ -19,6 +19,7 @@ dependencies { implementation(project(":ui:theme")) implementation(libs.compose.material3) + implementation(libs.compose.unstyled.bottom.sheet) implementation(libs.compose.activities) implementation(libs.bundles.kotlinx.serialization) implementation(libs.kotlin.reflect) diff --git a/ui/navigation/src/main/kotlin/com/getcode/navigation/scenes/ModalBottomSheetSceneStrategy.kt b/ui/navigation/src/main/kotlin/com/getcode/navigation/scenes/ModalBottomSheetSceneStrategy.kt index b859c30dc..81ad1b8aa 100644 --- a/ui/navigation/src/main/kotlin/com/getcode/navigation/scenes/ModalBottomSheetSceneStrategy.kt +++ b/ui/navigation/src/main/kotlin/com/getcode/navigation/scenes/ModalBottomSheetSceneStrategy.kt @@ -2,17 +2,14 @@ package com.getcode.navigation.scenes import android.os.Build import android.os.Parcelable +import androidx.activity.compose.BackHandler import androidx.compose.animation.SharedTransitionLayout +import androidx.compose.foundation.background import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.WindowInsets import androidx.compose.foundation.layout.fillMaxHeight +import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.material3.ExperimentalMaterial3Api -import androidx.compose.material3.ModalBottomSheet -import androidx.compose.material3.ModalBottomSheetProperties -import androidx.compose.material3.SheetState -import androidx.compose.material3.SheetValue -import androidx.compose.material3.rememberModalBottomSheetState +import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.runtime.Composable import androidx.compose.runtime.CompositionLocalProvider import androidx.compose.runtime.LaunchedEffect @@ -21,20 +18,25 @@ import androidx.compose.runtime.SideEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.key import androidx.compose.runtime.mutableStateOf -import androidx.compose.runtime.remember import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.runtime.saveable.rememberSaveable import androidx.compose.runtime.setValue import androidx.compose.runtime.snapshots.Snapshot import androidx.compose.runtime.staticCompositionLocalOf import androidx.compose.ui.Modifier +import androidx.compose.ui.draw.clip import androidx.compose.ui.platform.LocalView +import androidx.compose.ui.unit.dp import androidx.navigation3.runtime.NavEntry import androidx.navigation3.runtime.NavKey import androidx.navigation3.scene.OverlayScene import androidx.navigation3.scene.Scene import androidx.navigation3.scene.SceneStrategy import androidx.navigation3.scene.SceneStrategyScope +import com.composeunstyled.Sheet +import com.composeunstyled.SheetDetent +import com.composeunstyled.UnstyledBottomSheet +import com.composeunstyled.rememberBottomSheetState import com.getcode.animation.LocalSharedTransitionScope import com.getcode.navigation.NavMetadataKeys import com.getcode.navigation.core.CodeNavigator @@ -43,22 +45,29 @@ import com.getcode.navigation.results.NavResultKey import com.getcode.navigation.results.NavResultOrCanceled import com.getcode.navigation.results.NavResultStore import com.getcode.navigation.results.NavigationRetVal -import com.getcode.navigation.scenes.ModalBottomSheetSceneStrategy.Companion.modalBottomSheet import com.getcode.navigation.scrim.LocalScrimController import com.getcode.navigation.scrim.ScrimOverlay import com.getcode.theme.CodeTheme +import com.getcode.ui.core.noRippleClickable import com.getcode.ui.utils.LocalSheetGesturesState import kotlinx.coroutines.launch -// Adapted from code courtesy of https://github.com/android/nav3-recipes/pull/67 +data class BottomSheetProperties( + val dismissOnBackPress: Boolean = true, + val dismissOnClickOutside: Boolean = true, +) -/** An [OverlayScene] that renders an [entry] within a [ModalBottomSheet]. */ -internal class ModalBottomSheetScene @OptIn(ExperimentalMaterial3Api::class) constructor( +private val Expanded = SheetDetent("expanded") { containerHeight, _ -> + containerHeight * 0.925f +} + +/** An [OverlayScene] that renders an [entry] within an [UnstyledBottomSheet]. */ +internal class ModalBottomSheetScene constructor( override val key: T, override val previousEntries: List>, override val overlaidEntries: List>, private val entry: NavEntry, - private val modalBottomSheetProperties: ModalBottomSheetProperties, + private val sheetProperties: BottomSheetProperties, private val onBack: () -> Unit, override val metadata: Map, private val navResultStore: NavResultStore, @@ -77,23 +86,19 @@ internal class ModalBottomSheetScene @OptIn(ExperimentalMaterial3Api::c override fun hashCode(): Int = key.hashCode() - @OptIn(ExperimentalMaterial3Api::class) override val content: @Composable (() -> Unit) = { - // Scope composition by the scene key so that rememberModalBottomSheetState - // (which uses rememberSaveable) creates a fresh SheetState when the route changes. - // - // NOTE: sheetGeneration is intentionally NOT part of this key. Putting it here - // causes the key() block to re-key while the old scene is still composing - // (during the pendingDismiss finally block), which creates a second - // ModalBottomSheet popup for the same SaveableStateProvider key → crash. - // Instead, sheetGeneration is used as the LaunchedEffect key for show() so - // same-route dismiss-replace re-shows the sheet without recreating the scope. val navigator = LocalCodeNavigator.current key(key) { val isNonDismissable = (metadata[NavMetadataKeys.IsNonDismissable.key] as? Boolean ?: false) || navigator.sheetDismissDisabled + val effectiveProperties = if (isNonDismissable) { + BottomSheetProperties(dismissOnBackPress = false, dismissOnClickOutside = false) + } else { + sheetProperties + } + val handleBackResult = { val navResultKey = metadata[NavMetadataKeys.NavResultKey.key] as? NavResultKey, Parcelable> @@ -108,32 +113,31 @@ internal class ModalBottomSheetScene @OptIn(ExperimentalMaterial3Api::c } } - var allowDismiss by rememberSaveable { mutableStateOf(!navigator.sheetDragDisabled) } - var confirmHiddenCalled by remember { mutableStateOf(false) } - var sheetState: SheetState = rememberModalBottomSheetState( - skipPartiallyExpanded = true, - confirmValueChange = { value -> - val allowed = value != SheetValue.Hidden || allowDismiss - if (value == SheetValue.Hidden && allowed) { - confirmHiddenCalled = true - } - allowed - } + var allowDismiss by rememberSaveable { mutableStateOf(!isNonDismissable && !navigator.sheetDragDisabled) } + + val isWrapContent = + metadata[NavMetadataKeys.IsWrapContentSheet.key] as? Boolean ?: false + + val sheetState = rememberBottomSheetState( + initialDetent = SheetDetent.Hidden, + detents = listOf(SheetDetent.Hidden, Expanded), + confirmDetentChange = { detent -> + detent != SheetDetent.Hidden || allowDismiss + }, ) - // Show the sheet on initial composition AND after same-route - // dismiss-replace (where sheetGeneration increments but the scene - // key stays the same, so rememberSaveable restores the Hidden state). + // Animate the sheet in on first composition and after + // same-route dismiss-replace (sheetGeneration increments). LaunchedEffect(navigator.sheetGeneration) { - sheetState.show() + sheetState.animateTo(Expanded) } val composeScope = rememberCoroutineScope() val dismiss = { hide: Boolean -> - if (hide && sheetState.isVisible) { + if (hide && sheetState.currentDetent != SheetDetent.Hidden) { composeScope.launch { - sheetState.hide() + sheetState.animateTo(SheetDetent.Hidden) }.invokeOnCompletion { handleBackResult() onBack() @@ -145,21 +149,12 @@ internal class ModalBottomSheetScene @OptIn(ExperimentalMaterial3Api::c } // Observe external dismiss requests (e.g. deeplink replacing current sheet). - // Reading pendingSheetDismiss registers a snapshot read — when navigateTo sets it, - // Compose guarantees recomposition (no coroutine dispatch ordering ambiguity). val pendingDismiss = navigator.pendingSheetDismiss if (pendingDismiss != null) { LaunchedEffect(pendingDismiss) { try { - sheetState.hide() + sheetState.animateTo(SheetDetent.Hidden) } finally { - // Apply all changes atomically so Compose never sees an - // intermediate state where the old sheet is removed but - // sheetGeneration hasn't incremented yet. Without this, - // the key(key, sheetGeneration) block can recompose and - // create a second ModalBottomSheet popup for the same key - // before the old one is destroyed → SaveableStateProvider - // duplicate-key crash. Snapshot.withMutableSnapshot { handleBackResult() onBack() @@ -178,75 +173,68 @@ internal class ModalBottomSheetScene @OptIn(ExperimentalMaterial3Api::c }, LocalScrimController provides scrim, ) { - // Remove inset padding. Default adds nav bar padding. - // Remove grab bar for bleed to top edge of sheet - ModalBottomSheet( - sheetState = sheetState, - onDismissRequest = { - if (!isNonDismissable) { - if (navigator.pendingSheetDismiss != null) { - // External dismiss in progress (e.g. sheet replacement via - // openAsSheet). The pendingDismiss handler's finally block - // owns the onBack() call — don't let onDismissRequest also - // call it, which would remove the sheet prematurely while - // the handler is still running. - confirmHiddenCalled = false - } else if (confirmHiddenCalled) { - confirmHiddenCalled = false - dismiss(false) - } else { - // Spurious Hidden snap from layout anchor recalculation - // (trySnapTo bypasses confirmValueChange) — re-show the sheet - composeScope.launch { sheetState.show() } - } - } - }, - sheetGesturesEnabled = !navigator.sheetDragDisabled && !scrim.visible, - scrimColor = CodeTheme.colors.scrim, - properties = if (isNonDismissable) { - ModalBottomSheetProperties( - shouldDismissOnBackPress = false, - shouldDismissOnClickOutside = false, + BackHandler(enabled = effectiveProperties.dismissOnBackPress) { + dismiss(true) + } + + // Force light status bar icons in the sheet overlay + val view = LocalView.current + SideEffect { + if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { + view.rootView.windowInsetsController?.setSystemBarsAppearance( + 0, // clear → light (white) icons + android.view.WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS, ) - } else modalBottomSheetProperties, - dragHandle = null, - contentWindowInsets = { WindowInsets() }, - containerColor = CodeTheme.colors.surface, - ) { - // The sheet's popup window defaults to dark (black) status bar icons. - // Force light icons so they're visible against the dark scrim. - val view = LocalView.current - SideEffect { - if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.R) { - view.rootView.windowInsetsController?.setSystemBarsAppearance( - 0, // clear light status bars flag → light (white) icons - android.view.WindowInsetsController.APPEARANCE_LIGHT_STATUS_BARS, - ) - } } - val isWrapContent = - metadata[NavMetadataKeys.IsWrapContentSheet.key] as? Boolean ?: false + } + + Box(Modifier.fillMaxSize()) { + // Scrim tracks sheet position + val scrimProgress = sheetState.progress(SheetDetent.Hidden, Expanded) + val scrimBaseColor = CodeTheme.colors.scrim Box( modifier = Modifier - .fillMaxWidth() + .fillMaxSize() + .background(scrimBaseColor.copy(alpha = scrimBaseColor.alpha * scrimProgress)) .then( - if (!isWrapContent) { - Modifier.fillMaxHeight(CodeTheme.dimens.modalHeightRatio) - } else { - Modifier - } - ) + if (effectiveProperties.dismissOnClickOutside) { + Modifier.noRippleClickable { dismiss(true) } + } else Modifier + ), + ) + + UnstyledBottomSheet( + state = sheetState, + modifier = Modifier.fillMaxSize(), + enabled = !navigator.sheetDragDisabled && !scrim.visible, ) { - SharedTransitionLayout { - CompositionLocalProvider( - LocalBottomSheetDismissDispatcher provides { dismiss(true) }, - LocalSheetNavigator provides navigator, - LocalSharedTransitionScope provides this, + Sheet( + modifier = Modifier + .fillMaxWidth() + .clip(RoundedCornerShape(topStart = 28.dp, topEnd = 28.dp)) + .background(CodeTheme.colors.surface), + ) { + Box( + modifier = Modifier + .fillMaxWidth() + .then( + if (!isWrapContent) { + Modifier.fillMaxHeight() + } else Modifier + ), ) { - entry.Content() - } - if (!isWrapContent) { - ScrimOverlay(scrim) + SharedTransitionLayout { + CompositionLocalProvider( + LocalBottomSheetDismissDispatcher provides { dismiss(true) }, + LocalSheetNavigator provides navigator, + LocalSharedTransitionScope provides this, + ) { + entry.Content() + } + if (!isWrapContent) { + ScrimOverlay(scrim) + } + } } } } @@ -258,7 +246,7 @@ internal class ModalBottomSheetScene @OptIn(ExperimentalMaterial3Api::c /** * A [SceneStrategy] that displays entries that have added [modalBottomSheet] to their [NavEntry.metadata] - * within a [ModalBottomSheet] instance. + * within a bottom sheet instance. * * This strategy should always be added before any non-overlay scene strategies. */ @@ -267,7 +255,6 @@ class ModalBottomSheetSceneStrategy( private val lastNavKey: () -> NavKey?, ) : SceneStrategy { - @OptIn(ExperimentalMaterial3Api::class) override fun SceneStrategyScope.calculateScene( entries: List>, ): Scene? { @@ -275,29 +262,26 @@ class ModalBottomSheetSceneStrategy( val isSheet = lastEntry.metadata[NavMetadataKeys.IsSheet.key] as? Boolean ?: false if (!isSheet) return null - // Keep all entries unless solitary; for inner sheets, retain other inner sheet entries val overlaidEntries = entries.dropLast(1).let { remainingEntries -> if (lastEntry.metadata[NavMetadataKeys.IsSolitarySheet.key] == true) { - // Drop all sheet entries for solitary sheets remainingEntries.dropLastWhile { it.metadata.getOrDefault(NavMetadataKeys.IsSheet.key, false) as Boolean } } else { - // Keep all entries to allow intra-sheet navigation remainingEntries } }.ifEmpty { return null } - val bottomSheetProperties = - lastEntry.metadata[BOTTOM_SHEET_KEY] as? ModalBottomSheetProperties - ?: ModalBottomSheetProperties() + val sheetProperties = + lastEntry.metadata[BOTTOM_SHEET_KEY] as? BottomSheetProperties + ?: BottomSheetProperties() @Suppress("UNCHECKED_CAST") return ModalBottomSheetScene( key = lastEntry.contentKey as T, previousEntries = entries.dropLast(1).ifEmpty { return null }, overlaidEntries = overlaidEntries, - modalBottomSheetProperties = bottomSheetProperties, + sheetProperties = sheetProperties, entry = lastEntry, onBack = onBack, metadata = lastEntry.metadata, @@ -307,17 +291,9 @@ class ModalBottomSheetSceneStrategy( } companion object { - /** - * Function to be called on the [NavEntry.metadata] to mark this entry as something that - * should be displayed within a [ModalBottomSheet]. - * - * @param modalBottomSheetProperties properties that should be passed to the containing - * [ModalBottomSheet]. - */ - @OptIn(ExperimentalMaterial3Api::class) fun modalBottomSheet( - modalBottomSheetProperties: ModalBottomSheetProperties = ModalBottomSheetProperties(), - ): Map = mapOf(BOTTOM_SHEET_KEY to modalBottomSheetProperties) + properties: BottomSheetProperties = BottomSheetProperties(), + ): Map = mapOf(BOTTOM_SHEET_KEY to properties) internal const val BOTTOM_SHEET_KEY = "bottomsheet" }