diff --git a/android/data/coordinators/src/main/kotlin/com/gemwallet/android/data/coordinators/asset/GetActiveAssetsInfoImpl.kt b/android/data/coordinators/src/main/kotlin/com/gemwallet/android/data/coordinators/asset/GetActiveAssetsInfoImpl.kt index f891c6af40..7afb3be9f6 100644 --- a/android/data/coordinators/src/main/kotlin/com/gemwallet/android/data/coordinators/asset/GetActiveAssetsInfoImpl.kt +++ b/android/data/coordinators/src/main/kotlin/com/gemwallet/android/data/coordinators/asset/GetActiveAssetsInfoImpl.kt @@ -3,65 +3,16 @@ package com.gemwallet.android.data.coordinators.asset import com.gemwallet.android.application.assets.coordinators.GetActiveAssetsInfo import com.gemwallet.android.data.repositories.assets.AssetsRepository import com.gemwallet.android.domains.asset.aggregates.AssetInfoDataAggregate -import com.gemwallet.android.domains.asset.aggregates.AssetPriceDataAggregate -import com.gemwallet.android.model.AssetInfo -import com.gemwallet.android.model.CurrencyFormatter -import com.gemwallet.android.model.ValueFormatter -import com.wallet.core.primitives.Currency +import com.gemwallet.android.domains.asset.aggregates.toAssetInfoDataAggregate import kotlinx.coroutines.flow.Flow import kotlinx.coroutines.flow.distinctUntilChanged import kotlinx.coroutines.flow.map -import java.math.BigDecimal class GetActiveAssetsInfoImpl( private val assetsRepository: AssetsRepository, ) : GetActiveAssetsInfo { override fun getAssetsInfo(hideBalance: Boolean): Flow> = assetsRepository.getAssetsInfo() - .map { items -> items.map { it.toAssetInfoDataAggregate(hideBalance) } } + .map { items -> items.map { it.toAssetInfoDataAggregate(hideBalance = hideBalance) } } .distinctUntilChanged() } - -internal fun AssetInfo.toAssetInfoDataAggregate( - hideBalance: Boolean, -): AssetInfoDataAggregate { - val currency = price?.currency ?: Currency.USD - val assetPrice = price?.price - val priceValue = assetPrice?.price?.takeIf(Double::isFinite) - val changePercentage = assetPrice?.priceChangePercentage24h?.takeIf(Double::isFinite) - val assetBalance = balance - val formattedBalance = if (hideBalance) { - "*****" - } else { - ValueFormatter(style = ValueFormatter.Style.Short) - .string(BigDecimal.valueOf(assetBalance.totalAmount), asset.symbol) - } - val balanceEquivalent = if (hideBalance) { - "*****" - } else { - priceValue - ?.takeUnless { it == 0.0 } - ?.let { CurrencyFormatter(currency = currency).string(assetBalance.totalAmount * it) } - .orEmpty() - } - val price = assetPrice?.let { - AssetPriceDataAggregate( - currency = currency, - value = priceValue, - changePercentage = changePercentage, - ) - } - - return AssetInfoDataAggregate( - id = asset.id, - asset = asset, - title = asset.name, - balance = formattedBalance, - balanceEquivalent = balanceEquivalent, - isZeroBalance = assetBalance.totalAmount == 0.0, - price = price, - position = position, - pinned = metadata?.isPinned == true, - accountAddress = owner?.address.orEmpty(), - ) -} diff --git a/android/features/asset_select/presents/src/main/kotlin/com/gemwallet/android/features/asset_select/presents/views/AssetBadge.kt b/android/features/asset_select/presents/src/main/kotlin/com/gemwallet/android/features/asset_select/presents/views/AssetBadge.kt index 3ba5109661..70db467d74 100644 --- a/android/features/asset_select/presents/src/main/kotlin/com/gemwallet/android/features/asset_select/presents/views/AssetBadge.kt +++ b/android/features/asset_select/presents/src/main/kotlin/com/gemwallet/android/features/asset_select/presents/views/AssetBadge.kt @@ -1,7 +1,7 @@ package com.gemwallet.android.features.asset_select.presents.views -import com.gemwallet.android.ui.components.list_item.AssetItemUIModel +import com.gemwallet.android.domains.asset.aggregates.AssetInfoDataAggregate -fun getAssetBadge(item: AssetItemUIModel): String { +fun getAssetBadge(item: AssetInfoDataAggregate): String { return if (item.asset.symbol == item.asset.name) "" else item.asset.symbol } diff --git a/android/features/asset_select/presents/src/main/kotlin/com/gemwallet/android/features/asset_select/presents/views/AssetSelectScene.kt b/android/features/asset_select/presents/src/main/kotlin/com/gemwallet/android/features/asset_select/presents/views/AssetSelectScene.kt index 7ee425972a..d0ab568e5a 100644 --- a/android/features/asset_select/presents/src/main/kotlin/com/gemwallet/android/features/asset_select/presents/views/AssetSelectScene.kt +++ b/android/features/asset_select/presents/src/main/kotlin/com/gemwallet/android/features/asset_select/presents/views/AssetSelectScene.kt @@ -50,8 +50,7 @@ import com.gemwallet.android.ui.components.filters.AssetsFilter import com.gemwallet.android.ui.components.image.AssetIcon import com.gemwallet.android.ui.components.list_item.AssetContextActions import com.gemwallet.android.ui.components.list_item.AssetContextMenuRow -import com.gemwallet.android.ui.components.list_item.AssetInfoUIModel -import com.gemwallet.android.ui.components.list_item.AssetItemUIModel +import com.gemwallet.android.domains.asset.aggregates.AssetInfoDataAggregate import com.gemwallet.android.ui.components.list_item.AssetListItem import com.gemwallet.android.ui.components.list_item.PinnedAssetsHeaderItem import com.gemwallet.android.ui.components.list_item.SubheaderItem @@ -80,13 +79,13 @@ import kotlinx.coroutines.flow.drop @Composable fun AssetSelectScene( title: String, - popular: ImmutableList, - pinned: ImmutableList, - unpinned: ImmutableList, + popular: ImmutableList, + pinned: ImmutableList, + unpinned: ImmutableList, recent: ImmutableList, state: UIState, - titleBadge: (AssetItemUIModel) -> String?, - support: ((AssetItemUIModel) -> (@Composable () -> Unit)?)?, + titleBadge: (AssetInfoDataAggregate) -> String?, + support: ((AssetInfoDataAggregate) -> (@Composable () -> Unit)?)?, query: TextFieldState, tags: List, selectedTag: AssetTag?, @@ -96,7 +95,7 @@ fun AssetSelectScene( balanceFilter: Boolean = false, searchable: Boolean = true, onAction: (AssetSelectAction) -> Unit, - itemTrailing: (@Composable (AssetItemUIModel) -> Unit)? = null, + itemTrailing: (@Composable (AssetInfoDataAggregate) -> Unit)? = null, actions: @Composable RowScope.() -> Unit = {}, contextActions: AssetContextActions = AssetContextActions.Empty, recentsSheetEnabled: Boolean = false, @@ -138,13 +137,13 @@ fun AssetSelectScene( @Composable fun AssetSelectScene( title: @Composable () -> Unit, - popular: ImmutableList, - pinned: ImmutableList, - unpinned: ImmutableList, + popular: ImmutableList, + pinned: ImmutableList, + unpinned: ImmutableList, recent: ImmutableList, state: UIState, - titleBadge: (AssetItemUIModel) -> String?, - support: ((AssetItemUIModel) -> (@Composable () -> Unit)?)?, + titleBadge: (AssetInfoDataAggregate) -> String?, + support: ((AssetInfoDataAggregate) -> (@Composable () -> Unit)?)?, query: TextFieldState, tags: List, selectedTag: AssetTag?, @@ -154,7 +153,7 @@ fun AssetSelectScene( balanceFilter: Boolean = false, searchable: Boolean = true, onAction: (AssetSelectAction) -> Unit, - itemTrailing: (@Composable (AssetItemUIModel) -> Unit)? = null, + itemTrailing: (@Composable (AssetInfoDataAggregate) -> Unit)? = null, actions: @Composable RowScope.() -> Unit = {}, contextActions: AssetContextActions = AssetContextActions.Empty, recentsSheetEnabled: Boolean = false, @@ -301,12 +300,12 @@ fun AssetSelectScene( } private fun LazyListScope.assets( - items: List, + items: List, group: AssetsGroupType, onSelect: ((AssetId) -> Unit)?, - support: ((AssetItemUIModel) -> (@Composable () -> Unit)?)?, - titleBadge: (AssetItemUIModel) -> String?, - itemTrailing: (@Composable (AssetItemUIModel) -> Unit)?, + support: ((AssetInfoDataAggregate) -> (@Composable () -> Unit)?)?, + titleBadge: (AssetInfoDataAggregate) -> String?, + itemTrailing: (@Composable (AssetInfoDataAggregate) -> Unit)?, longPressedAsset: MutableState, contextActions: AssetContextActions, ) { @@ -318,11 +317,11 @@ private fun LazyListScope.assets( } fun LazyListScope.assetRows( - items: List, + items: List, onSelect: ((AssetId) -> Unit)?, - support: ((AssetItemUIModel) -> (@Composable () -> Unit)?)?, - titleBadge: (AssetItemUIModel) -> String?, - itemTrailing: (@Composable (AssetItemUIModel) -> Unit)?, + support: ((AssetInfoDataAggregate) -> (@Composable () -> Unit)?)?, + titleBadge: (AssetInfoDataAggregate) -> String?, + itemTrailing: (@Composable (AssetInfoDataAggregate) -> Unit)?, longPressedAsset: MutableState, contextActions: AssetContextActions, indexOffset: Int = 0, @@ -345,19 +344,19 @@ fun LazyListScope.assetRows( @Composable fun AssetSelectRow( position: ListPosition, - item: AssetItemUIModel, - support: ((AssetItemUIModel) -> (@Composable () -> Unit)?)?, - titleBadge: (AssetItemUIModel) -> String?, - itemTrailing: (@Composable (AssetItemUIModel) -> Unit)?, + item: AssetInfoDataAggregate, + support: ((AssetInfoDataAggregate) -> (@Composable () -> Unit)?)?, + titleBadge: (AssetInfoDataAggregate) -> String?, + itemTrailing: (@Composable (AssetInfoDataAggregate) -> Unit)?, longPressedAsset: MutableState, onSelect: ((AssetId) -> Unit)?, contextActions: AssetContextActions, ) { AssetContextMenuRow( assetId = item.asset.id, - address = item.owner, - isPinned = item.metadata?.isPinned == true, - isBalanceEnabled = item.metadata?.isBalanceEnabled == true, + address = item.accountAddress, + isPinned = item.pinned, + isBalanceEnabled = item.balanceEnabled, longPressed = longPressedAsset, actions = contextActions, onClick = { onSelect?.invoke(item.asset.id) }, @@ -446,9 +445,9 @@ private fun LazyListScope.recent( fun PreviewAssetScreenUI() { MaterialTheme { AssetSelectScene( - pinned = emptyList().toImmutableList(), - unpinned = emptyList().toImmutableList(), - popular = emptyList().toImmutableList(), + pinned = emptyList().toImmutableList(), + unpinned = emptyList().toImmutableList(), + popular = emptyList().toImmutableList(), recent = emptyList().toImmutableList(), state = UIState.Idle, title = "Send", diff --git a/android/features/asset_select/presents/src/main/kotlin/com/gemwallet/android/features/asset_select/presents/views/AssetSelectScreen.kt b/android/features/asset_select/presents/src/main/kotlin/com/gemwallet/android/features/asset_select/presents/views/AssetSelectScreen.kt index 567513a7fb..a4482ae475 100644 --- a/android/features/asset_select/presents/src/main/kotlin/com/gemwallet/android/features/asset_select/presents/views/AssetSelectScreen.kt +++ b/android/features/asset_select/presents/src/main/kotlin/com/gemwallet/android/features/asset_select/presents/views/AssetSelectScreen.kt @@ -7,7 +7,7 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.gemwallet.android.ext.networkName import com.gemwallet.android.ext.type import com.gemwallet.android.model.RecentType -import com.gemwallet.android.ui.components.list_item.AssetItemUIModel +import com.gemwallet.android.domains.asset.aggregates.AssetInfoDataAggregate import com.gemwallet.android.ui.components.list_item.ListItemSupportText import com.gemwallet.android.features.asset_select.viewmodels.BaseAssetSelectViewModel import com.gemwallet.android.features.asset_select.viewmodels.RecentsSheetViewModel @@ -18,14 +18,14 @@ import kotlinx.collections.immutable.toImmutableList @Composable fun AssetSelectScreen( title: String = "", - titleBadge: (AssetItemUIModel) -> String?, + titleBadge: (AssetInfoDataAggregate) -> String?, showPopular: Boolean = false, recentType: RecentType? = null, onCancel: () -> Unit, onSelect: ((AssetId) -> Unit)? = null, onSelectRecent: ((AssetId) -> Unit)? = null, - itemTrailing: (@Composable (AssetItemUIModel) -> Unit)? = null, - itemSupport: ((AssetItemUIModel) -> (@Composable () -> Unit)?)? = null, + itemTrailing: (@Composable (AssetInfoDataAggregate) -> Unit)? = null, + itemSupport: ((AssetInfoDataAggregate) -> (@Composable () -> Unit)?)? = null, onAddAsset: (() -> Unit)? = null, viewModel: BaseAssetSelectViewModel, recentsViewModel: RecentsSheetViewModel = hiltViewModel(), @@ -64,7 +64,7 @@ fun AssetSelectScreen( popular = if (showPopular) { popular } else { - emptyList().toImmutableList() + emptyList().toImmutableList() }, unpinned = unpinned, recent = recent, diff --git a/android/features/asset_select/presents/src/main/kotlin/com/gemwallet/android/features/asset_select/presents/views/AssetsManageScreen.kt b/android/features/asset_select/presents/src/main/kotlin/com/gemwallet/android/features/asset_select/presents/views/AssetsManageScreen.kt index e37226f0af..625fb7d299 100644 --- a/android/features/asset_select/presents/src/main/kotlin/com/gemwallet/android/features/asset_select/presents/views/AssetsManageScreen.kt +++ b/android/features/asset_select/presents/src/main/kotlin/com/gemwallet/android/features/asset_select/presents/views/AssetsManageScreen.kt @@ -15,7 +15,7 @@ import com.gemwallet.android.ext.networkName import com.gemwallet.android.ext.type import com.gemwallet.android.ui.R import com.gemwallet.android.ui.components.list_item.AssetContextActions -import com.gemwallet.android.ui.components.list_item.AssetItemUIModel +import com.gemwallet.android.domains.asset.aggregates.AssetInfoDataAggregate import com.gemwallet.android.ui.components.list_item.ListItemSupportText import com.gemwallet.android.ui.icons.AppIcons import com.wallet.core.primitives.Asset @@ -65,7 +65,7 @@ fun AssetsManageScreen( selectedTag = selectedTag, tags = viewModel.getTags(), pinned = pinned, - popular = emptyList().toImmutableList(), + popular = emptyList().toImmutableList(), unpinned = unpinned, recent = emptyList().toImmutableList(), state = uiStates, @@ -97,7 +97,7 @@ fun AssetsManageScreen( }, itemTrailing = { asset -> Switch( - checked = asset.metadata?.isBalanceEnabled == true, + checked = asset.balanceEnabled, onCheckedChange = { viewModel.onChangeVisibility(asset.asset.id, it) }, ) }, diff --git a/android/features/asset_select/viewmodels/src/main/kotlin/com/gemwallet/android/features/asset_select/viewmodels/BaseAssetSelectViewModel.kt b/android/features/asset_select/viewmodels/src/main/kotlin/com/gemwallet/android/features/asset_select/viewmodels/BaseAssetSelectViewModel.kt index df2e412347..092e2ab51c 100644 --- a/android/features/asset_select/viewmodels/src/main/kotlin/com/gemwallet/android/features/asset_select/viewmodels/BaseAssetSelectViewModel.kt +++ b/android/features/asset_select/viewmodels/src/main/kotlin/com/gemwallet/android/features/asset_select/viewmodels/BaseAssetSelectViewModel.kt @@ -17,8 +17,9 @@ import com.gemwallet.android.ext.assetType import com.gemwallet.android.ext.getAccount import com.gemwallet.android.ext.runCatchingCancellable import com.gemwallet.android.model.RecentType -import com.gemwallet.android.ui.components.list_item.AssetInfoUIModel -import com.gemwallet.android.ui.components.list_item.AssetItemUIModel +import com.gemwallet.android.domains.asset.aggregates.AssetInfoDataAggregate +import com.gemwallet.android.domains.asset.aggregates.AssetRowNaming +import com.gemwallet.android.domains.asset.aggregates.toAssetInfoDataAggregate import com.gemwallet.android.ui.models.AssetToast import com.gemwallet.android.ui.models.AssetToastEmitter import com.gemwallet.android.ui.models.AssetToastEmitterImpl @@ -107,14 +108,15 @@ open class BaseAssetSelectViewModel( .filter { (chainFilter.isEmpty() || it.id().chain in chainFilter) && (!balanceFilter || it.balance.totalAmount > 0.0) } .map { item -> val owner = item.owner ?: wallet?.getAccount(item.asset.id.chain) - AssetInfoUIModel(if (item.owner == owner) item else item.copy(owner = owner)) + val assetInfo = if (item.owner == owner) item else item.copy(owner = owner) + assetInfo.toAssetInfoDataAggregate(AssetRowNaming.CanonicalNative) } } .flowOn(Dispatchers.IO) .shareIn(viewModelScope, SharingStarted.Eagerly, replay = 1) private val assets = assetsContent - .stateIn(viewModelScope, SharingStarted.Eagerly, emptyList()) + .stateIn(viewModelScope, SharingStarted.Eagerly, emptyList()) val popular = assets.map { items -> items.filter { @@ -122,19 +124,19 @@ open class BaseAssetSelectViewModel( }.toImmutableList() } .flowOn(Dispatchers.IO) - .stateIn(viewModelScope, SharingStarted.Eagerly, emptyList().toImmutableList()) + .stateIn(viewModelScope, SharingStarted.Eagerly, emptyList().toImmutableList()) val pinned = assets.map { items -> - items.filter { it.metadata?.isPinned == true && it.metadata?.isBalanceEnabled == true }.toImmutableList() + items.filter { it.pinned && it.balanceEnabled }.toImmutableList() } .flowOn(Dispatchers.IO) - .stateIn(viewModelScope, SharingStarted.Eagerly, emptyList().toImmutableList()) + .stateIn(viewModelScope, SharingStarted.Eagerly, emptyList().toImmutableList()) val unpinned = assets.map { items -> - items.filter { it.metadata?.isPinned != true || it.metadata?.isBalanceEnabled != true }.toImmutableList() + items.filter { !it.pinned || !it.balanceEnabled }.toImmutableList() } .flowOn(Dispatchers.IO) - .stateIn(viewModelScope, SharingStarted.Eagerly, emptyList().toImmutableList()) + .stateIn(viewModelScope, SharingStarted.Eagerly, emptyList().toImmutableList()) val recent = currentQuery .flatMapLatest { query -> @@ -175,7 +177,7 @@ open class BaseAssetSelectViewModel( val session = session.value ?: return@launch session.wallet.getAccount(assetId.chain) ?: return@launch val item = assets.value.firstOrNull { it.asset.id == assetId } - val willPin = item?.metadata?.isPinned != true + val willPin = item?.pinned != true toggleAssetPin(assetId) item?.let { emitToast(AssetToast.Pin(it.asset.name, willPin)) } } diff --git a/android/features/assets/presents/src/main/kotlin/com/gemwallet/android/features/assets/views/NetworkAssetsScreen.kt b/android/features/assets/presents/src/main/kotlin/com/gemwallet/android/features/assets/views/NetworkAssetsScreen.kt index c6f0899abe..299c357171 100644 --- a/android/features/assets/presents/src/main/kotlin/com/gemwallet/android/features/assets/views/NetworkAssetsScreen.kt +++ b/android/features/assets/presents/src/main/kotlin/com/gemwallet/android/features/assets/views/NetworkAssetsScreen.kt @@ -20,7 +20,7 @@ import com.gemwallet.android.ui.R import com.gemwallet.android.ui.components.empty.EmptyContentType import com.gemwallet.android.ui.components.empty.EmptyContentView import com.gemwallet.android.ui.components.list_item.AssetContextActions -import com.gemwallet.android.ui.components.list_item.AssetItemUIModel +import com.gemwallet.android.domains.asset.aggregates.AssetInfoDataAggregate import com.gemwallet.android.ui.components.list_item.PinnedAssetsHeaderItem import com.gemwallet.android.ui.components.list_item.SubheaderItem import com.gemwallet.android.ui.components.list_item.assetPriceSupport @@ -81,7 +81,7 @@ fun NetworkAssetsScreen( } private fun LazyListScope.networkAssetRows( - items: List, + items: List, onSelect: (AssetId) -> Unit, longPressedAsset: MutableState, contextActions: AssetContextActions, diff --git a/android/features/assets/presents/src/main/kotlin/com/gemwallet/android/features/assets/views/WalletSearchScreen.kt b/android/features/assets/presents/src/main/kotlin/com/gemwallet/android/features/assets/views/WalletSearchScreen.kt index d7493af318..156632d6c9 100644 --- a/android/features/assets/presents/src/main/kotlin/com/gemwallet/android/features/assets/views/WalletSearchScreen.kt +++ b/android/features/assets/presents/src/main/kotlin/com/gemwallet/android/features/assets/views/WalletSearchScreen.kt @@ -28,7 +28,7 @@ import com.gemwallet.android.ui.R import com.gemwallet.android.ui.components.SearchBar import com.gemwallet.android.ui.components.image.AsyncImage import com.gemwallet.android.ui.components.list_item.AssetContextActions -import com.gemwallet.android.ui.components.list_item.AssetItemUIModel +import com.gemwallet.android.domains.asset.aggregates.AssetInfoDataAggregate import com.gemwallet.android.ui.components.list_item.ListItem import com.gemwallet.android.ui.components.list_item.ListItemDefaults import com.gemwallet.android.ui.components.list_item.NftListItem @@ -189,7 +189,7 @@ fun WalletSearchScreen( selectedTag = selectedTag, tags = viewModel.getTags(), pinned = pinned, - popular = emptyList().toImmutableList(), + popular = emptyList().toImmutableList(), unpinned = previewAssets.toImmutableList(), recent = recent, state = state, diff --git a/android/features/assets/viewmodels/src/main/kotlin/com/gemwallet/android/features/assets/viewmodels/AssetsResultsViewModel.kt b/android/features/assets/viewmodels/src/main/kotlin/com/gemwallet/android/features/assets/viewmodels/AssetsResultsViewModel.kt index 4667a86772..310929ade3 100644 --- a/android/features/assets/viewmodels/src/main/kotlin/com/gemwallet/android/features/assets/viewmodels/AssetsResultsViewModel.kt +++ b/android/features/assets/viewmodels/src/main/kotlin/com/gemwallet/android/features/assets/viewmodels/AssetsResultsViewModel.kt @@ -19,6 +19,7 @@ import com.gemwallet.android.data.repositories.config.UserConfig import com.gemwallet.android.data.repositories.config.showPerpetuals import com.gemwallet.android.data.repositories.tokens.WalletSearch import com.gemwallet.android.data.repositories.tokens.listPriorityQuery +import com.gemwallet.android.domains.asset.aggregates.AssetInfoDataAggregate import com.gemwallet.android.domains.perpetual.aggregates.PerpetualDataAggregate import com.gemwallet.android.domains.search.WalletSearchConfig import com.gemwallet.android.domains.search.WalletSearchTag @@ -30,7 +31,6 @@ import com.gemwallet.android.features.asset_select.viewmodels.models.SelectSearc import com.gemwallet.android.features.asset_select.viewmodels.models.UIState import com.gemwallet.android.model.RecentType import com.gemwallet.android.ui.R -import com.gemwallet.android.ui.components.list_item.AssetItemUIModel import com.gemwallet.android.ui.models.AssetToast import com.gemwallet.android.ui.models.navigation.RouteArgument import com.wallet.core.primitives.AssetId @@ -87,7 +87,7 @@ class AssetsResultsViewModel @Inject constructor( private val isPullRefreshing = MutableStateFlow(false) val refreshing: StateFlow = isPullRefreshing - val cappedAssets: StateFlow> = combine(pinned, unpinned) { pinned, unpinned -> + val cappedAssets: StateFlow> = combine(pinned, unpinned) { pinned, unpinned -> unpinned.take((WalletSearchConfig.resultsLimit - pinned.size).coerceAtLeast(0)) } .stateIn(viewModelScope, SharingStarted.Eagerly, emptyList()) diff --git a/android/features/assets/viewmodels/src/main/kotlin/com/gemwallet/android/features/assets/viewmodels/NetworkAssetsViewModel.kt b/android/features/assets/viewmodels/src/main/kotlin/com/gemwallet/android/features/assets/viewmodels/NetworkAssetsViewModel.kt index 637efa42bb..f1abfadad6 100644 --- a/android/features/assets/viewmodels/src/main/kotlin/com/gemwallet/android/features/assets/viewmodels/NetworkAssetsViewModel.kt +++ b/android/features/assets/viewmodels/src/main/kotlin/com/gemwallet/android/features/assets/viewmodels/NetworkAssetsViewModel.kt @@ -10,8 +10,9 @@ import com.gemwallet.android.application.assets.coordinators.HideAsset import com.gemwallet.android.application.assets.coordinators.ToggleAssetPin import com.gemwallet.android.application.session.coordinators.GetSession import com.gemwallet.android.ui.R -import com.gemwallet.android.ui.components.list_item.AssetInfoUIModel -import com.gemwallet.android.ui.components.list_item.AssetItemUIModel +import com.gemwallet.android.domains.asset.aggregates.AssetInfoDataAggregate +import com.gemwallet.android.domains.asset.aggregates.AssetRowNaming +import com.gemwallet.android.domains.asset.aggregates.toAssetInfoDataAggregate import com.gemwallet.android.ui.models.navigation.RouteArgument import com.wallet.core.primitives.AssetId import com.wallet.core.primitives.AssetType @@ -47,16 +48,16 @@ class NetworkAssetsViewModel @Inject constructor( .map { assets -> assets.filter { it.asset.type != AssetType.NATIVE } } .flowOn(Dispatchers.IO) - val pinned: StateFlow> = activeAssets - .map { assets -> assets.filter { it.metadata?.isPinned == true }.map { AssetInfoUIModel(it) } } + val pinned: StateFlow> = activeAssets + .map { assets -> assets.filter { it.metadata?.isPinned == true }.map { it.toAssetInfoDataAggregate(AssetRowNaming.CanonicalNative) } } .stateIn(viewModelScope, SharingStarted.Eagerly, emptyList()) - val unpinned: StateFlow> = activeAssets - .map { assets -> assets.filter { it.metadata?.isPinned != true }.map { AssetInfoUIModel(it) } } + val unpinned: StateFlow> = activeAssets + .map { assets -> assets.filter { it.metadata?.isPinned != true }.map { it.toAssetInfoDataAggregate(AssetRowNaming.CanonicalNative) } } .stateIn(viewModelScope, SharingStarted.Eagerly, emptyList()) - val hidden: StateFlow> = getChainAssets.hidden(chain) - .map { assets -> assets.filter { it.asset.type != AssetType.NATIVE }.map { AssetInfoUIModel(it) } } + val hidden: StateFlow> = getChainAssets.hidden(chain) + .map { assets -> assets.filter { it.asset.type != AssetType.NATIVE }.map { it.toAssetInfoDataAggregate(AssetRowNaming.CanonicalNative) } } .flowOn(Dispatchers.IO) .stateIn(viewModelScope, SharingStarted.Eagerly, emptyList()) diff --git a/android/features/assets/viewmodels/src/main/kotlin/com/gemwallet/android/features/assets/viewmodels/WalletSearchViewModel.kt b/android/features/assets/viewmodels/src/main/kotlin/com/gemwallet/android/features/assets/viewmodels/WalletSearchViewModel.kt index 7ea105ddd8..7ab4d09b8c 100644 --- a/android/features/assets/viewmodels/src/main/kotlin/com/gemwallet/android/features/assets/viewmodels/WalletSearchViewModel.kt +++ b/android/features/assets/viewmodels/src/main/kotlin/com/gemwallet/android/features/assets/viewmodels/WalletSearchViewModel.kt @@ -15,6 +15,7 @@ import com.gemwallet.android.cases.tokens.SearchTokensCase import com.gemwallet.android.data.repositories.config.UserConfig import com.gemwallet.android.data.repositories.config.showPerpetuals import com.gemwallet.android.data.repositories.tokens.WalletSearch +import com.gemwallet.android.domains.asset.aggregates.AssetInfoDataAggregate import com.gemwallet.android.domains.perpetual.aggregates.PerpetualDataAggregate import com.gemwallet.android.domains.search.WalletSearchConfig import com.gemwallet.android.ext.toIdentifier @@ -23,7 +24,6 @@ import com.gemwallet.android.features.asset_select.viewmodels.models.BaseSelectS import com.gemwallet.android.features.asset_select.viewmodels.models.UIState import com.gemwallet.android.model.RecentAssetsRequest import com.gemwallet.android.model.RecentType -import com.gemwallet.android.ui.components.list_item.AssetItemUIModel import com.gemwallet.android.ui.models.AssetToast import com.gemwallet.android.ui.models.NftItemUIModel import com.wallet.core.primitives.AssetId @@ -128,7 +128,7 @@ class WalletSearchViewModel @Inject constructor( .flowOn(Dispatchers.IO) .stateIn(viewModelScope, SharingStarted.Eagerly, emptyList()) - val previewAssets: StateFlow> = combine( + val previewAssets: StateFlow> = combine( unpinned, currentQuery, selectedTag, ) { items, query, tag -> items.take(assetsLimit(query, tag)) @@ -174,7 +174,7 @@ class WalletSearchViewModel @Inject constructor( override fun assetsSearchLimit(query: String, tag: AssetTag?): Int = assetsLimit(query, tag) + 1 fun onPinAsset(assetId: AssetId) { - val willPin = (pinned.value + unpinned.value).firstOrNull { it.asset.id == assetId }?.metadata?.isPinned != true + val willPin = (pinned.value + unpinned.value).firstOrNull { it.asset.id == assetId }?.pinned != true onTogglePin(assetId) if (willPin) onChangeVisibility(assetId, true) } diff --git a/android/features/assets/viewmodels/src/test/kotlin/com/gemwallet/android/features/assets/viewmodels/AssetsViewModelTest.kt b/android/features/assets/viewmodels/src/test/kotlin/com/gemwallet/android/features/assets/viewmodels/AssetsViewModelTest.kt index e297204768..d60010f840 100644 --- a/android/features/assets/viewmodels/src/test/kotlin/com/gemwallet/android/features/assets/viewmodels/AssetsViewModelTest.kt +++ b/android/features/assets/viewmodels/src/test/kotlin/com/gemwallet/android/features/assets/viewmodels/AssetsViewModelTest.kt @@ -132,6 +132,7 @@ class AssetsViewModelTest { price = null, position = 0, pinned = pinned, + balanceEnabled = true, accountAddress = "address-$symbol", ) } diff --git a/android/features/buy/presents/src/main/kotlin/com/gemwallet/android/features/buy/views/FiatScene.kt b/android/features/buy/presents/src/main/kotlin/com/gemwallet/android/features/buy/views/FiatScene.kt index 36cfeade60..1d7278e6e9 100644 --- a/android/features/buy/presents/src/main/kotlin/com/gemwallet/android/features/buy/views/FiatScene.kt +++ b/android/features/buy/presents/src/main/kotlin/com/gemwallet/android/features/buy/views/FiatScene.kt @@ -31,7 +31,7 @@ import com.gemwallet.android.ui.models.ButtonState import com.gemwallet.android.ui.components.buttons.RandomGradientButton import com.gemwallet.android.ui.components.fields.AmountField import com.gemwallet.android.ui.components.image.AsyncImage -import com.gemwallet.android.ui.components.list_item.AssetInfoUIModel +import com.gemwallet.android.domains.asset.aggregates.AssetInfoDataAggregate import com.gemwallet.android.ui.components.list_item.AssetListItem import com.gemwallet.android.ui.components.list_item.ListItemSupportText import com.gemwallet.android.ui.components.list_item.property.DataBadgeChevron @@ -57,7 +57,7 @@ import com.wallet.core.primitives.FiatQuoteType @Composable fun BuyScene( asset: Asset, - assetInfo: AssetInfoUIModel?, + assetInfo: AssetInfoDataAggregate?, state: FiatSceneState, type: FiatQuoteType, providers: List, @@ -113,7 +113,7 @@ fun BuyScene( AssetListItem( asset = asset, listPosition = ListPosition.Single, - support = { ListItemSupportText(assetInfo?.cryptoFormatted ?: " ") }, + support = { ListItemSupportText(assetInfo?.balance ?: " ") }, trailing = assetRowSuggestions.takeIf { it.isNotEmpty() }?.let { suggestions -> { FiatSuggestionRow( diff --git a/android/features/buy/viewmodels/src/main/kotlin/com/gemwallet/android/features/buy/viewmodels/FiatViewModel.kt b/android/features/buy/viewmodels/src/main/kotlin/com/gemwallet/android/features/buy/viewmodels/FiatViewModel.kt index 42fa4d4fca..ea66c0710d 100644 --- a/android/features/buy/viewmodels/src/main/kotlin/com/gemwallet/android/features/buy/viewmodels/FiatViewModel.kt +++ b/android/features/buy/viewmodels/src/main/kotlin/com/gemwallet/android/features/buy/viewmodels/FiatViewModel.kt @@ -20,7 +20,8 @@ import com.gemwallet.android.model.AssetData import com.gemwallet.android.model.CryptoFiatConverter import com.gemwallet.android.model.Fiat import com.gemwallet.android.model.hasAvailable -import com.gemwallet.android.ui.components.list_item.AssetInfoUIModel +import com.gemwallet.android.domains.asset.aggregates.AssetRowNaming +import com.gemwallet.android.domains.asset.aggregates.toAssetInfoDataAggregate import com.gemwallet.android.ui.models.ButtonState import com.gemwallet.android.ui.models.buttonState import com.gemwallet.android.ui.models.navigation.RouteArgument @@ -110,13 +111,11 @@ class FiatViewModel @Inject constructor( val assetInfoUIModel = assetData .mapNotNull { it } .map { - object : AssetInfoUIModel( - assetInfo = it.toAssetInfo(), - hideBalances = false, - ) { - override val cryptoAmount: Double - get() = assetInfo.balance.balanceAmount.available - } + val assetInfo = it.toAssetInfo() + assetInfo.toAssetInfoDataAggregate( + naming = AssetRowNaming.CanonicalNative, + displayedAmount = assetInfo.balance.balanceAmount.available, + ) } .stateIn(viewModelScope, SharingStarted.Eagerly, null) diff --git a/android/features/settings/price_alerts/presents/src/main/kotlin/com/gemwallet/android/features/settings/price_alerts/presents/PriceAlertListItem.kt b/android/features/settings/price_alerts/presents/src/main/kotlin/com/gemwallet/android/features/settings/price_alerts/presents/PriceAlertListItem.kt index 322bfbb413..56a4b3ee84 100644 --- a/android/features/settings/price_alerts/presents/src/main/kotlin/com/gemwallet/android/features/settings/price_alerts/presents/PriceAlertListItem.kt +++ b/android/features/settings/price_alerts/presents/src/main/kotlin/com/gemwallet/android/features/settings/price_alerts/presents/PriceAlertListItem.kt @@ -11,7 +11,8 @@ import com.gemwallet.android.domains.pricealerts.aggregates.PriceAlertDataAggreg import com.gemwallet.android.domains.pricealerts.aggregates.PriceAlertType import com.gemwallet.android.model.AssetInfo import com.gemwallet.android.ui.R -import com.gemwallet.android.ui.components.list_item.AssetInfoUIModel +import com.gemwallet.android.domains.asset.aggregates.AssetRowNaming +import com.gemwallet.android.domains.asset.aggregates.toAssetInfoDataAggregate import com.gemwallet.android.ui.components.list_item.AssetListItem import com.gemwallet.android.ui.components.list_item.PriceInfo import com.gemwallet.android.ui.components.list_item.assetPriceSupport @@ -79,12 +80,12 @@ internal fun PriceAlertAutoAssetItem( enabled: Boolean, onCheckedChange: (Boolean) -> Unit, ) { - val uiModel = remember(assetInfo) { AssetInfoUIModel(assetInfo) } + val uiModel = remember(assetInfo) { assetInfo.toAssetInfoDataAggregate(AssetRowNaming.CanonicalNative) } AssetListItem( asset = uiModel, listPosition = ListPosition.Single, support = assetPriceSupport(uiModel.price), - badge = uiModel.symbol.uppercase(), + badge = uiModel.asset.symbol.uppercase(), trailing = { Switch( checked = enabled, diff --git a/android/features/swap/presents/src/main/kotlin/com/gemwallet/android/features/swap/views/SwapSelectScreen.kt b/android/features/swap/presents/src/main/kotlin/com/gemwallet/android/features/swap/views/SwapSelectScreen.kt index 589985f341..5ce3cde4bd 100644 --- a/android/features/swap/presents/src/main/kotlin/com/gemwallet/android/features/swap/views/SwapSelectScreen.kt +++ b/android/features/swap/presents/src/main/kotlin/com/gemwallet/android/features/swap/views/SwapSelectScreen.kt @@ -8,7 +8,7 @@ import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.gemwallet.android.ext.networkName import com.gemwallet.android.ext.type import com.gemwallet.android.ui.R -import com.gemwallet.android.ui.components.list_item.AssetItemUIModel +import com.gemwallet.android.domains.asset.aggregates.AssetInfoDataAggregate import com.gemwallet.android.ui.components.list_item.ListItemSupportText import com.gemwallet.android.ui.components.list_item.getBalanceInfo import com.gemwallet.android.features.asset_select.presents.views.AssetSelectAction @@ -57,7 +57,7 @@ fun SwapSelectScreen( query = viewModel.queryState, tags = viewModel.getTags(), selectedTag = selectedTag, - popular = emptyList().toImmutableList(), + popular = emptyList().toImmutableList(), pinned = pinned, unpinned = unpinned, recent = recent, diff --git a/android/gemcore/src/main/kotlin/com/gemwallet/android/domains/asset/aggregates/AssetInfoDataAggregate.kt b/android/gemcore/src/main/kotlin/com/gemwallet/android/domains/asset/aggregates/AssetInfoDataAggregate.kt index 76ba7255c5..23c88539ad 100644 --- a/android/gemcore/src/main/kotlin/com/gemwallet/android/domains/asset/aggregates/AssetInfoDataAggregate.kt +++ b/android/gemcore/src/main/kotlin/com/gemwallet/android/domains/asset/aggregates/AssetInfoDataAggregate.kt @@ -1,10 +1,18 @@ package com.gemwallet.android.domains.asset.aggregates import androidx.compose.runtime.Immutable +import com.gemwallet.android.domains.asset.chain +import com.gemwallet.android.domains.asset.subtype import com.gemwallet.android.domains.price.values.EquivalentValue +import com.gemwallet.android.ext.asset +import com.gemwallet.android.model.AssetInfo +import com.gemwallet.android.model.CurrencyFormatter +import com.gemwallet.android.model.ValueFormatter import com.wallet.core.primitives.Asset import com.wallet.core.primitives.AssetId +import com.wallet.core.primitives.AssetSubtype import com.wallet.core.primitives.Currency +import java.math.BigDecimal @Immutable data class AssetInfoDataAggregate( @@ -17,6 +25,7 @@ data class AssetInfoDataAggregate( val price: AssetPriceDataAggregate?, val position: Int, val pinned: Boolean, + val balanceEnabled: Boolean, val accountAddress: String, ) @@ -26,3 +35,61 @@ data class AssetPriceDataAggregate( override val value: Double?, override val changePercentage: Double?, ) : EquivalentValue + +enum class AssetRowNaming { + Stored, + CanonicalNative, +} + +fun AssetInfo.toAssetInfoDataAggregate( + naming: AssetRowNaming = AssetRowNaming.Stored, + hideBalance: Boolean = false, + displayedAmount: Double = balance.totalAmount, +): AssetInfoDataAggregate { + val currency = price?.currency ?: Currency.USD + val assetPrice = price?.price + val priceValue = assetPrice?.price?.takeIf(Double::isFinite) + val changePercentage = assetPrice?.priceChangePercentage24h?.takeIf(Double::isFinite) + val formattedBalance = if (hideBalance) { + "*****" + } else { + ValueFormatter(style = ValueFormatter.Style.Short) + .string(BigDecimal.valueOf(displayedAmount), asset.symbol) + } + val balanceEquivalent = if (hideBalance) { + "*****" + } else { + priceValue + ?.takeUnless { it == 0.0 } + ?.let { CurrencyFormatter(currency = currency).string(displayedAmount * it) } + .orEmpty() + } + + return AssetInfoDataAggregate( + id = asset.id, + asset = asset, + title = title(naming), + balance = formattedBalance, + balanceEquivalent = balanceEquivalent, + isZeroBalance = displayedAmount == 0.0, + price = assetPrice?.let { + AssetPriceDataAggregate( + currency = currency, + value = priceValue, + changePercentage = changePercentage, + ) + }, + position = position, + pinned = metadata?.isPinned == true, + balanceEnabled = metadata?.isBalanceEnabled == true, + accountAddress = owner?.address.orEmpty(), + ) +} + +private fun AssetInfo.title(naming: AssetRowNaming): String = when (naming) { + AssetRowNaming.Stored -> asset.name + AssetRowNaming.CanonicalNative -> when (asset.subtype) { + AssetSubtype.NATIVE -> asset.chain.asset().name + AssetSubtype.TOKEN -> asset.name + } +} diff --git a/android/data/coordinators/src/test/kotlin/com/gemwallet/android/data/coordinators/asset/AssetInfoDataAggregateImplTest.kt b/android/gemcore/src/test/kotlin/com/gemwallet/android/domains/asset/aggregates/AssetInfoDataAggregateTest.kt similarity index 99% rename from android/data/coordinators/src/test/kotlin/com/gemwallet/android/data/coordinators/asset/AssetInfoDataAggregateImplTest.kt rename to android/gemcore/src/test/kotlin/com/gemwallet/android/domains/asset/aggregates/AssetInfoDataAggregateTest.kt index b156bbad4f..c82d7afabe 100644 --- a/android/data/coordinators/src/test/kotlin/com/gemwallet/android/data/coordinators/asset/AssetInfoDataAggregateImplTest.kt +++ b/android/gemcore/src/test/kotlin/com/gemwallet/android/domains/asset/aggregates/AssetInfoDataAggregateTest.kt @@ -1,4 +1,4 @@ -package com.gemwallet.android.data.coordinators.asset +package com.gemwallet.android.domains.asset.aggregates import com.gemwallet.android.domains.price.ValueDirection import com.gemwallet.android.model.AssetBalance @@ -21,7 +21,7 @@ import org.junit.Assert.assertNull import org.junit.Assert.assertTrue import org.junit.Test -class AssetInfoDataAggregateImplTest { +class AssetInfoDataAggregateTest { private val btcAsset = Asset( id = AssetId(Chain.Bitcoin), diff --git a/android/ui-models/src/main/kotlin/com/gemwallet/android/ui/models/PercentageFormattedUIModel.kt b/android/ui-models/src/main/kotlin/com/gemwallet/android/ui/models/PercentageFormattedUIModel.kt deleted file mode 100644 index c5717ea4db..0000000000 --- a/android/ui-models/src/main/kotlin/com/gemwallet/android/ui/models/PercentageFormattedUIModel.kt +++ /dev/null @@ -1,10 +0,0 @@ -package com.gemwallet.android.ui.models - -import com.gemwallet.android.domains.percentage.formatAsPercentage - -interface PercentageFormattedUIModel { - val percentage: Double? - - val percentageFormatted: String - get() = percentage.formatAsPercentage() -} diff --git a/android/ui-models/src/main/kotlin/com/gemwallet/android/ui/models/PriceUIModel.kt b/android/ui-models/src/main/kotlin/com/gemwallet/android/ui/models/PriceUIModel.kt deleted file mode 100644 index 551d52ca2d..0000000000 --- a/android/ui-models/src/main/kotlin/com/gemwallet/android/ui/models/PriceUIModel.kt +++ /dev/null @@ -1,9 +0,0 @@ -package com.gemwallet.android.ui.models - -import com.gemwallet.android.domains.price.ValueDirection -import com.gemwallet.android.domains.price.toValueDirection - -interface PriceUIModel : FiatFormattedUIModel, PercentageFormattedUIModel { - val state: ValueDirection - get() = percentage.toValueDirection() -} diff --git a/android/ui/src/main/kotlin/com/gemwallet/android/ui/components/list_item/AssetItem.kt b/android/ui/src/main/kotlin/com/gemwallet/android/ui/components/list_item/AssetItem.kt index 8ba97dca5f..468197057a 100644 --- a/android/ui/src/main/kotlin/com/gemwallet/android/ui/components/list_item/AssetItem.kt +++ b/android/ui/src/main/kotlin/com/gemwallet/android/ui/components/list_item/AssetItem.kt @@ -20,12 +20,12 @@ import androidx.compose.ui.text.style.TextOverflow import androidx.compose.ui.unit.Dp import androidx.compose.ui.unit.dp import com.gemwallet.android.domains.asset.aggregates.AssetInfoDataAggregate +import com.gemwallet.android.domains.asset.aggregates.AssetPriceDataAggregate import com.gemwallet.android.domains.price.ValueDirection import com.gemwallet.android.ui.components.image.AssetIcon import com.gemwallet.android.ui.models.CryptoFormattedUIModel import com.gemwallet.android.ui.models.FiatFormattedUIModel import com.gemwallet.android.ui.models.ListPosition -import com.gemwallet.android.ui.models.PriceUIModel import com.gemwallet.android.ui.theme.adaptivePadding import com.gemwallet.android.ui.theme.alpha10 import com.gemwallet.android.ui.theme.paddingMiddle @@ -44,37 +44,9 @@ fun AssetListItem( asset: AssetInfoDataAggregate, modifier: Modifier = Modifier, listPosition: ListPosition, -) { - ListItem( - modifier = modifier, - listPosition = listPosition, - minHeight = ListItemDefaults.iconMinHeight, - contentPadding = assetListItemContentPadding(), - titleSubtitleSpacing = space0, - leading = @Composable { AssetIcon(asset.asset) }, - title = @Composable { ListItemTitleText(asset.title) }, - subtitle = asset.price?.let { - { - PriceInfo( - it.valueFormatted, - it.changePercentageFormatted, - it.state, - style = MaterialTheme.typography.bodyMedium, - ) - } - }, - trailing = { getBalanceInfo(asset.balance, asset.balanceEquivalent, asset.isZeroBalance).invoke() }, - ) -} - -@Composable -fun AssetListItem( - asset: AssetItemUIModel, - support: @Composable (() -> Unit)?, - modifier: Modifier = Modifier, - listPosition: ListPosition, + support: (@Composable () -> Unit)? = assetPriceSupport(asset.price), badge: String? = null, - trailing: (@Composable () -> Unit)? = null, + trailing: (@Composable () -> Unit)? = { getBalanceInfo(asset).invoke() }, ) { ListItem( modifier = modifier, @@ -83,7 +55,7 @@ fun AssetListItem( contentPadding = assetListItemContentPadding(), titleSubtitleSpacing = space0, leading = @Composable { AssetIcon(asset.asset) }, - title = @Composable { ListItemTitleText(asset.name, { Badge(text = badge) }) }, + title = @Composable { ListItemTitleText(asset.title, { Badge(text = badge) }) }, subtitle = support, trailing = if (trailing == null) null else { { trailing.invoke() } @@ -129,32 +101,15 @@ fun Badge(text: String?) { ) } -@Composable -fun PriceInfo( - price: PriceUIModel, - modifier: Modifier = Modifier, - style: TextStyle = MaterialTheme.typography.bodyLarge, - isHighlightPercentage: Boolean = false, - internalPadding: Dp = paddingHalfSmall, -) { - PriceInfo( - price.fiatFormatted, - price.percentageFormatted, - price.state, - modifier, - style, - isHighlightPercentage, - internalPadding, - ) -} - -fun assetPriceSupport(price: PriceUIModel): (@Composable () -> Unit)? { - if (price.fiatFormatted.isEmpty()) { +fun assetPriceSupport(price: AssetPriceDataAggregate?): (@Composable () -> Unit)? { + if (price == null || price.valueFormatted.isEmpty()) { return null } return { PriceInfo( - price = price, + price.valueFormatted, + price.changePercentageFormatted, + price.state, style = MaterialTheme.typography.bodyMedium, internalPadding = paddingHalfSmall, ) @@ -198,8 +153,8 @@ fun PriceInfo( } } -fun getBalanceInfo(uiModel: AssetItemUIModel): @Composable () -> Unit - = getBalanceInfo(uiModel, uiModel) +fun getBalanceInfo(asset: AssetInfoDataAggregate): @Composable () -> Unit + = getBalanceInfo(asset.balance, asset.balanceEquivalent, asset.isZeroBalance) fun getBalanceInfo(crypto: CryptoFormattedUIModel, fiatFormattedUIModel: FiatFormattedUIModel): @Composable () -> Unit { return (@Composable { diff --git a/android/ui/src/main/kotlin/com/gemwallet/android/ui/components/list_item/AssetItemUIModel.kt b/android/ui/src/main/kotlin/com/gemwallet/android/ui/components/list_item/AssetItemUIModel.kt deleted file mode 100644 index a1e93638a5..0000000000 --- a/android/ui/src/main/kotlin/com/gemwallet/android/ui/components/list_item/AssetItemUIModel.kt +++ /dev/null @@ -1,103 +0,0 @@ -package com.gemwallet.android.ui.components.list_item - -import androidx.compose.runtime.Stable -import com.gemwallet.android.domains.asset.chain -import com.gemwallet.android.domains.asset.subtype -import com.gemwallet.android.ext.asset -import com.gemwallet.android.model.AssetInfo -import com.gemwallet.android.ui.models.CryptoFormattedUIModel -import com.gemwallet.android.ui.models.FiatFormattedUIModel -import com.gemwallet.android.ui.models.PriceUIModel -import com.wallet.core.primitives.Asset -import com.wallet.core.primitives.AssetMetaData -import com.wallet.core.primitives.AssetSubtype -import com.wallet.core.primitives.Currency - - -// TODO: Move to ui-models - -interface AssetItemUIModel : CryptoFormattedUIModel, FiatFormattedUIModel { - val name: String - val symbol: String - val price: PriceUIModel - val owner: String? - val position: Int - val metadata: AssetMetaData? -} - -@Stable -open class AssetInfoUIModel( - val assetInfo: AssetInfo, - val hideBalances: Boolean = false, -) : AssetItemUIModel { - - override val asset: Asset - get() = assetInfo.asset - - override val name: String by lazy { - when (asset.subtype) { - AssetSubtype.NATIVE -> asset.chain.asset().name - AssetSubtype.TOKEN -> asset.name - } - } - - override val symbol: String by lazy { asset.symbol } - - override val cryptoAmount: Double - get() = assetInfo.balance.totalAmount - - override val cryptoFormatted: String - get() = if (hideBalances) "*****" else super.cryptoFormatted - - override val fiat: Double? by lazy { - val price = assetInfo.price?.price?.price ?: 0.0 - if (price == 0.0) null else cryptoAmount * price - } - - override val fiatFormatted: String - get() = if (hideBalances) "*****" else super.fiatFormatted - - override val price: PriceUIModel by lazy { - AssetPriceUIModel(currency, assetInfo.price?.price) - } - - override val currency: Currency - get() = assetInfo.price?.currency ?: Currency.USD - - override val owner: String? by lazy { assetInfo.owner?.address } - - override val position: Int by lazy { assetInfo.position } - - override val metadata: AssetMetaData? by lazy { assetInfo.metadata } - - override fun equals(other: Any?): Boolean { - return (other is AssetInfoUIModel) && other.asset.id == asset.id - && other.assetInfo.price == assetInfo.price - && other.assetInfo.balance == assetInfo.balance - && other.metadata?.isEnabled == assetInfo.metadata?.isEnabled - && other.metadata?.isBalanceEnabled == assetInfo.metadata?.isBalanceEnabled - && other.metadata?.isSwapEnabled == assetInfo.metadata?.isSwapEnabled - && other.metadata?.isBuyEnabled == assetInfo.metadata?.isBuyEnabled - && other.metadata?.isStakeEnabled == assetInfo.metadata?.isStakeEnabled - && other.metadata?.isPinned == assetInfo.metadata?.isPinned - && other.metadata?.isSellEnabled == assetInfo.metadata?.isSellEnabled - && other.hideBalances == hideBalances - } - - override fun hashCode(): Int { - var result = assetInfo.hashCode() - result = 31 * result + asset.hashCode() - result = 31 * result + name.hashCode() - result = 31 * result + symbol.hashCode() - result = 31 * result + cryptoAmount.hashCode() - result = 31 * result + (fiat?.hashCode() ?: 0) - result = 31 * result + price.hashCode() - result = 31 * result + currency.hashCode() - result = 31 * result + owner.hashCode() - result = 31 * result + isZeroAmount.hashCode() - result = 31 * result + position - result = 31 * result + (metadata?.hashCode() ?: 0) - result = 31 * result + hideBalances.hashCode() - return result - } -} diff --git a/android/ui/src/main/kotlin/com/gemwallet/android/ui/components/list_item/AssetPriceUIModel.kt b/android/ui/src/main/kotlin/com/gemwallet/android/ui/components/list_item/AssetPriceUIModel.kt deleted file mode 100644 index 96d5c7e76d..0000000000 --- a/android/ui/src/main/kotlin/com/gemwallet/android/ui/components/list_item/AssetPriceUIModel.kt +++ /dev/null @@ -1,16 +0,0 @@ -package com.gemwallet.android.ui.components.list_item - -import com.gemwallet.android.ui.models.PriceUIModel -import com.wallet.core.primitives.AssetPrice -import com.wallet.core.primitives.Currency - -class AssetPriceUIModel( - override val currency: Currency, - private val assetPrice: AssetPrice?, -) : PriceUIModel { - override val percentage: Double? - get() = assetPrice?.priceChangePercentage24h - - override val fiat: Double? - get() = assetPrice?.price -} \ No newline at end of file