Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -167,23 +167,15 @@ sealed interface AppRoute : NavKey, Parcelable {
@Parcelize
sealed interface Transfers : AppRoute {
@Serializable
data class Deposit(val mint: Mint): Transfers, FlowRouteWithResult<DepositResult> {
data class Deposit(val showOtherOptions: Boolean = true): Transfers, FlowRouteWithResult<DepositResult> {
override val initialStack: List<NavKey>
get() = if (mint == Mint.usdf) {
listOf(DepositStep.UsdcInformational)
} else {
listOf(DepositStep.Destination(mint))
}
get() = listOf(DepositStep.UsdcInformational(showOtherOptions))
}

@Serializable
data class Withdrawal(val mint: Mint) : Transfers, FlowRouteWithResult<WithdrawalResult> {
data class Withdrawal(val showOtherOptions: Boolean = true) : Transfers, FlowRouteWithResult<WithdrawalResult> {
override val initialStack: List<NavKey>
get() = if (mint == Mint.usdf) {
listOf(WithdrawalStep.UsdcInformational)
} else {
listOf(WithdrawalStep.Amount(mint))
}
get() = listOf(WithdrawalStep.UsdcInformational(showOtherOptions))
}
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,9 +13,12 @@ import kotlinx.serialization.Serializable
@Serializable
sealed interface DepositStep : FlowStep, Parcelable {
@Parcelize
object UsdcInformational : DepositStep
data class UsdcInformational(val showOtherOptions: Boolean) : DepositStep


@Parcelize
@Serializable
data object SelectToken: DepositStep
@Parcelize
@Serializable
data class Destination(val mint: Mint) : DepositStep
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -13,4 +13,8 @@ sealed interface SwapResult : Parcelable {
@Parcelize
@Serializable
data object Canceled : SwapResult

@Parcelize
@Serializable
data object OpenDeposit : SwapResult
}
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package com.flipcash.app.core.ui

import androidx.compose.foundation.Image
import androidx.compose.foundation.border
import androidx.compose.foundation.clickable
import androidx.compose.foundation.layout.Arrangement
import androidx.compose.foundation.layout.PaddingValues
Expand All @@ -11,7 +12,8 @@ import androidx.compose.foundation.layout.size
import androidx.compose.foundation.layout.width
import androidx.compose.foundation.layout.wrapContentWidth
import androidx.compose.foundation.shape.CircleShape
import androidx.compose.material.Text
import androidx.compose.material3.Icon
import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
Expand All @@ -20,30 +22,56 @@ import androidx.compose.ui.graphics.painter.Painter
import androidx.compose.ui.res.painterResource
import androidx.compose.ui.text.TextStyle
import androidx.compose.ui.unit.Dp
import androidx.compose.ui.unit.dp
import com.flipcash.core.R
import com.getcode.opencode.compose.LocalExchange
import com.getcode.opencode.model.financial.Fiat
import com.getcode.opencode.model.financial.Token
import com.getcode.opencode.model.financial.TokenWithBalance
import com.getcode.opencode.model.financial.TokenWithLocalizedBalance
import com.getcode.theme.CodeTheme
import com.getcode.theme.White20
import com.getcode.theme.extraSmall
import com.getcode.ui.components.text.AnimatedNumberText
import com.getcode.ui.core.addIf

data class TokenBalanceRowSizing(
sealed interface TokenBalanceStyle {
val textStyle: TextStyle

data class Large(override val textStyle: TextStyle = TextStyle.Default) : TokenBalanceStyle
data class Pill(override val textStyle: TextStyle = TextStyle.Default) : TokenBalanceStyle
}

enum class TokenSelectionStyle {
None,
Chevron,
Checkbox,
;
}

data class TokenBalanceRowStyling(
val nameTextStyle: TextStyle,
val balanceTextStyle: TextStyle,
val balanceDisplayStyle: TokenBalanceStyle,
val iconSize: Dp,
val flagSize: Dp,
val selectionStyle: TokenSelectionStyle,
)

@Composable
fun rememberTokenBalanceRowSizing(
fun rememberTokenBalanceRowStyling(
nameTextStyle: TextStyle = CodeTheme.typography.screenTitle,
balanceTextStyle: TextStyle = CodeTheme.typography.screenTitle,
balanceDisplayStyle: TokenBalanceStyle = TokenBalanceStyle.Large(),
iconSize: Dp = CodeTheme.dimens.staticGrid.x6,
flagSize: Dp = CodeTheme.dimens.staticGrid.x3,
): TokenBalanceRowSizing = TokenBalanceRowSizing(nameTextStyle, balanceTextStyle, iconSize, flagSize)
selectionStyle: TokenSelectionStyle = TokenSelectionStyle.None,
): TokenBalanceRowStyling =
TokenBalanceRowStyling(
nameTextStyle = nameTextStyle,
balanceDisplayStyle = balanceDisplayStyle,
iconSize = iconSize,
flagSize = flagSize,
selectionStyle = selectionStyle
)

@Composable
fun TokenBalanceRow(
Expand All @@ -56,7 +84,7 @@ fun TokenBalanceRow(
iconOverride: @Composable ((Any?) -> Any?) = { it },
formattedBalance: (Fiat) -> String = { it.formatted() },
horizontalArrangement: Arrangement.Horizontal = Arrangement.SpaceBetween,
sizing: TokenBalanceRowSizing = rememberTokenBalanceRowSizing(),
styling: TokenBalanceRowStyling = rememberTokenBalanceRowStyling(),
contentPadding: PaddingValues = PaddingValues(vertical = CodeTheme.dimens.inset),
onClick: (() -> Unit)? = null,
) {
Expand All @@ -72,7 +100,7 @@ fun TokenBalanceRow(
showName = showName,
showFlag = showFlag,
showLogo = showLogo,
sizing = sizing,
styling = styling,
horizontalArrangement = horizontalArrangement,
contentPadding = contentPadding,
onClick = onClick
Expand All @@ -90,7 +118,7 @@ fun TokenBalanceRow(
iconOverride: @Composable ((Any?) -> Any?) = { it },
formattedBalance: (Fiat) -> String = { it.formatted() },
horizontalArrangement: Arrangement.Horizontal = Arrangement.SpaceBetween,
sizing: TokenBalanceRowSizing = rememberTokenBalanceRowSizing(),
styling: TokenBalanceRowStyling = rememberTokenBalanceRowStyling(),
contentPadding: PaddingValues = PaddingValues(vertical = CodeTheme.dimens.inset),
onClick: (() -> Unit)? = null,
) {
Expand All @@ -104,7 +132,7 @@ fun TokenBalanceRow(
showFlag = showFlag,
isSelected = isSelected,
modifier = modifier,
sizing = sizing,
styling = styling,
iconOverride = iconOverride,
formattedBalance = formattedBalance,
horizontalArrangement = horizontalArrangement,
Expand All @@ -127,7 +155,7 @@ fun TokenBalanceRow(
iconOverride: @Composable ((Any?) -> Any?) = { it },
formattedBalance: (Fiat) -> String = { it.formatted() },
horizontalArrangement: Arrangement.Horizontal = Arrangement.SpaceBetween,
sizing: TokenBalanceRowSizing = rememberTokenBalanceRowSizing(),
styling: TokenBalanceRowStyling = rememberTokenBalanceRowStyling(),
contentPadding: PaddingValues = PaddingValues(vertical = CodeTheme.dimens.inset),
onClick: (() -> Unit)? = null,
) {
Expand All @@ -150,8 +178,8 @@ fun TokenBalanceRow(
token = token,
iconOverride = iconOverride,
displayName = { displayName },
imageSize = sizing.iconSize,
textStyle = sizing.nameTextStyle,
imageSize = styling.iconSize,
textStyle = styling.nameTextStyle,
textColor = CodeTheme.colors.textMain,
spacing = CodeTheme.dimens.grid.x2,
)
Expand All @@ -162,19 +190,20 @@ fun TokenBalanceRow(
is Painter -> Image(
painter = image,
contentDescription = null,
modifier = Modifier.size(sizing.iconSize),
modifier = Modifier.size(styling.iconSize),
)

else -> TokenIcon(
image = image,
modifier = Modifier.size(sizing.iconSize)
modifier = Modifier.size(styling.iconSize)
)
}
}

showName -> {
Text(
text = displayName,
style = sizing.nameTextStyle,
style = styling.nameTextStyle,
color = CodeTheme.colors.textMain,
)
}
Expand All @@ -190,33 +219,79 @@ fun TokenBalanceRow(
flag?.let {
Image(
modifier = Modifier
.height(sizing.flagSize)
.width(sizing.flagSize)
.height(styling.flagSize)
.width(styling.flagSize)
.clip(CircleShape),
painter = painterResource(it),
contentDescription = ""
)
}
}

AnimatedNumberText(
value = formattedBalance(balance),
style = sizing.balanceTextStyle,
color = CodeTheme.colors.textMain,
)

if (isSelected != null) {
Image(
modifier = Modifier
.wrapContentWidth()
.padding(start = CodeTheme.dimens.grid.x3),
painter = painterResource(
if (isSelected)
R.drawable.ic_checked else R.drawable.ic_unchecked
),
contentDescription = ""
)
when (val displayStyle = styling.balanceDisplayStyle) {
is TokenBalanceStyle.Large -> {
val resolvedTextStyle = displayStyle.textStyle
.takeUnless { it == TextStyle.Default }
?: CodeTheme.typography.screenTitle

AnimatedNumberText(
value = formattedBalance(balance),
style = resolvedTextStyle,
color = CodeTheme.colors.textMain,
)
}

is TokenBalanceStyle.Pill -> {
val resolvedTextStyle = displayStyle.textStyle
.takeUnless { it == TextStyle.Default }
?: CodeTheme.typography.caption

Text(
modifier = Modifier
.padding(start = CodeTheme.dimens.grid.x1)
.border(
width = CodeTheme.dimens.border,
color = White20,
shape = CodeTheme.shapes.extraSmall,
)
.padding(
horizontal = 4.dp,
vertical = 3.dp
),
text = formattedBalance(balance),
color = CodeTheme.colors.textSecondary,
style = resolvedTextStyle,
)
}
}

when (styling.selectionStyle) {
TokenSelectionStyle.Chevron -> {
Icon(
modifier = Modifier.padding(start = CodeTheme.dimens.grid.x1),
painter = painterResource(R.drawable.ic_chevron_right),
contentDescription = null,
tint = CodeTheme.colors.secondary,
)
}

TokenSelectionStyle.Checkbox -> {
if (isSelected != null) {
Image(
modifier = Modifier
.wrapContentWidth()
.padding(start = CodeTheme.dimens.grid.x3),
painter = painterResource(
if (isSelected)
R.drawable.ic_checked else R.drawable.ic_unchecked
),
contentDescription = ""
)
}
}

TokenSelectionStyle.None -> Unit
}
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -14,7 +14,11 @@ import kotlinx.serialization.Serializable
@Serializable
sealed interface WithdrawalStep : FlowStep, Parcelable {
@Parcelize
object UsdcInformational: WithdrawalStep
data class UsdcInformational(val showOtherOptions: Boolean): WithdrawalStep

@Parcelize
@Serializable
data object SelectToken: WithdrawalStep
@Parcelize
@Serializable
data class Amount(val mint: Mint) : WithdrawalStep
Expand Down
3 changes: 3 additions & 0 deletions apps/flipcash/core/src/main/res/values/strings.xml
Original file line number Diff line number Diff line change
Expand Up @@ -669,4 +669,7 @@
<string name="description_buyWithPhantomConnected">Confirm the transaction in Phantom to continue</string>

<string name="title_depositToken">Deposit %1$s</string>

<string name="action_depositOtherCurrencies">Deposit Other Flipcash Currencies</string>
<string name="action_withdrawOtherCurrencies">Withdraw Other Flipcash Currencies</string>
</resources>
Original file line number Diff line number Diff line change
Expand Up @@ -14,16 +14,6 @@ import com.flipcash.app.core.tokens.TokenPurpose
import com.flipcash.app.menu.FullMenuItem
import com.flipcash.features.advanced.R

internal data object CurrencyCreator : FullMenuItem<AdvancedFeaturesScreenViewModel.Event>() {
override val icon: Painter
@Composable get() = rememberVectorPainter(Icons.Default.AddCircle)
override val name: String
@Composable get() = stringResource(R.string.title_createYourCurrency)
override val action: AdvancedFeaturesScreenViewModel.Event = AdvancedFeaturesScreenViewModel.Event.OpenScreen(
AppRoute.Token.CurrencyCreator
)
}

internal data object BillCustomizer : FullMenuItem<AdvancedFeaturesScreenViewModel.Event>() {
override val icon: Painter
@Composable get() = rememberVectorPainter(Icons.Outlined.Palette)
Expand All @@ -32,16 +22,6 @@ internal data object BillCustomizer : FullMenuItem<AdvancedFeaturesScreenViewMod
override val action: AdvancedFeaturesScreenViewModel.Event = AdvancedFeaturesScreenViewModel.Event.OpenBillPlayground
}

internal data object Deposit : FullMenuItem<AdvancedFeaturesScreenViewModel.Event>() {
override val icon: Painter
@Composable get() = painterResource(R.drawable.ic_menu_deposit)
override val name: String
@Composable get() = stringResource(R.string.title_depositFunds)
override val action: AdvancedFeaturesScreenViewModel.Event = AdvancedFeaturesScreenViewModel.Event.OpenScreen(
AppRoute.Sheets.TokenSelection(purpose = TokenPurpose.Deposit)
)
}

internal data object DeviceLogs : FullMenuItem<AdvancedFeaturesScreenViewModel.Event>() {
override val icon: Painter
@Composable get() = rememberVectorPainter(Icons.Outlined.Description)
Expand Down
Loading
Loading