Skip to content
This repository was archived by the owner on Mar 26, 2026. It is now read-only.

Commit 139483a

Browse files
committed
Separate components
1 parent b0fab9c commit 139483a

9 files changed

Lines changed: 195 additions & 169 deletions

File tree

Lines changed: 16 additions & 116 deletions
Original file line numberDiff line numberDiff line change
@@ -1,35 +1,19 @@
11
package com.gemwallet.features.assets.views
22

3-
import androidx.compose.foundation.ExperimentalFoundationApi
4-
import androidx.compose.foundation.clickable
5-
import androidx.compose.foundation.layout.Box
6-
import androidx.compose.foundation.layout.Row
7-
import androidx.compose.foundation.layout.Spacer
83
import androidx.compose.foundation.layout.fillMaxHeight
94
import androidx.compose.foundation.layout.fillMaxSize
10-
import androidx.compose.foundation.layout.fillMaxWidth
11-
import androidx.compose.foundation.layout.height
125
import androidx.compose.foundation.layout.padding
13-
import androidx.compose.foundation.layout.size
146
import androidx.compose.foundation.lazy.LazyColumn
15-
import androidx.compose.foundation.lazy.LazyListScope
167
import androidx.compose.foundation.lazy.LazyListState
17-
import androidx.compose.foundation.lazy.items
188
import androidx.compose.foundation.lazy.rememberLazyListState
19-
import androidx.compose.material.icons.Icons
20-
import androidx.compose.material.icons.filled.Tune
21-
import androidx.compose.material3.ButtonDefaults
229
import androidx.compose.material3.ExperimentalMaterial3Api
2310
import androidx.compose.material3.HorizontalDivider
24-
import androidx.compose.material3.Icon
2511
import androidx.compose.material3.MaterialTheme
2612
import androidx.compose.material3.Scaffold
27-
import androidx.compose.material3.Text
2813
import androidx.compose.material3.pulltorefresh.PullToRefreshBox
2914
import androidx.compose.material3.pulltorefresh.PullToRefreshDefaults.Indicator
3015
import androidx.compose.material3.pulltorefresh.rememberPullToRefreshState
3116
import androidx.compose.runtime.Composable
32-
import androidx.compose.runtime.MutableState
3317
import androidx.compose.runtime.getValue
3418
import androidx.compose.runtime.mutableStateOf
3519
import androidx.compose.runtime.remember
@@ -38,20 +22,15 @@ import androidx.compose.ui.Modifier
3822
import androidx.compose.ui.platform.LocalContext
3923
import androidx.compose.ui.platform.LocalUriHandler
4024
import androidx.compose.ui.platform.testTag
41-
import androidx.compose.ui.res.stringResource
4225
import androidx.compose.ui.unit.dp
4326
import androidx.hilt.lifecycle.viewmodel.compose.hiltViewModel
4427
import androidx.lifecycle.compose.collectAsStateWithLifecycle
45-
import com.gemwallet.android.ext.toIdentifier
46-
import com.gemwallet.features.assets.viewmodels.AssetsViewModel
47-
import com.gemwallet.features.assets.viewmodels.model.WalletInfoUIState
4828
import com.gemwallet.android.features.update_app.presents.InAppUpdateBanner
49-
import com.gemwallet.android.ui.R
50-
import com.gemwallet.android.ui.components.list_head.AmountListHead
51-
import com.gemwallet.android.ui.components.list_head.AssetHeadActions
52-
import com.gemwallet.android.ui.components.list_item.AssetItemUIModel
53-
import com.gemwallet.android.ui.components.list_item.pinnedAssetsHeader
5429
import com.gemwallet.android.ui.open
30+
import com.gemwallet.features.assets.viewmodels.AssetsViewModel
31+
import com.gemwallet.features.assets.views.components.AssetsHead
32+
import com.gemwallet.features.assets.views.components.AssetsListFooter
33+
import com.gemwallet.features.assets.views.components.assets
5534
import com.gemwallet.features.banner.views.BannersScene
5635
import com.wallet.core.primitives.AssetId
5736
import com.wallet.core.primitives.BannerEvent
@@ -104,13 +83,21 @@ fun AssetsScreen(
10483
.testTag("assets_list"),
10584
state = listState
10685
) {
107-
assetsHead(walletInfo, onSendClick, onReceiveClick, onBuyClick, viewModel::hideBalances)
86+
item {
87+
AssetsHead(
88+
walletInfo = walletInfo,
89+
onSendClick = onSendClick,
90+
onReceiveClick = onReceiveClick,
91+
onBuyClick = onBuyClick,
92+
onHideBalances = viewModel::hideBalances
93+
)
94+
}
10895
item {
10996
InAppUpdateBanner()
11097
BannersScene(
11198
asset = null,
112-
onClick = {
113-
when (it.event) {
99+
onClick = { banner ->
100+
when (banner.event) {
114101
BannerEvent.AccountBlockedMultiSignature ->
115102
uriHandler.open(context, Config().getDocsUrl(DocsUrl.TRON_MULTI_SIGNATURE))
116103
else -> {}
@@ -136,95 +123,8 @@ fun AssetsScreen(
136123
onAssetHide = viewModel::hideAsset,
137124
onTogglePin = viewModel::togglePin,
138125
)
139-
assetsListFooter(onShowAssetManage)
140-
}
141-
}
142-
}
143-
}
144-
145-
private fun LazyListScope.assetsHead(
146-
walletInfo: WalletInfoUIState,
147-
onSendClick: () -> Unit,
148-
onReceiveClick: () -> Unit,
149-
onBuyClick: () -> Unit,
150-
onHideBalances: () -> Unit,
151-
) {
152-
item {
153-
AmountListHead(
154-
amount = walletInfo.totalValue,
155-
onHideBalances = onHideBalances,
156-
actions = {
157-
AssetHeadActions(
158-
walletType = walletInfo.type,
159-
transferEnabled = true,
160-
operationsEnabled = walletInfo.operationsEnabled,
161-
onTransfer = onSendClick,
162-
onReceive = onReceiveClick,
163-
onBuy = onBuyClick,
164-
onSwap = null, // if (swapEnabled) onSwapClick else null
165-
)
166-
}
167-
)
168-
}
169-
}
170-
171-
private fun LazyListScope.assetsListFooter(
172-
onShowAssetManage: () -> Unit,
173-
) {
174-
item {
175-
Box(
176-
modifier = Modifier
177-
.clickable(onClick = onShowAssetManage)
178-
.fillMaxWidth()
179-
) {
180-
Row(
181-
modifier = Modifier
182-
.align(Alignment.Center)
183-
.padding(16.dp)
184-
) {
185-
Icon(
186-
imageVector = Icons.Default.Tune,
187-
tint = MaterialTheme.colorScheme.onSurface,
188-
contentDescription = "asset_manager",
189-
)
190-
Spacer(modifier = Modifier.size(ButtonDefaults.IconSize))
191-
Text(
192-
text = stringResource(id = R.string.wallet_manage_token_list),
193-
color = MaterialTheme.colorScheme.onSurface,
194-
style = MaterialTheme.typography.titleMedium,
195-
)
126+
item { AssetsListFooter(onShowAssetManage) }
196127
}
197128
}
198129
}
199-
}
200-
201-
@OptIn(ExperimentalFoundationApi::class)
202-
private fun LazyListScope.assets(
203-
assets: List<AssetItemUIModel>,
204-
longPressState: MutableState<AssetId?>,
205-
isPinned: Boolean = false,
206-
onAssetClick: (AssetId) -> Unit,
207-
onAssetHide: (AssetId) -> Unit,
208-
onTogglePin: (AssetId) -> Unit,
209-
) {
210-
if (assets.isEmpty()) return
211-
212-
if (isPinned) {
213-
pinnedAssetsHeader()
214-
}
215-
216-
items(items = assets, key = { "${it.asset.id.toIdentifier()}-$isPinned" }) { item ->
217-
AssetItem(
218-
modifier = Modifier.testTag(item.asset.id.toIdentifier()),
219-
item = item,
220-
longPressState = longPressState,
221-
isPinned = isPinned,
222-
onAssetClick = onAssetClick,
223-
onAssetHide = onAssetHide,
224-
onTogglePin = onTogglePin,
225-
)
226-
}
227-
if (isPinned) {
228-
item { Spacer(modifier = Modifier.height(32.dp)) }
229-
}
230130
}

‎features/assets/presents/src/main/kotlin/com/gemwallet/features/assets/views/AssetsTopBar.kt‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,8 +21,8 @@ import androidx.compose.ui.Modifier
2121
import androidx.compose.ui.platform.testTag
2222
import androidx.compose.ui.text.style.TextOverflow
2323
import androidx.compose.ui.unit.dp
24-
import com.gemwallet.features.assets.viewmodels.model.WalletInfoUIState
2524
import com.gemwallet.android.ui.components.image.AsyncImage
25+
import com.gemwallet.features.assets.viewmodels.model.WalletInfoUIState
2626

2727
@OptIn(ExperimentalMaterial3Api::class)
2828
@Composable

features/assets/presents/src/main/kotlin/com/gemwallet/features/assets/views/AssetItem.kt renamed to features/assets/presents/src/main/kotlin/com/gemwallet/features/assets/views/components/AssetItem.kt

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,4 @@
1-
package com.gemwallet.features.assets.views
1+
package com.gemwallet.features.assets.views.components
22

33
import androidx.compose.material.icons.Icons
44
import androidx.compose.material.icons.filled.ContentCopy
Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,31 @@
1+
package com.gemwallet.features.assets.views.components
2+
3+
import androidx.compose.runtime.Composable
4+
import com.gemwallet.android.ui.components.list_head.AmountListHead
5+
import com.gemwallet.android.ui.components.list_head.AssetHeadActions
6+
import com.gemwallet.features.assets.viewmodels.model.WalletInfoUIState
7+
8+
@Composable
9+
internal fun AssetsHead(
10+
walletInfo: WalletInfoUIState,
11+
onSendClick: () -> Unit,
12+
onReceiveClick: () -> Unit,
13+
onBuyClick: () -> Unit,
14+
onHideBalances: () -> Unit,
15+
) {
16+
AmountListHead(
17+
amount = walletInfo.totalValue,
18+
onHideBalances = onHideBalances,
19+
actions = {
20+
AssetHeadActions(
21+
walletType = walletInfo.type,
22+
transferEnabled = true,
23+
operationsEnabled = walletInfo.operationsEnabled,
24+
onTransfer = onSendClick,
25+
onReceive = onReceiveClick,
26+
onBuy = onBuyClick,
27+
onSwap = null, // if (swapEnabled) onSwapClick else null
28+
)
29+
}
30+
)
31+
}
Lines changed: 50 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,50 @@
1+
package com.gemwallet.features.assets.views.components
2+
3+
import androidx.compose.foundation.clickable
4+
import androidx.compose.foundation.layout.Box
5+
import androidx.compose.foundation.layout.Row
6+
import androidx.compose.foundation.layout.Spacer
7+
import androidx.compose.foundation.layout.fillMaxWidth
8+
import androidx.compose.foundation.layout.padding
9+
import androidx.compose.foundation.layout.size
10+
import androidx.compose.material.icons.Icons
11+
import androidx.compose.material.icons.filled.Tune
12+
import androidx.compose.material3.ButtonDefaults
13+
import androidx.compose.material3.Icon
14+
import androidx.compose.material3.MaterialTheme
15+
import androidx.compose.material3.Text
16+
import androidx.compose.runtime.Composable
17+
import androidx.compose.ui.Alignment
18+
import androidx.compose.ui.Modifier
19+
import androidx.compose.ui.res.stringResource
20+
import androidx.compose.ui.unit.dp
21+
import com.gemwallet.android.ui.R
22+
23+
@Composable
24+
internal fun AssetsListFooter(
25+
onShowAssetManage: () -> Unit,
26+
) {
27+
Box(
28+
modifier = Modifier.Companion
29+
.clickable(onClick = onShowAssetManage)
30+
.fillMaxWidth()
31+
) {
32+
Row(
33+
modifier = Modifier.Companion
34+
.align(Alignment.Companion.Center)
35+
.padding(16.dp)
36+
) {
37+
Icon(
38+
imageVector = Icons.Default.Tune,
39+
tint = MaterialTheme.colorScheme.onSurface,
40+
contentDescription = "asset_manager",
41+
)
42+
Spacer(modifier = Modifier.Companion.size(ButtonDefaults.IconSize))
43+
Text(
44+
text = stringResource(id = R.string.wallet_manage_token_list),
45+
color = MaterialTheme.colorScheme.onSurface,
46+
style = MaterialTheme.typography.titleMedium,
47+
)
48+
}
49+
}
50+
}
Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
package com.gemwallet.features.assets.views.components
2+
3+
import androidx.compose.foundation.ExperimentalFoundationApi
4+
import androidx.compose.foundation.layout.Spacer
5+
import androidx.compose.foundation.layout.height
6+
import androidx.compose.foundation.lazy.LazyListScope
7+
import androidx.compose.foundation.lazy.items
8+
import androidx.compose.runtime.MutableState
9+
import androidx.compose.ui.Modifier
10+
import androidx.compose.ui.platform.testTag
11+
import androidx.compose.ui.unit.dp
12+
import com.gemwallet.android.ext.toIdentifier
13+
import com.gemwallet.android.ui.components.list_item.AssetItemUIModel
14+
import com.gemwallet.android.ui.components.list_item.PinnedAssetsHeaderItem
15+
import com.wallet.core.primitives.AssetId
16+
17+
@OptIn(ExperimentalFoundationApi::class)
18+
internal fun LazyListScope.assets(
19+
assets: List<AssetItemUIModel>,
20+
longPressState: MutableState<AssetId?>,
21+
isPinned: Boolean = false,
22+
onAssetClick: (AssetId) -> Unit,
23+
onAssetHide: (AssetId) -> Unit,
24+
onTogglePin: (AssetId) -> Unit,
25+
) {
26+
if (assets.isEmpty()) return
27+
28+
if (isPinned) {
29+
item { PinnedAssetsHeaderItem() }
30+
}
31+
32+
items(items = assets, key = { "${it.asset.id.toIdentifier()}-$isPinned" }) { item ->
33+
AssetItem(
34+
modifier = Modifier.testTag(item.asset.id.toIdentifier()),
35+
item = item,
36+
longPressState = longPressState,
37+
isPinned = isPinned,
38+
onAssetClick = onAssetClick,
39+
onAssetHide = onAssetHide,
40+
onTogglePin = onTogglePin,
41+
)
42+
}
43+
if (isPinned) {
44+
item { Spacer(modifier = Modifier.height(32.dp)) }
45+
}
46+
}

‎features/assets/viewmodels/src/main/kotlin/com/gemwallet/features/assets/viewmodels/AssetsViewModel.kt‎

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,8 +10,6 @@ import com.gemwallet.android.data.repositoreis.session.SessionRepository
1010
import com.gemwallet.android.ext.asset
1111
import com.gemwallet.android.ext.getAccount
1212
import com.gemwallet.android.ext.toIdentifier
13-
import com.gemwallet.features.assets.viewmodels.model.PriceUIState
14-
import com.gemwallet.features.assets.viewmodels.model.WalletInfoUIState
1513
import com.gemwallet.android.model.AssetInfo
1614
import com.gemwallet.android.model.Session
1715
import com.gemwallet.android.model.SyncState
@@ -20,6 +18,8 @@ import com.gemwallet.android.ui.R
2018
import com.gemwallet.android.ui.components.list_item.AssetInfoUIModel
2119
import com.gemwallet.android.ui.components.list_item.AssetItemUIModel
2220
import com.gemwallet.android.ui.models.PriceState
21+
import com.gemwallet.features.assets.viewmodels.model.PriceUIState
22+
import com.gemwallet.features.assets.viewmodels.model.WalletInfoUIState
2323
import com.wallet.core.primitives.AssetId
2424
import com.wallet.core.primitives.Currency
2525
import com.wallet.core.primitives.Wallet

0 commit comments

Comments
 (0)