From 97fe33355aca4e93220c17f941d9761d29a5cc97 Mon Sep 17 00:00:00 2001 From: "claude[bot]" <41898282+claude[bot]@users.noreply.github.com> Date: Thu, 15 Jan 2026 12:42:55 +0000 Subject: [PATCH 1/3] =?UTF-8?q?feat:=20nav=20to=20coming=20soon=20from=20s?= =?UTF-8?q?end=20=E2=86=92=20contacts?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../to/bitkit/ui/screens/wallets/send/SendRecipientScreen.kt | 4 +--- app/src/main/java/to/bitkit/viewmodels/AppViewModel.kt | 2 ++ 2 files changed, 3 insertions(+), 3 deletions(-) diff --git a/app/src/main/java/to/bitkit/ui/screens/wallets/send/SendRecipientScreen.kt b/app/src/main/java/to/bitkit/ui/screens/wallets/send/SendRecipientScreen.kt index ea965d6a6..26e487a9d 100644 --- a/app/src/main/java/to/bitkit/ui/screens/wallets/send/SendRecipientScreen.kt +++ b/app/src/main/java/to/bitkit/ui/screens/wallets/send/SendRecipientScreen.kt @@ -258,9 +258,7 @@ fun SendRecipientScreen( galleryLauncher.launch("image/*") } }, - onClickContact = { - app?.toast(AppError("Coming soon: Contact")) - }, + onClickContact = { onEvent(SendEvent.Contacts) }, onClickPaste = { onEvent(SendEvent.Paste) }, onClickManual = { onEvent(SendEvent.EnterManually) }, cameraPermissionGranted = cameraPermissionState.status.isGranted, diff --git a/app/src/main/java/to/bitkit/viewmodels/AppViewModel.kt b/app/src/main/java/to/bitkit/viewmodels/AppViewModel.kt index afab19013..407e367e3 100644 --- a/app/src/main/java/to/bitkit/viewmodels/AppViewModel.kt +++ b/app/src/main/java/to/bitkit/viewmodels/AppViewModel.kt @@ -649,6 +649,7 @@ class AppViewModel @Inject constructor( SendEvent.ClearPayConfirmation -> _sendUiState.update { s -> s.copy(shouldConfirmPay = false) } SendEvent.BackToAmount -> setSendEffect(SendEffect.PopBack(SendRoute.Amount)) SendEvent.NavToAddress -> setSendEffect(SendEffect.NavigateToAddress) + SendEvent.Contacts -> mainScreenEffect(MainScreenEffect.Navigate(Routes.Contacts)) } } } @@ -2124,6 +2125,7 @@ sealed interface SendEvent { data object ClearPayConfirmation : SendEvent data object BackToAmount : SendEvent data object NavToAddress : SendEvent + data object Contacts : SendEvent } sealed interface LnurlParams { From b66f29113a75646d35da72022a56082c66647072 Mon Sep 17 00:00:00 2001 From: Ovi Trif Date: Thu, 15 Jan 2026 23:42:43 +0100 Subject: [PATCH 2/3] fix: show coming soon within send sheet Co-Authored-By: Claude Opus 4.5 --- .../java/to/bitkit/ui/sheets/SendSheet.kt | 64 +++++++++++++++++++ .../java/to/bitkit/viewmodels/AppViewModel.kt | 3 +- 2 files changed, 66 insertions(+), 1 deletion(-) diff --git a/app/src/main/java/to/bitkit/ui/sheets/SendSheet.kt b/app/src/main/java/to/bitkit/ui/sheets/SendSheet.kt index 5c4f49e59..b6c572792 100644 --- a/app/src/main/java/to/bitkit/ui/sheets/SendSheet.kt +++ b/app/src/main/java/to/bitkit/ui/sheets/SendSheet.kt @@ -1,25 +1,36 @@ package to.bitkit.ui.sheets +import androidx.compose.foundation.Image import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.imePadding import androidx.compose.foundation.layout.navigationBarsPadding +import androidx.compose.foundation.layout.padding import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.platform.testTag +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.unit.dp import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.navigation.compose.NavHost import androidx.navigation.compose.rememberNavController import androidx.navigation.toRoute import kotlinx.serialization.Serializable +import to.bitkit.R import to.bitkit.models.NewTransactionSheetDetails import to.bitkit.models.NewTransactionSheetDirection import to.bitkit.models.NewTransactionSheetType +import to.bitkit.ui.components.BodyM +import to.bitkit.ui.components.Display +import to.bitkit.ui.components.PrimaryButton +import to.bitkit.ui.components.VerticalSpacer +import to.bitkit.ui.scaffold.SheetTopBar import to.bitkit.ui.screens.scanner.QrScanningScreen import to.bitkit.ui.screens.wallets.send.AddTagScreen import to.bitkit.ui.screens.wallets.send.PIN_CHECK_RESULT_KEY @@ -39,8 +50,10 @@ import to.bitkit.ui.screens.wallets.withdraw.WithdrawErrorScreen import to.bitkit.ui.settings.support.SupportScreen import to.bitkit.ui.shared.modifiers.sheetHeight import to.bitkit.ui.shared.util.gradientBackground +import to.bitkit.ui.theme.Colors import to.bitkit.ui.utils.composableWithDefaultTransitions import to.bitkit.ui.utils.navigationWithDefaultTransitions +import to.bitkit.ui.utils.withAccent import to.bitkit.viewmodels.AppViewModel import to.bitkit.viewmodels.SendEffect import to.bitkit.viewmodels.SendEvent @@ -88,6 +101,7 @@ fun SendSheet( is SendEffect.NavigateToWithdrawError -> navController.navigate(SendRoute.WithdrawError) is SendEffect.NavigateToFee -> navController.navigate(SendRoute.FeeRate) is SendEffect.NavigateToFeeCustom -> navController.navigate(SendRoute.FeeCustom) + is SendEffect.NavigateToComingSoon -> navController.navigate(SendRoute.ComingSoon) } } } @@ -266,6 +280,11 @@ fun SendSheet( } ) } + composableWithDefaultTransitions { + ComingSoonSheetContent( + onBackClick = { navController.popBackStack() } + ) + } composableWithDefaultTransitions { val route = it.toRoute() SendErrorScreen( @@ -337,6 +356,51 @@ sealed interface SendRoute { @Serializable data object Success : SendRoute + @Serializable + data object ComingSoon : SendRoute + @Serializable data class Error(val errorMessage: String) : SendRoute } + +@Composable +private fun ComingSoonSheetContent( + onBackClick: () -> Unit, +) { + Column( + modifier = Modifier + .fillMaxSize() + .gradientBackground() + .navigationBarsPadding() + ) { + SheetTopBar( + titleText = stringResource(R.string.coming_soon__title), + onBack = onBackClick + ) + + Column( + modifier = Modifier.padding(horizontal = 32.dp) + ) { + Image( + painter = painterResource(R.drawable.img_cronometer), + contentDescription = null, + modifier = Modifier + .fillMaxWidth() + .weight(1f) + ) + + Display( + text = stringResource(R.string.coming_soon__headline).withAccent(accentColor = Colors.Brand), + color = Colors.White + ) + VerticalSpacer(8.dp) + BodyM(text = stringResource(R.string.coming_soon__description), color = Colors.White64) + VerticalSpacer(54.dp) + PrimaryButton( + text = stringResource(R.string.coming_soon__button), + onClick = onBackClick, + ) + VerticalSpacer(16.dp) + } + } +} diff --git a/app/src/main/java/to/bitkit/viewmodels/AppViewModel.kt b/app/src/main/java/to/bitkit/viewmodels/AppViewModel.kt index 407e367e3..1ab32133b 100644 --- a/app/src/main/java/to/bitkit/viewmodels/AppViewModel.kt +++ b/app/src/main/java/to/bitkit/viewmodels/AppViewModel.kt @@ -649,7 +649,7 @@ class AppViewModel @Inject constructor( SendEvent.ClearPayConfirmation -> _sendUiState.update { s -> s.copy(shouldConfirmPay = false) } SendEvent.BackToAmount -> setSendEffect(SendEffect.PopBack(SendRoute.Amount)) SendEvent.NavToAddress -> setSendEffect(SendEffect.NavigateToAddress) - SendEvent.Contacts -> mainScreenEffect(MainScreenEffect.Navigate(Routes.Contacts)) + SendEvent.Contacts -> setSendEffect(SendEffect.NavigateToComingSoon) } } } @@ -2085,6 +2085,7 @@ sealed class SendEffect { data object NavigateToQuickPay : SendEffect() data object NavigateToFee : SendEffect() data object NavigateToFeeCustom : SendEffect() + data object NavigateToComingSoon : SendEffect() data class PaymentSuccess(val sheet: NewTransactionSheetDetails? = null) : SendEffect() } From c320557830ef80c16ab51d32211e7a6d57c3accd Mon Sep 17 00:00:00 2001 From: Ovi Trif Date: Fri, 16 Jan 2026 11:33:15 +0100 Subject: [PATCH 3/3] feat: coming soon sheet content preview & cleanup --- .../ui/sheets/ComingSoonSheetContent.kt | 78 +++++++++++++++++++ .../java/to/bitkit/ui/sheets/SendSheet.kt | 57 +------------- 2 files changed, 79 insertions(+), 56 deletions(-) create mode 100644 app/src/main/java/to/bitkit/ui/sheets/ComingSoonSheetContent.kt diff --git a/app/src/main/java/to/bitkit/ui/sheets/ComingSoonSheetContent.kt b/app/src/main/java/to/bitkit/ui/sheets/ComingSoonSheetContent.kt new file mode 100644 index 000000000..cacd8cdfc --- /dev/null +++ b/app/src/main/java/to/bitkit/ui/sheets/ComingSoonSheetContent.kt @@ -0,0 +1,78 @@ +package to.bitkit.ui.sheets + +import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxSize +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.navigationBarsPadding +import androidx.compose.foundation.layout.padding +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.testTag +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import to.bitkit.R +import to.bitkit.ui.components.BodyM +import to.bitkit.ui.components.BottomSheetPreview +import to.bitkit.ui.components.Display +import to.bitkit.ui.components.PrimaryButton +import to.bitkit.ui.components.VerticalSpacer +import to.bitkit.ui.scaffold.SheetTopBar +import to.bitkit.ui.shared.modifiers.sheetHeight +import to.bitkit.ui.shared.util.gradientBackground +import to.bitkit.ui.theme.AppThemeSurface +import to.bitkit.ui.theme.Colors +import to.bitkit.ui.utils.withAccent + +@Composable +fun ComingSoonSheetContent( + onBack: () -> Unit, + modifier: Modifier = Modifier, +) { + Column( + modifier = modifier + .fillMaxSize() + .gradientBackground() + .navigationBarsPadding() + .testTag("ComingSoonSheet") + ) { + SheetTopBar(titleText = stringResource(R.string.coming_soon__title), onBack = onBack) + Column( + modifier = Modifier.padding(horizontal = 32.dp) + ) { + Image( + painter = painterResource(R.drawable.img_cronometer), + contentDescription = null, + modifier = Modifier + .fillMaxWidth() + .weight(1f) + ) + Display( + text = stringResource(R.string.coming_soon__headline).withAccent(accentColor = Colors.Brand), + color = Colors.White, + ) + VerticalSpacer(8.dp) + BodyM(text = stringResource(R.string.coming_soon__description), color = Colors.White64) + VerticalSpacer(54.dp) + PrimaryButton( + text = stringResource(R.string.coming_soon__button), + onClick = onBack, + ) + } + } +} + +@Preview(showSystemUi = true) +@Composable +private fun Preview() { + AppThemeSurface { + BottomSheetPreview { + ComingSoonSheetContent( + onBack = {}, + modifier = Modifier.sheetHeight(), + ) + } + } +} diff --git a/app/src/main/java/to/bitkit/ui/sheets/SendSheet.kt b/app/src/main/java/to/bitkit/ui/sheets/SendSheet.kt index b6c572792..c14d0aea8 100644 --- a/app/src/main/java/to/bitkit/ui/sheets/SendSheet.kt +++ b/app/src/main/java/to/bitkit/ui/sheets/SendSheet.kt @@ -1,36 +1,25 @@ package to.bitkit.ui.sheets -import androidx.compose.foundation.Image import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.fillMaxSize import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.imePadding import androidx.compose.foundation.layout.navigationBarsPadding -import androidx.compose.foundation.layout.padding import androidx.compose.runtime.Composable import androidx.compose.runtime.LaunchedEffect import androidx.compose.runtime.getValue import androidx.compose.runtime.remember import androidx.compose.ui.Modifier import androidx.compose.ui.platform.testTag -import androidx.compose.ui.res.painterResource -import androidx.compose.ui.res.stringResource -import androidx.compose.ui.unit.dp import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel import androidx.lifecycle.compose.collectAsStateWithLifecycle import androidx.navigation.compose.NavHost import androidx.navigation.compose.rememberNavController import androidx.navigation.toRoute import kotlinx.serialization.Serializable -import to.bitkit.R import to.bitkit.models.NewTransactionSheetDetails import to.bitkit.models.NewTransactionSheetDirection import to.bitkit.models.NewTransactionSheetType -import to.bitkit.ui.components.BodyM -import to.bitkit.ui.components.Display -import to.bitkit.ui.components.PrimaryButton -import to.bitkit.ui.components.VerticalSpacer -import to.bitkit.ui.scaffold.SheetTopBar import to.bitkit.ui.screens.scanner.QrScanningScreen import to.bitkit.ui.screens.wallets.send.AddTagScreen import to.bitkit.ui.screens.wallets.send.PIN_CHECK_RESULT_KEY @@ -50,10 +39,8 @@ import to.bitkit.ui.screens.wallets.withdraw.WithdrawErrorScreen import to.bitkit.ui.settings.support.SupportScreen import to.bitkit.ui.shared.modifiers.sheetHeight import to.bitkit.ui.shared.util.gradientBackground -import to.bitkit.ui.theme.Colors import to.bitkit.ui.utils.composableWithDefaultTransitions import to.bitkit.ui.utils.navigationWithDefaultTransitions -import to.bitkit.ui.utils.withAccent import to.bitkit.viewmodels.AppViewModel import to.bitkit.viewmodels.SendEffect import to.bitkit.viewmodels.SendEvent @@ -282,7 +269,7 @@ fun SendSheet( } composableWithDefaultTransitions { ComingSoonSheetContent( - onBackClick = { navController.popBackStack() } + onBack = { navController.popBackStack() } ) } composableWithDefaultTransitions { @@ -362,45 +349,3 @@ sealed interface SendRoute { @Serializable data class Error(val errorMessage: String) : SendRoute } - -@Composable -private fun ComingSoonSheetContent( - onBackClick: () -> Unit, -) { - Column( - modifier = Modifier - .fillMaxSize() - .gradientBackground() - .navigationBarsPadding() - ) { - SheetTopBar( - titleText = stringResource(R.string.coming_soon__title), - onBack = onBackClick - ) - - Column( - modifier = Modifier.padding(horizontal = 32.dp) - ) { - Image( - painter = painterResource(R.drawable.img_cronometer), - contentDescription = null, - modifier = Modifier - .fillMaxWidth() - .weight(1f) - ) - - Display( - text = stringResource(R.string.coming_soon__headline).withAccent(accentColor = Colors.Brand), - color = Colors.White - ) - VerticalSpacer(8.dp) - BodyM(text = stringResource(R.string.coming_soon__description), color = Colors.White64) - VerticalSpacer(54.dp) - PrimaryButton( - text = stringResource(R.string.coming_soon__button), - onClick = onBackClick, - ) - VerticalSpacer(16.dp) - } - } -}