diff --git a/app/src/main/java/com/getcode/view/main/home/DecorView.kt b/app/src/main/java/com/getcode/view/main/home/DecorView.kt index 763c55829..e34ba1db1 100644 --- a/app/src/main/java/com/getcode/view/main/home/DecorView.kt +++ b/app/src/main/java/com/getcode/view/main/home/DecorView.kt @@ -59,7 +59,7 @@ internal fun DecorView( isCameraReady: Boolean, isPaused: Boolean, modifier: Modifier = Modifier, - showBottomSheet: (HomeBottomSheet) -> Unit, + onAction: (HomeAction) -> Unit, ) { val tips = LocalTipsEngine.current!!.tips as DefinedTips val tipProvider = LocalTipProvider.current @@ -74,7 +74,7 @@ internal fun DecorView( val scope = rememberCoroutineScope() val openDownloadModal = { - showBottomSheet(HomeBottomSheet.SHARE_DOWNLOAD) + onAction(HomeAction.SHARE_DOWNLOAD) scope.launch { delay(300) tipProvider.dismiss() @@ -113,7 +113,7 @@ internal fun DecorView( .align(Alignment.TopEnd) .clip(CircleShape) .rememberedClickable { - showBottomSheet(HomeBottomSheet.ACCOUNT) + onAction(HomeAction.ACCOUNT) }, painter = painterResource( R.drawable.ic_home_options @@ -186,7 +186,7 @@ internal fun DecorView( .padding(bottom = CodeTheme.dimens.grid.x3), state = dataState, onPress = { - showBottomSheet(it) + onAction(it) }, ) } diff --git a/app/src/main/java/com/getcode/view/main/home/HomeScan.kt b/app/src/main/java/com/getcode/view/main/home/HomeScan.kt index 672bd4c33..ba6a17283 100644 --- a/app/src/main/java/com/getcode/view/main/home/HomeScan.kt +++ b/app/src/main/java/com/getcode/view/main/home/HomeScan.kt @@ -52,7 +52,6 @@ import com.getcode.navigation.screens.ConnectAccount import com.getcode.navigation.screens.EnterTipModal import com.getcode.navigation.screens.GetKinModal import com.getcode.navigation.screens.GiveKinModal -import com.getcode.navigation.screens.HomeResult import com.getcode.navigation.screens.ShareDownloadLinkModal import com.getcode.ui.components.OnLifecycleEvent import com.getcode.ui.components.PermissionCheck @@ -77,7 +76,7 @@ import timber.log.Timber import kotlin.time.Duration.Companion.milliseconds -enum class HomeBottomSheet { +enum class HomeAction { NONE, ACCOUNT, GIVE_KIN, @@ -186,22 +185,22 @@ private fun HomeScan( } } - fun showBottomSheet(bottomSheet: HomeBottomSheet) { + fun handleAction(action: HomeAction) { scope.launch { - when (bottomSheet) { - HomeBottomSheet.GIVE_KIN -> navigator.show(GiveKinModal) - HomeBottomSheet.ACCOUNT -> navigator.show(AccountModal) - HomeBottomSheet.GET_KIN -> navigator.show(GetKinModal) - HomeBottomSheet.BALANCE -> navigator.show(BalanceModal) - HomeBottomSheet.SHARE_DOWNLOAD -> navigator.show(ShareDownloadLinkModal) - HomeBottomSheet.TIP_CARD -> { + when (action) { + HomeAction.GIVE_KIN -> navigator.show(GiveKinModal) + HomeAction.ACCOUNT -> navigator.show(AccountModal) + HomeAction.GET_KIN -> navigator.show(GetKinModal) + HomeAction.BALANCE -> navigator.show(BalanceModal) + HomeAction.SHARE_DOWNLOAD -> navigator.show(ShareDownloadLinkModal) + HomeAction.TIP_CARD -> { if (dataState.tipCardConnected) { homeViewModel.presentShareableTipCard() } else { navigator.show(ConnectAccount()) } } - HomeBottomSheet.NONE -> Unit + HomeAction.NONE -> Unit } } } @@ -225,7 +224,7 @@ private fun HomeScan( } ) }, - showBottomSheet = { showBottomSheet(it) }, + onAction = { handleAction(it) }, ) OnLifecycleEvent { _, event -> @@ -291,7 +290,7 @@ private fun BillContainer( homeViewModel: HomeViewModel, scannerView: @Composable () -> Unit, onStartCamera: () -> Unit, - showBottomSheet: (HomeBottomSheet) -> Unit, + onAction: (HomeAction) -> Unit, ) { val onPermissionResult = { isGranted: Boolean -> @@ -377,7 +376,7 @@ private fun BillContainer( exit = fadeOut(), modifier = Modifier.fillMaxSize() ) { - DecorView(updatedState, isCameraReady, isPaused) { showBottomSheet(it) } + DecorView(updatedState, isCameraReady, isPaused) { onAction(it) } } var managementHeight by remember { diff --git a/app/src/main/java/com/getcode/view/main/home/HomeViewModel.kt b/app/src/main/java/com/getcode/view/main/home/HomeViewModel.kt index e767a9713..915f091af 100644 --- a/app/src/main/java/com/getcode/view/main/home/HomeViewModel.kt +++ b/app/src/main/java/com/getcode/view/main/home/HomeViewModel.kt @@ -150,7 +150,7 @@ data class HomeUiModel( val buyModule: Feature = BuyModuleFeature(), val requestKin: Feature = RequestKinFeature(), val tips: Feature = TipCardFeature(), - val tipCardOnHomeScreen: Feature = TipCardOnHomeScreenFeature(), + val actions: List = listOf(HomeAction.GIVE_KIN, HomeAction.TIP_CARD, HomeAction.BALANCE), val tipCardConnected: Boolean = false, ) @@ -186,7 +186,6 @@ class HomeViewModel @Inject constructor( private val mnemonicManager: MnemonicManager, private val cashLinkManager: CashLinkManager, appSettings: AppSettingsRepository, - betaFlags: BetaFlagsRepository, features: FeatureRepository, ) : BaseViewModel(resources), ScreenModel { val uiFlow = MutableStateFlow(HomeUiModel()) @@ -208,20 +207,6 @@ class HomeViewModel @Inject constructor( } }.launchIn(viewModelScope) -// betaFlags.observe() -// .distinctUntilChanged() -// .onEach { beta -> -// ErrorUtils.setDisplayErrors(beta.displayErrors) -// -// if (beta.establishCodeRelationship) { -// val organizer = SessionManager.getOrganizer() ?: return@onEach -// val domain = Domain.from("getcode.com") ?: return@onEach -// if (organizer.relationshipFor(domain) == null) { -// client.awaitEstablishRelationship(organizer, domain) -// } -// } -// }.launchIn(viewModelScope) - features.buyModule .onEach { module -> uiFlow.update { @@ -232,7 +217,7 @@ class HomeViewModel @Inject constructor( features.tipCardOnHomeScreen .onEach { module -> uiFlow.update { - it.copy(tipCardOnHomeScreen = module) + it.copy(actions = buildActions(module.enabled)) } }.launchIn(viewModelScope) @@ -388,6 +373,20 @@ class HomeViewModel @Inject constructor( } } + private fun buildActions( + tipCardOnHomeScreen: Boolean, + ): List { + return listOf( + HomeAction.GIVE_KIN, + if (tipCardOnHomeScreen) { + HomeAction.TIP_CARD + } else { + HomeAction.GET_KIN + }, + HomeAction.BALANCE + ) + } + fun onCameraScanning(scanning: Boolean) { uiFlow.update { it.copy(isCameraScanEnabled = scanning) } } diff --git a/app/src/main/java/com/getcode/view/main/home/components/HomeBottom.kt b/app/src/main/java/com/getcode/view/main/home/components/HomeBottom.kt index 526fc950c..6b3381ca5 100644 --- a/app/src/main/java/com/getcode/view/main/home/components/HomeBottom.kt +++ b/app/src/main/java/com/getcode/view/main/home/components/HomeBottom.kt @@ -4,6 +4,7 @@ import androidx.compose.animation.core.tween import androidx.compose.animation.fadeIn import androidx.compose.animation.scaleIn import androidx.compose.foundation.Image +import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Box import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.PaddingValues @@ -15,7 +16,6 @@ import androidx.compose.material.Text import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier -import androidx.compose.ui.draw.clip import androidx.compose.ui.graphics.painter.Painter import androidx.compose.ui.layout.Layout import androidx.compose.ui.layout.layoutId @@ -24,15 +24,16 @@ import androidx.compose.ui.res.stringResource import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp +import androidx.compose.ui.util.fastForEach import com.getcode.R import com.getcode.theme.CodeTheme import com.getcode.ui.components.Badge import com.getcode.ui.components.Row import com.getcode.ui.components.chat.ChatNodeDefaults import com.getcode.ui.utils.heightOrZero -import com.getcode.ui.utils.rememberedClickable +import com.getcode.ui.utils.unboundedClickable import com.getcode.ui.utils.widthOrZero -import com.getcode.view.main.home.HomeBottomSheet +import com.getcode.view.main.home.HomeAction import com.getcode.view.main.home.HomeUiModel @Preview @@ -40,75 +41,70 @@ import com.getcode.view.main.home.HomeUiModel internal fun HomeBottom( modifier: Modifier = Modifier, state: HomeUiModel = HomeUiModel(), - onPress: (homeBottomSheet: HomeBottomSheet) -> Unit = {}, + onPress: (homeBottomSheet: HomeAction) -> Unit = {}, ) { Row( modifier = Modifier .fillMaxWidth() .then(modifier), verticalAlignment = Alignment.Bottom, - contentPadding = PaddingValues(horizontal = CodeTheme.dimens.grid.x3), + horizontalArrangement = Arrangement.SpaceAround, ) { - BottomBarAction( - label = if (state.tipCardOnHomeScreen.enabled) { - stringResource(R.string.title_tipCard) - } else { - stringResource(R.string.title_getCash) - }, - contentPadding = PaddingValues( - start = CodeTheme.dimens.grid.x3, - end = CodeTheme.dimens.grid.x3, - top = CodeTheme.dimens.grid.x1, - bottom = CodeTheme.dimens.grid.x2, - ), - imageSize = CodeTheme.dimens.grid.x7, - painter = if (state.tipCardOnHomeScreen.enabled) { - painterResource(R.drawable.ic_tip_card) - } else { - painterResource(R.drawable.ic_wallet) - }, - onClick = { - if (state.tipCardOnHomeScreen.enabled) { - onPress(HomeBottomSheet.TIP_CARD) - } else { - onPress(HomeBottomSheet.GET_KIN) + state.actions.fastForEach { action -> + when (action) { + HomeAction.GIVE_KIN -> { + BottomBarAction( + modifier = Modifier.weight(1f), + label = stringResource(R.string.action_give), + painter = painterResource(R.drawable.ic_kin_white_small), + onClick = { onPress(action) } + ) } - }, - ) - Spacer(modifier = Modifier.weight(1f)) - BottomBarAction( - label = stringResource(R.string.action_giveKin), - contentPadding = PaddingValues( - horizontal = CodeTheme.dimens.grid.x3, - vertical = CodeTheme.dimens.grid.x2 - ), - imageSize = CodeTheme.dimens.grid.x10, - painter = painterResource(R.drawable.ic_kin_white), - onClick = { onPress(HomeBottomSheet.GIVE_KIN) } - ) - Spacer(modifier = Modifier.weight(1f)) - BottomBarAction( - label = stringResource(R.string.action_balance), - contentPadding = PaddingValues( - horizontal = CodeTheme.dimens.grid.x2, - ), - imageSize = CodeTheme.dimens.grid.x9, - painter = painterResource(R.drawable.ic_history), - onClick = { onPress(HomeBottomSheet.BALANCE) }, - badge = { - Badge( - modifier = Modifier.padding(top = 2.dp, end = 2.dp), - count = state.chatUnreadCount, - color = ChatNodeDefaults.UnreadIndicator, - enterTransition = scaleIn( - animationSpec = tween( - durationMillis = 300, - delayMillis = 1000 - ) - ) + fadeIn() - ) + HomeAction.GET_KIN -> { + BottomBarAction( + modifier = Modifier.weight(1f), + label = stringResource(R.string.action_receive), + painter = painterResource(R.drawable.ic_wallet), + onClick = { onPress(action) }, + ) + } + HomeAction.BALANCE -> { + BottomBarAction( + modifier = Modifier.weight(1f), + label = stringResource(R.string.action_balance), + painter = painterResource(R.drawable.ic_balance), + contentPadding = PaddingValues( + top = CodeTheme.dimens.grid.x2, + bottom = CodeTheme.dimens.grid.x3 + ), + imageSize = CodeTheme.dimens.staticGrid.x6, + onClick = { onPress(HomeAction.BALANCE) }, + badge = { + Badge( + modifier = Modifier.padding(top = 2.dp, end = 2.dp), + count = state.chatUnreadCount, + color = ChatNodeDefaults.UnreadIndicator, + enterTransition = scaleIn( + animationSpec = tween( + durationMillis = 300, + delayMillis = 1000 + ) + ) + fadeIn() + ) + } + ) + } + HomeAction.TIP_CARD -> { + BottomBarAction( + modifier = Modifier.weight(1f), + label = stringResource(R.string.action_receive), + painter = painterResource(R.drawable.ic_tip_card), + onClick = { onPress(action) }, + ) + } + else -> Unit } - ) + } } } @@ -116,9 +112,11 @@ internal fun HomeBottom( private fun BottomBarAction( modifier: Modifier = Modifier, label: String, - contentPadding: PaddingValues = PaddingValues(), + contentPadding: PaddingValues = PaddingValues( + vertical = CodeTheme.dimens.grid.x2 + ), painter: Painter, - imageSize: Dp, + imageSize: Dp = CodeTheme.dimens.staticGrid.x8, badge: @Composable () -> Unit = { }, onClick: () -> Unit, ) { @@ -127,8 +125,7 @@ private fun BottomBarAction( content = { Column( modifier = Modifier - .clip(CodeTheme.shapes.medium) - .rememberedClickable { onClick() } + .unboundedClickable { onClick() } .layoutId("action"), horizontalAlignment = Alignment.CenterHorizontally ) { diff --git a/app/src/main/res/drawable/ic_balance.xml b/app/src/main/res/drawable/ic_balance.xml new file mode 100644 index 000000000..0af9ca841 --- /dev/null +++ b/app/src/main/res/drawable/ic_balance.xml @@ -0,0 +1,21 @@ + + + + + diff --git a/app/src/main/res/drawable/ic_kin_white_small.xml b/app/src/main/res/drawable/ic_kin_white_small.xml new file mode 100644 index 000000000..5c6421d5d --- /dev/null +++ b/app/src/main/res/drawable/ic_kin_white_small.xml @@ -0,0 +1,11 @@ + + + diff --git a/app/src/main/res/drawable/ic_tip_card.xml b/app/src/main/res/drawable/ic_tip_card.xml index f9edb10ab..ee23ff720 100644 --- a/app/src/main/res/drawable/ic_tip_card.xml +++ b/app/src/main/res/drawable/ic_tip_card.xml @@ -1,19 +1,15 @@ - - - - + android:width="28dp" + android:height="40dp" + android:viewportWidth="28" + android:viewportHeight="40"> + diff --git a/app/src/main/res/values/strings.xml b/app/src/main/res/values/strings.xml index 4e6cb7013..fa349717f 100644 --- a/app/src/main/res/values/strings.xml +++ b/app/src/main/res/values/strings.xml @@ -50,4 +50,6 @@ Connecting your X account allows you to reveal your identity to the people you tip. To connect your account post to X. Use Kado Sandbox Tip Card + Give + Receive