Skip to content

Commit 0e4ae9a

Browse files
committed
feat: display full decimal places for the currency in transaction details
also make token amount visible as well Signed-off-by: Brandon McAnsh <git@bmcreations.dev>
1 parent cd51eb4 commit 0e4ae9a

14 files changed

Lines changed: 385 additions & 43 deletions

File tree

apps/flipcash/core/src/main/kotlin/com/flipcash/app/core/feed/ActivityFeedMessage.kt

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,11 +3,17 @@ package com.flipcash.app.core.feed
33
import com.flipcash.app.core.pools.PoolResolution
44
import com.getcode.opencode.model.core.ID
55
import com.getcode.opencode.model.financial.LocalFiat
6+
import com.getcode.opencode.model.financial.Token
67
import com.getcode.solana.keys.PublicKey
78
import kotlinx.datetime.Instant
89
import kotlinx.serialization.Serializable
910
import kotlinx.serialization.json.Json
1011

12+
data class ActivityFeedMessageWithToken(
13+
val message: ActivityFeedMessage,
14+
val token: Token?
15+
)
16+
1117
data class ActivityFeedMessage(
1218
val id: ID,
1319
val text: String,

apps/flipcash/features/transactions/src/main/kotlin/com/flipcash/app/transactions/internal/TransactionHistoryScreen.kt

Lines changed: 10 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ import androidx.paging.compose.LazyPagingItems
2424
import androidx.paging.compose.collectAsLazyPagingItems
2525
import androidx.paging.compose.itemKey
2626
import com.flipcash.app.core.feed.ActivityFeedMessage
27+
import com.flipcash.app.core.feed.ActivityFeedMessageWithToken
2728
import com.flipcash.app.transactions.internal.components.FeedItem
2829
import com.flipcash.features.transactions.R
2930
import com.getcode.theme.CodeTheme
@@ -40,7 +41,7 @@ internal fun TransactionHistoryScreen(viewModel: TransactionHistoryViewModel) {
4041
@Composable
4142
private fun TransactionHistoryScreenContent(
4243
state: TransactionHistoryViewModel.State,
43-
transactions: LazyPagingItems<ActivityFeedMessage>,
44+
transactions: LazyPagingItems<ActivityFeedMessageWithToken>,
4445
dispatch: (TransactionHistoryViewModel.Event) -> Unit,
4546
) {
4647
FeedList(
@@ -55,7 +56,7 @@ private fun TransactionHistoryScreenContent(
5556
private fun FeedList(
5657
modifier: Modifier = Modifier,
5758
state: TransactionHistoryViewModel.State,
58-
feed: LazyPagingItems<ActivityFeedMessage>,
59+
feed: LazyPagingItems<ActivityFeedMessageWithToken>,
5960
dispatchEvent: (TransactionHistoryViewModel.Event) -> Unit
6061
) {
6162
val listState = rememberLazyListState()
@@ -93,17 +94,16 @@ private fun FeedList(
9394
}
9495
}
9596
} else {
96-
items(feed.itemCount, key = feed.itemKey { item -> item.id }) { index ->
97-
val message = feed[index] ?: return@items
97+
items(feed.itemCount, key = feed.itemKey { item -> item.message.id }) { index ->
98+
val item = feed[index] ?: return@items
9899
FeedItem(
99100
modifier = Modifier
100-
.fillParentMaxWidth()
101-
.animateItem(),
102-
message = message,
101+
.fillParentMaxWidth(),
102+
item = item,
103103
canViewDetails = state.canViewDetails,
104-
isExpanded = state.expandedItem == message.id,
105-
onCancel = { dispatchEvent(TransactionHistoryViewModel.Event.OnCancelRequested(message)) },
106-
onViewDetails = { dispatchEvent(TransactionHistoryViewModel.Event.ViewDetails(message.id)) },
104+
isExpanded = state.expandedItem == item.message.id,
105+
onCancel = { dispatchEvent(TransactionHistoryViewModel.Event.OnCancelRequested(item.message)) },
106+
onViewDetails = { dispatchEvent(TransactionHistoryViewModel.Event.ViewDetails(item.message.id)) },
107107
)
108108

109109
if (index < feed.itemCount - 1) {

apps/flipcash/features/transactions/src/main/kotlin/com/flipcash/app/transactions/internal/TransactionHistoryViewModel.kt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,6 @@ class TransactionHistoryViewModel @Inject constructor(
132132

133133
val transactions = stateFlow.mapNotNull { it.mint }
134134
.flatMapLatest { mint -> feedCoordinator.transactions(mint) }
135-
.cachedIn(viewModelScope)
136135

137136
companion object {
138137
val updateStateForEvent: (Event) -> ((State) -> State) = { event ->

apps/flipcash/features/transactions/src/main/kotlin/com/flipcash/app/transactions/internal/components/FeedItem.kt

Lines changed: 13 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@ import androidx.compose.ui.platform.LocalContext
1919
import androidx.compose.ui.tooling.preview.Preview
2020
import androidx.compose.ui.unit.dp
2121
import com.flipcash.app.core.feed.ActivityFeedMessage
22+
import com.flipcash.app.core.feed.ActivityFeedMessageWithToken
2223
import com.flipcash.app.core.feed.MessageMetadata
2324
import com.flipcash.app.core.feed.MessageState
2425
import com.flipcash.app.theme.FlipcashDesignSystem
@@ -27,14 +28,16 @@ import com.getcode.opencode.compose.LocalExchange
2728
import com.getcode.opencode.model.financial.CurrencyCode
2829
import com.getcode.opencode.model.financial.LocalFiat
2930
import com.getcode.opencode.model.financial.Rate
31+
import com.getcode.opencode.model.financial.Token
3032
import com.getcode.opencode.model.financial.toFiat
33+
import com.getcode.opencode.model.financial.usdc
3134
import com.getcode.theme.CodeTheme
3235
import com.getcode.utils.decodeBase58
3336
import kotlinx.datetime.Instant
3437

3538
@Composable
3639
internal fun FeedItem(
37-
message: ActivityFeedMessage,
40+
item: ActivityFeedMessageWithToken,
3841
canViewDetails: Boolean,
3942
isExpanded: Boolean,
4043
modifier: Modifier = Modifier,
@@ -51,7 +54,7 @@ internal fun FeedItem(
5154
elevation = elevation,
5255
) {
5356
FeedItemSummary(
54-
message = message,
57+
message = item.message,
5558
canViewDetails = canViewDetails,
5659
modifier = Modifier
5760
.fillMaxWidth(),
@@ -69,7 +72,7 @@ internal fun FeedItem(
6972
) { expanded ->
7073
if (expanded) {
7174
FeedItemDetails(
72-
message = message,
75+
item = item,
7376
modifier = Modifier.fillMaxWidth(),
7477
onCancel = onCancel
7578
)
@@ -102,6 +105,11 @@ private val sampleItem = ActivityFeedMessage(
102105
metadata = MessageMetadata.GaveCrypto
103106
)
104107

108+
private val sampleItemWithToken = ActivityFeedMessageWithToken(
109+
message = sampleItem,
110+
token = Token.usdc,
111+
)
112+
105113
@Preview
106114
@Composable
107115
private fun Preview_CollapsedItem() {
@@ -114,7 +122,7 @@ private fun Preview_CollapsedItem() {
114122
) {
115123
Box(modifier = Modifier.background(CodeTheme.colors.background)) {
116124
FeedItem(
117-
message = sampleItem,
125+
item = sampleItemWithToken,
118126
isExpanded = false,
119127
canViewDetails = true,
120128
onCancel = {},
@@ -137,7 +145,7 @@ private fun Preview_ExpandedItem() {
137145
) {
138146
Box(modifier = Modifier.background(CodeTheme.colors.background)) {
139147
FeedItem(
140-
message = sampleItem,
148+
item = sampleItemWithToken,
141149
isExpanded = true,
142150
canViewDetails = true,
143151
onViewDetails = {},

apps/flipcash/features/transactions/src/main/kotlin/com/flipcash/app/transactions/internal/components/FeedItemDetails.kt

Lines changed: 29 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@ import androidx.compose.foundation.background
44
import androidx.compose.foundation.layout.Arrangement
55
import androidx.compose.foundation.layout.Column
66
import androidx.compose.foundation.layout.Row
7+
import androidx.compose.foundation.layout.Spacer
78
import androidx.compose.foundation.layout.fillMaxWidth
89
import androidx.compose.foundation.layout.padding
910
import androidx.compose.foundation.layout.wrapContentHeight
@@ -16,18 +17,22 @@ import androidx.compose.ui.graphics.compositeOver
1617
import androidx.compose.ui.text.font.FontWeight.Companion.W600
1718
import androidx.compose.ui.text.style.TextOverflow
1819
import com.flipcash.app.core.feed.ActivityFeedMessage
20+
import com.flipcash.app.core.feed.ActivityFeedMessageWithToken
1921
import com.getcode.opencode.model.financial.Fiat
22+
import com.getcode.solana.keys.Mint
2023
import com.getcode.theme.CodeTheme
2124
import com.getcode.ui.core.unboundedClickable
2225
import com.getcode.util.format
2326
import com.getcode.utils.base58
2427

2528
@Composable
2629
internal fun FeedItemDetails(
27-
message: ActivityFeedMessage,
30+
item: ActivityFeedMessageWithToken,
2831
modifier: Modifier = Modifier,
2932
onCancel: () -> Unit,
3033
) {
34+
val (message, token) = item
35+
3136
Column(
3237
modifier = modifier
3338
.wrapContentHeight()
@@ -62,6 +67,12 @@ internal fun FeedItemDetails(
6267
)
6368
}
6469
message.amount?.let { amount ->
70+
val usdcAmount = if (token?.address == Mint.usdc || token == null) {
71+
amount.underlyingTokenAmount
72+
} else {
73+
Fiat.tokenBalance(amount.underlyingTokenAmount.quarks, token = token)
74+
}
75+
6576
Row(
6677
modifier = Modifier.fillMaxWidth(),
6778
) {
@@ -75,9 +86,25 @@ internal fun FeedItemDetails(
7586
value = amount.nativeAmount.currencyCode.name,
7687
modifier = Modifier.weight(1f)
7788
)
89+
7890
DetailItem(
91+
modifier = Modifier.weight(1f),
7992
label = "USDC",
80-
value = amount.underlyingTokenAmount.formatted(formatting = Fiat.Formatting.Length(6)),
93+
value = usdcAmount.formatted(
94+
formatting = Fiat.Formatting.Length(
95+
token?.decimals ?: 6
96+
)
97+
),
98+
)
99+
}
100+
101+
Row(modifier = Modifier.fillMaxWidth()) {
102+
Spacer(Modifier.weight(1f))
103+
Spacer(Modifier.weight(1f))
104+
DetailItem(
105+
modifier = Modifier.weight(1f),
106+
label = "Tokens",
107+
value = usdcAmount.estimatedTokenAmountIn(token),
81108
)
82109
}
83110
}

apps/flipcash/shared/activityfeed/src/main/kotlin/com/flipcash/app/activityfeed/ActivityFeedCoordinator.kt

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@ import androidx.paging.PagingData
77
import androidx.paging.filter
88
import androidx.paging.map
99
import com.flipcash.app.core.feed.ActivityFeedMessage
10+
import com.flipcash.app.core.feed.ActivityFeedMessageWithToken
1011
import com.flipcash.app.persistence.sources.MessageDataSource
1112
import com.flipcash.app.persistence.sources.mapper.notifications.MessageEntityToFeedMessageMapper
1213
import com.flipcash.app.persistence.sources.mediator.FeedRemoteMediator
@@ -15,6 +16,7 @@ import com.flipcash.services.models.ActivityFeedType
1516
import com.flipcash.services.models.NotificationState
1617
import com.flipcash.services.models.QueryOptions
1718
import com.flipcash.services.user.UserManager
19+
import com.getcode.opencode.controllers.TokenController
1820
import com.getcode.solana.keys.Mint
1921
import com.getcode.utils.TraceType
2022
import com.getcode.utils.trace
@@ -34,6 +36,7 @@ class ActivityFeedCoordinator @Inject constructor(
3436
private val dataSource: MessageDataSource,
3537
private val mapper: MessageEntityToFeedMessageMapper,
3638
private val userManager: UserManager,
39+
private val tokenController: TokenController,
3740
) {
3841
private val pagingConfig = PagingConfig(pageSize = 20)
3942

@@ -56,9 +59,12 @@ class ActivityFeedCoordinator @Inject constructor(
5659
.flatMapLatest { _messages }
5760

5861
@OptIn(ExperimentalCoroutinesApi::class)
59-
fun transactions(mint: Mint): Flow<PagingData<ActivityFeedMessage>> = messages.map { page ->
62+
fun transactions(mint: Mint): Flow<PagingData<ActivityFeedMessageWithToken>> = messages.map { page ->
6063
page.filter { message ->
6164
message.amount?.mint == mint
65+
}.map { msg ->
66+
val token = msg.amount?.mint?.let { tokenController.getTokenMetadata(it) }?.getOrNull()
67+
ActivityFeedMessageWithToken(msg, token)
6268
}
6369
}
6470

0 commit comments

Comments
 (0)