From 0c69586862cefd72f5de49905b74d8c934ffa68b Mon Sep 17 00:00:00 2001 From: Brandon McAnsh Date: Mon, 4 May 2026 15:24:27 -0400 Subject: [PATCH] feat(discovery): replace bottom bar CTA with inline currency creator upsell card Move the "Create Your Own Currency" action from a floating bottom bar button into an inline upsell card at the top of the token leaderboard. Adds a new shared CurrencyCreatorUpsellCard component with bill preview imagery and updates the balance screen button styling. Signed-off-by: Brandon McAnsh --- .../main/res/drawable/ic_bill_previews.webp | Bin 0 -> 30082 bytes .../core/src/main/res/values/strings.xml | 5 +- .../balance/internal/BalanceScreenContent.kt | 2 +- .../internal/TokenDiscoveryScreenContent.kt | 34 +----- .../internal/components/TokenLeaderboard.kt | 21 ++++ .../tokens/ui/CurrencyCreatorUpsellCard.kt | 105 ++++++++++++++++++ 6 files changed, 132 insertions(+), 35 deletions(-) create mode 100644 apps/flipcash/core/src/main/res/drawable/ic_bill_previews.webp create mode 100644 apps/flipcash/shared/tokens/src/main/kotlin/com/flipcash/app/tokens/ui/CurrencyCreatorUpsellCard.kt diff --git a/apps/flipcash/core/src/main/res/drawable/ic_bill_previews.webp b/apps/flipcash/core/src/main/res/drawable/ic_bill_previews.webp new file mode 100644 index 0000000000000000000000000000000000000000..e1bfd1d230dfea3199df21a613e5ef2c89b7b455 GIT binary patch literal 30082 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 !sj|h`xn7EM#M55Tm)G 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

iL8V&)>YDI}>OX*ZK5cKaEy` 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 literal 0 HcmV?d00001 diff --git a/apps/flipcash/core/src/main/res/values/strings.xml b/apps/flipcash/core/src/main/res/values/strings.xml index 4c1be43c1..af3c0de19 100644 --- a/apps/flipcash/core/src/main/res/values/strings.xml +++ b/apps/flipcash/core/src/main/res/values/strings.xml @@ -494,7 +494,7 @@ Retry Unable To Load - Currencies + Discover Currencies Discover Currencies Popular New @@ -508,6 +508,7 @@ No currencies have been created in the last week No popular currencies right now Create Your Own Currency + Create a currency in minutes and immediately use it as cash Not Yet Available Check back soon @@ -632,4 +633,6 @@ Less fee Net amount Amount in %1$s + + Leaderboard \ No newline at end of file diff --git a/apps/flipcash/features/balance/src/main/kotlin/com/flipcash/app/balance/internal/BalanceScreenContent.kt b/apps/flipcash/features/balance/src/main/kotlin/com/flipcash/app/balance/internal/BalanceScreenContent.kt index 7ad43b43d..1d8f4087b 100644 --- a/apps/flipcash/features/balance/src/main/kotlin/com/flipcash/app/balance/internal/BalanceScreenContent.kt +++ b/apps/flipcash/features/balance/src/main/kotlin/com/flipcash/app/balance/internal/BalanceScreenContent.kt @@ -119,7 +119,6 @@ private fun BalanceScreenContent( contentPadding = PaddingValues(), text = stringResource(R.string.action_discoverCurrencies), shape = CircleShape, - buttonState = ButtonState.Filled ) } } @@ -144,6 +143,7 @@ private fun BalanceScreenContent( .padding(bottom = CodeTheme.dimens.grid.x3) .navigationBarsPadding(), text = stringResource(R.string.action_discoverCurrencies), + buttonState = ButtonState.Filled10, onClick = { dispatchEvent( BalanceViewModel.Event.OpenScreen(AppRoute.Token.Discovery) diff --git a/apps/flipcash/features/discovery/src/main/kotlin/com/flipcash/app/discovery/internal/TokenDiscoveryScreenContent.kt b/apps/flipcash/features/discovery/src/main/kotlin/com/flipcash/app/discovery/internal/TokenDiscoveryScreenContent.kt index a1690056a..fbc65225b 100644 --- a/apps/flipcash/features/discovery/src/main/kotlin/com/flipcash/app/discovery/internal/TokenDiscoveryScreenContent.kt +++ b/apps/flipcash/features/discovery/src/main/kotlin/com/flipcash/app/discovery/internal/TokenDiscoveryScreenContent.kt @@ -60,39 +60,7 @@ private fun TokenDiscoveryScreenContent( dispatch: (TokenDiscoveryViewModel.Event) -> Unit ) { val listState = rememberLazyListState() - CodeScaffold( - bottomBar = { - if (state.createEnabled) { - Box { - var buttonHeight by remember { mutableStateOf(0.dp) } - Box( - modifier = Modifier - .fillMaxWidth() - .height(buttonHeight) - .drawWithGradient( - color = CodeTheme.colors.background, - startY = { 0f }, - endY = { size.height * 0.38f } - ) - ) - CodeButton( - modifier = Modifier - .fillMaxWidth() - .measured { buttonHeight = it.height } - .navigationBarsPadding() - .padding(horizontal = CodeTheme.dimens.inset) - .padding( - top = CodeTheme.dimens.grid.x9, - bottom = CodeTheme.dimens.grid.x3 - ), - text = stringResource(R.string.action_createYourOwnCurrency), - ) { - dispatch(TokenDiscoveryViewModel.Event.CreateCurrency) - } - } - } - }, - ) { padding -> + CodeScaffold { padding -> AnimatedContent( targetState = state.tokens, transitionSpec = { fadeIn(tween()) togetherWith fadeOut(tween()) }, diff --git a/apps/flipcash/features/discovery/src/main/kotlin/com/flipcash/app/discovery/internal/components/TokenLeaderboard.kt b/apps/flipcash/features/discovery/src/main/kotlin/com/flipcash/app/discovery/internal/components/TokenLeaderboard.kt index a86f7ba70..9e83a5356 100644 --- a/apps/flipcash/features/discovery/src/main/kotlin/com/flipcash/app/discovery/internal/components/TokenLeaderboard.kt +++ b/apps/flipcash/features/discovery/src/main/kotlin/com/flipcash/app/discovery/internal/components/TokenLeaderboard.kt @@ -22,6 +22,7 @@ import androidx.compose.ui.unit.dp import com.flipcash.app.core.data.Loadable import com.flipcash.app.core.data.isLoaded import com.flipcash.app.discovery.internal.TokenDiscoveryViewModel +import com.flipcash.app.tokens.ui.CurrencyCreatorUpsellCard import com.flipcash.features.discovery.R import com.getcode.opencode.model.financial.Token import com.getcode.opencode.model.ui.DiscoverCategory @@ -103,6 +104,13 @@ internal fun TokenLeaderboard( is Loadable.Loaded -> { val results = tokens.data + // currency creator upsell card + item { + CurrencyCreatorUpsellCard(modifier = Modifier.fillParentMaxWidth()) { + dispatch(TokenDiscoveryViewModel.Event.CreateCurrency) + } + } + if (results.isEmpty()) { item { Box( @@ -135,6 +143,19 @@ internal fun TokenLeaderboard( } } } else { + // leaderboard header + item { + Text( + modifier = Modifier.padding( + top = CodeTheme.dimens.inset, + bottom = CodeTheme.dimens.grid.x1, + ), + text = stringResource(R.string.title_leaderboard), + style = CodeTheme.typography.textLarge, + color = CodeTheme.colors.textMain, + ) + } + itemsIndexed( items = tokens.data, key = { _, t -> t.address.base58() }, diff --git a/apps/flipcash/shared/tokens/src/main/kotlin/com/flipcash/app/tokens/ui/CurrencyCreatorUpsellCard.kt b/apps/flipcash/shared/tokens/src/main/kotlin/com/flipcash/app/tokens/ui/CurrencyCreatorUpsellCard.kt new file mode 100644 index 000000000..672c5f01e --- /dev/null +++ b/apps/flipcash/shared/tokens/src/main/kotlin/com/flipcash/app/tokens/ui/CurrencyCreatorUpsellCard.kt @@ -0,0 +1,105 @@ +package com.flipcash.app.tokens.ui + +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.Row +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.requiredSize +import androidx.compose.material.icons.Icons +import androidx.compose.material.icons.automirrored.filled.ArrowForward +import androidx.compose.material3.Icon +import androidx.compose.material3.Surface +import androidx.compose.material3.Text +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.compose.runtime.mutableStateOf +import androidx.compose.runtime.remember +import androidx.compose.runtime.setValue +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.layout.onSizeChanged +import androidx.compose.ui.platform.LocalDensity +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.tooling.preview.PreviewWrapper +import androidx.compose.ui.unit.dp +import com.flipcash.app.theme.FlipcashThemeWrapper +import com.flipcash.shared.tokens.R +import com.getcode.theme.CodeTheme + +@Composable +fun CurrencyCreatorUpsellCard( + modifier: Modifier = Modifier, + onClick: () -> Unit, +) { + Surface( + modifier = modifier, + color = CodeTheme.colors.surfaceVariant, + contentColor = CodeTheme.colors.textMain, + shape = CodeTheme.shapes.medium, + tonalElevation = 0.dp, + shadowElevation = 0.dp, + onClick = onClick + ) { + Box(modifier = Modifier.fillMaxWidth()) { + val density = LocalDensity.current + var imageWidth by remember { mutableStateOf(0.dp) } + + Column( + modifier = Modifier + .fillMaxWidth() + .padding( + start = CodeTheme.dimens.grid.x3, + top = CodeTheme.dimens.grid.x3, + ), + verticalArrangement = Arrangement.spacedBy(CodeTheme.dimens.grid.x1), + ) { + Row( + modifier = Modifier.fillMaxWidth(), + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.spacedBy(CodeTheme.dimens.grid.x2) + ) { + Text( + text = stringResource(R.string.action_createYourOwnCurrency), + style = CodeTheme.typography.screenTitle, + color = CodeTheme.colors.textMain, + ) + Icon( + modifier = Modifier.requiredSize(CodeTheme.dimens.staticGrid.x4), + imageVector = Icons.AutoMirrored.Default.ArrowForward, + contentDescription = null, + tint = CodeTheme.colors.textMain, + ) + } + + Text( + modifier = Modifier.padding(end = imageWidth), + text = stringResource(R.string.subtitle_createYourOwnCurrency), + style = CodeTheme.typography.textSmall, + color = CodeTheme.colors.textSecondary, + ) + } + + Image( + modifier = Modifier + .align(Alignment.BottomEnd) + .onSizeChanged { size -> + imageWidth = with(density) { size.width.toDp() } + }, + painter = painterResource(R.drawable.ic_bill_previews), + contentDescription = null, + ) + } + } +} + +@Preview +@PreviewWrapper(FlipcashThemeWrapper::class) +@Composable +private fun Preview_CurrencyCreatorUpsellCard() { + CurrencyCreatorUpsellCard() { } +} \ No newline at end of file