diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 876f5205c..fa251120a 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -47,8 +47,8 @@ android { applicationId = "to.bitkit" minSdk = 28 targetSdk = 36 - versionCode = 163 - versionName = "2.0.0-rc.1" + versionCode = 168 + versionName = "2.0.0-rc.2" testInstrumentationRunner = "to.bitkit.test.HiltTestRunner" vectorDrawables { useSupportLibrary = true diff --git a/app/src/main/java/to/bitkit/ui/screens/common/ComingSoonScreen.kt b/app/src/main/java/to/bitkit/ui/screens/common/ComingSoonScreen.kt index 4cdc6035b..51d2d468f 100644 --- a/app/src/main/java/to/bitkit/ui/screens/common/ComingSoonScreen.kt +++ b/app/src/main/java/to/bitkit/ui/screens/common/ComingSoonScreen.kt @@ -6,6 +6,7 @@ import androidx.compose.foundation.layout.fillMaxWidth 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 @@ -17,7 +18,7 @@ import to.bitkit.ui.components.PrimaryButton import to.bitkit.ui.components.VerticalSpacer import to.bitkit.ui.scaffold.AppTopBar import to.bitkit.ui.scaffold.DrawerNavIcon -import to.bitkit.ui.scaffold.ScreenColumn +import to.bitkit.ui.shared.util.screen import to.bitkit.ui.theme.AppThemeSurface import to.bitkit.ui.theme.Colors import to.bitkit.ui.utils.withAccent @@ -26,14 +27,18 @@ import to.bitkit.ui.utils.withAccent fun ComingSoonScreen( onWalletOverviewClick: () -> Unit, onBackClick: () -> Unit, + modifier: Modifier = Modifier, ) { - ScreenColumn { + Column( + modifier = modifier + .screen() + .testTag("ComingSoonScreen") + ) { AppTopBar( titleText = stringResource(R.string.coming_soon__title), onBackClick = onBackClick, actions = { DrawerNavIcon() }, ) - Column( modifier = Modifier.padding(horizontal = 32.dp) ) { @@ -44,10 +49,9 @@ fun ComingSoonScreen( .fillMaxWidth() .weight(1f) ) - Display( text = stringResource(R.string.coming_soon__headline).withAccent(accentColor = Colors.Brand), - color = Colors.White + color = Colors.White, ) VerticalSpacer(8.dp) BodyM(text = stringResource(R.string.coming_soon__description), color = Colors.White64) diff --git a/app/src/main/java/to/bitkit/ui/screens/wallets/activity/ActivityDetailScreen.kt b/app/src/main/java/to/bitkit/ui/screens/wallets/activity/ActivityDetailScreen.kt index 8e2a1d532..6bc8520b6 100644 --- a/app/src/main/java/to/bitkit/ui/screens/wallets/activity/ActivityDetailScreen.kt +++ b/app/src/main/java/to/bitkit/ui/screens/wallets/activity/ActivityDetailScreen.kt @@ -78,6 +78,7 @@ import to.bitkit.ui.screens.wallets.activity.components.ActivityIcon import to.bitkit.ui.shared.modifiers.clickableAlpha import to.bitkit.ui.shared.modifiers.sheetHeight import to.bitkit.ui.sheets.BoostTransactionSheet +import to.bitkit.ui.sheets.ComingSoonSheet import to.bitkit.ui.theme.AppThemeSurface import to.bitkit.ui.theme.Colors import to.bitkit.ui.utils.copyToClipboard @@ -168,6 +169,7 @@ fun ActivityDetailScreen( val tags by detailViewModel.tags.collectAsStateWithLifecycle() val boostSheetVisible by detailViewModel.boostSheetVisible.collectAsStateWithLifecycle() var showAddTagSheet by remember { mutableStateOf(false) } + var showAssignSheet by remember { mutableStateOf(false) } var isCpfpChild by remember { mutableStateOf(false) } var boostTxDoesExist by remember { mutableStateOf>(emptyMap()) } @@ -217,6 +219,7 @@ fun ActivityDetailScreen( tags = tags, onRemoveTag = { detailViewModel.removeTag(it) }, onAddTagClick = { showAddTagSheet = true }, + onAssignClick = { showAssignSheet = true }, onClickBoost = detailViewModel::onClickBoost, onExploreClick = onExploreClick, onChannelClick = onChannelClick, @@ -282,6 +285,13 @@ fun ActivityDetailScreen( ) } } + + if (showAssignSheet) { + ComingSoonSheet( + onWalletOverviewClick = onCloseClick, + onBack = { showAssignSheet = false }, + ) + } } } } @@ -294,6 +304,7 @@ private fun ActivityDetailContent( tags: List, onRemoveTag: (String) -> Unit, onAddTagClick: () -> Unit, + onAssignClick: () -> Unit, onClickBoost: () -> Unit, onExploreClick: (String) -> Unit, onChannelClick: ((String) -> Unit)?, @@ -572,7 +583,7 @@ private fun ActivityDetailContent( PrimaryButton( text = stringResource(R.string.wallet__activity_assign), size = ButtonSize.Small, - onClick = { /* TODO: Implement assign functionality */ }, + onClick = onAssignClick, enabled = !isSelfSend, icon = { Icon( @@ -849,6 +860,7 @@ private fun PreviewLightningSent() { tags = listOf("Lunch", "Drinks"), onRemoveTag = {}, onAddTagClick = {}, + onAssignClick = {}, onExploreClick = {}, onChannelClick = null, onCopy = {}, @@ -879,6 +891,7 @@ private fun PreviewOnchain() { tags = emptyList(), onRemoveTag = {}, onAddTagClick = {}, + onAssignClick = {}, onExploreClick = {}, onChannelClick = null, onCopy = {}, @@ -910,6 +923,7 @@ private fun PreviewSheetSmallScreen() { tags = listOf("Lunch", "Drinks"), onRemoveTag = {}, onAddTagClick = {}, + onAssignClick = {}, onExploreClick = {}, onChannelClick = null, onCopy = {}, diff --git a/app/src/main/java/to/bitkit/ui/screens/wallets/activity/components/ActivityAddTagSheet.kt b/app/src/main/java/to/bitkit/ui/screens/wallets/activity/components/ActivityAddTagSheet.kt index c2d852389..88e0d1100 100644 --- a/app/src/main/java/to/bitkit/ui/screens/wallets/activity/components/ActivityAddTagSheet.kt +++ b/app/src/main/java/to/bitkit/ui/screens/wallets/activity/components/ActivityAddTagSheet.kt @@ -29,6 +29,7 @@ import to.bitkit.viewmodels.TagsViewModel fun ActivityAddTagSheet( listViewModel: ActivityListViewModel, activityViewModel: ActivityDetailViewModel, + modifier: Modifier = Modifier, tagsViewModel: TagsViewModel = hiltViewModel(), onDismiss: () -> Unit, ) { @@ -66,7 +67,7 @@ fun ActivityAddTagSheet( focusOnShow = true, tagInputTestTag = "TagInput", addButtonTestTag = "ActivityTagsSubmit", - modifier = Modifier + modifier = modifier .semantics { testTagsAsResourceId = true } .sheetHeight(SheetSize.SMALL, isModal = true) .gradientBackground() @@ -87,9 +88,7 @@ private fun Preview() { onTagConfirmed = {}, onInputUpdated = {}, onBack = {}, - modifier = Modifier - .sheetHeight(SheetSize.SMALL, isModal = true) - .gradientBackground() + modifier = Modifier.sheetHeight(SheetSize.SMALL, isModal = true) ) } } 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/ui/sheets/ComingSoonSheet.kt b/app/src/main/java/to/bitkit/ui/sheets/ComingSoonSheet.kt new file mode 100644 index 000000000..f51aba1b1 --- /dev/null +++ b/app/src/main/java/to/bitkit/ui/sheets/ComingSoonSheet.kt @@ -0,0 +1,101 @@ +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.material3.ExperimentalMaterial3Api +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.BottomSheet +import to.bitkit.ui.components.BottomSheetPreview +import to.bitkit.ui.components.Display +import to.bitkit.ui.components.PrimaryButton +import to.bitkit.ui.components.SheetSize +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 + +private fun Modifier.sheet() = this then sheetHeight(SheetSize.MEDIUM, isModal = true) + +@OptIn(ExperimentalMaterial3Api::class) +@Composable +fun ComingSoonSheet( + onWalletOverviewClick: () -> Unit, + onBack: () -> Unit, + modifier: Modifier = Modifier, +) { + BottomSheet(onDismissRequest = onBack) { + ComingSoonSheetContent( + onWalletOverviewClick = onWalletOverviewClick, + onBack = onBack, + modifier = modifier.sheet() + ) + } +} + +@Composable +fun ComingSoonSheetContent( + onWalletOverviewClick: () -> Unit, + 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 = onWalletOverviewClick, + ) + } + } +} + +@Preview(showSystemUi = true) +@Composable +private fun Preview() { + AppThemeSurface { + BottomSheetPreview { + ComingSoonSheetContent( + onWalletOverviewClick = {}, + onBack = {}, + modifier = Modifier.sheet() + ) + } + } +} 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 404647718..5f9916c3f 100644 --- a/app/src/main/java/to/bitkit/ui/sheets/SendSheet.kt +++ b/app/src/main/java/to/bitkit/ui/sheets/SendSheet.kt @@ -89,6 +89,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) } } } @@ -267,6 +268,12 @@ fun SendSheet( } ) } + composableWithDefaultTransitions { + ComingSoonSheetContent( + onWalletOverviewClick = { appViewModel.hideSheet() }, + onBack = { navController.popBackStack() }, + ) + } composableWithDefaultTransitions { val route = it.toRoute() SendErrorScreen( @@ -338,6 +345,9 @@ sealed interface SendRoute { @Serializable data object Success : SendRoute + @Serializable + data object ComingSoon : SendRoute + @Serializable data class Error(val errorMessage: String) : SendRoute } diff --git a/app/src/main/java/to/bitkit/viewmodels/AppViewModel.kt b/app/src/main/java/to/bitkit/viewmodels/AppViewModel.kt index 71ac4dcb1..94c9a8cb2 100644 --- a/app/src/main/java/to/bitkit/viewmodels/AppViewModel.kt +++ b/app/src/main/java/to/bitkit/viewmodels/AppViewModel.kt @@ -650,6 +650,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 -> setSendEffect(SendEffect.NavigateToComingSoon) } } } @@ -2084,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() } @@ -2124,6 +2126,7 @@ sealed interface SendEvent { data object ClearPayConfirmation : SendEvent data object BackToAmount : SendEvent data object NavToAddress : SendEvent + data object Contacts : SendEvent } sealed interface LnurlParams {