From 1bbc73691324ab891c01b36adcd8f118cbbcfb03 Mon Sep 17 00:00:00 2001 From: micbakos-rdx Date: Tue, 5 Sep 2023 17:56:06 +0300 Subject: [PATCH 1/2] Show dapp's associated tokens correctly --- .../data/gateway/model/ExplicitMetadataKey.kt | 2 +- .../repository/dappmetadata/DAppRepository.kt | 28 +- .../DAppWithMetadataAndAssociatedResources.kt | 4 +- .../presentation/account/AccountScreen.kt | 10 +- .../FungibleTokenBottomSheetDetails.kt | 4 +- .../NonFungibleTokenBottomSheetDetails.kt | 285 +++++++++--------- .../dappdetail/DAppDetailsSheetContent.kt | 6 +- .../settings/dappdetail/DappDetailScreen.kt | 89 +++--- .../dappdetail/DappDetailViewModel.kt | 16 +- .../personadetail/PersonaDetailScreen.kt | 22 +- .../personadetail/PersonaDetailViewModel.kt | 13 +- .../ui/composables/GrayBackgroundWrapper.kt | 9 +- 12 files changed, 235 insertions(+), 253 deletions(-) diff --git a/app/src/main/java/com/babylon/wallet/android/data/gateway/model/ExplicitMetadataKey.kt b/app/src/main/java/com/babylon/wallet/android/data/gateway/model/ExplicitMetadataKey.kt index d5b5d7ce9b..afb2478439 100644 --- a/app/src/main/java/com/babylon/wallet/android/data/gateway/model/ExplicitMetadataKey.kt +++ b/app/src/main/java/com/babylon/wallet/android/data/gateway/model/ExplicitMetadataKey.kt @@ -87,7 +87,7 @@ enum class ExplicitMetadataKey(val key: String) { websites = value.typed()?.propertyValues.orEmpty() ) CLAIMED_ENTITIES -> ClaimedEntitiesMetadataItem( - entities = value.typed()?.propertyValues.orEmpty() + entities = value.typed()?.propertyValues.orEmpty() ) TAGS -> TagsMetadataItem( tags = value.typed()?.propertyValues.orEmpty() diff --git a/app/src/main/java/com/babylon/wallet/android/data/repository/dappmetadata/DAppRepository.kt b/app/src/main/java/com/babylon/wallet/android/data/repository/dappmetadata/DAppRepository.kt index bb4e62aa10..13c6d0cb79 100644 --- a/app/src/main/java/com/babylon/wallet/android/data/repository/dappmetadata/DAppRepository.kt +++ b/app/src/main/java/com/babylon/wallet/android/data/repository/dappmetadata/DAppRepository.kt @@ -3,6 +3,9 @@ package com.babylon.wallet.android.data.repository.dappmetadata import com.babylon.wallet.android.data.gateway.apis.DAppDefinitionApi import com.babylon.wallet.android.data.gateway.apis.StateApi import com.babylon.wallet.android.data.gateway.extensions.asMetadataItems +import com.babylon.wallet.android.data.gateway.extensions.calculateResourceBehaviours +import com.babylon.wallet.android.data.gateway.extensions.divisibility +import com.babylon.wallet.android.data.gateway.extensions.totalSupply import com.babylon.wallet.android.data.gateway.generated.models.ResourceAggregationLevel import com.babylon.wallet.android.data.gateway.generated.models.StateEntityDetailsOptIns import com.babylon.wallet.android.data.gateway.generated.models.StateEntityDetailsRequest @@ -206,20 +209,29 @@ class DAppRepositoryImpl @Inject constructor( nameMetadataItem = metadataItems.consume(), symbolMetadataItem = metadataItems.consume(), descriptionMetadataItem = metadataItems.consume(), - iconUrlMetadataItem = metadataItems.consume() + iconUrlMetadataItem = metadataItems.consume(), + behaviours = fungibleItem.details?.calculateResourceBehaviours().orEmpty(), + currentSupply = fungibleItem.details?.totalSupply()?.toBigDecimal(), + validatorMetadataItem = metadataItems.toMutableList().consume(), + poolMetadataItem = metadataItems.toMutableList().consume(), + divisibility = fungibleItem.details?.divisibility() ) } val nonFungibleResource = nonFungibleItems.map { nonFungibleItem -> val metadataItems = nonFungibleItem.metadata.asMetadataItems().toMutableList() - Resource.NonFungibleResource.Item( - collectionAddress = nonFungibleItem.address, - localId = Resource.NonFungibleResource.Item.ID.from( - nonFungibleItem.ancestorIdentities?.globalAddress.orEmpty() - ), - nameMetadataItem = null, - iconMetadataItem = metadataItems.consume() + Resource.NonFungibleResource( + resourceAddress = nonFungibleItem.address, + amount = 0L, + nameMetadataItem = metadataItems.consume(), + descriptionMetadataItem = metadataItems.consume(), + iconMetadataItem = metadataItems.consume(), + tagsMetadataItem = metadataItems.consume(), + validatorMetadataItem = metadataItems.consume(), + items = emptyList(), + behaviours = nonFungibleItem.details?.calculateResourceBehaviours().orEmpty(), + currentSupply = nonFungibleItem.details?.totalSupply()?.toBigDecimal() ) } diff --git a/app/src/main/java/com/babylon/wallet/android/domain/model/DAppWithMetadataAndAssociatedResources.kt b/app/src/main/java/com/babylon/wallet/android/domain/model/DAppWithMetadataAndAssociatedResources.kt index 0a51c6493d..5530e35307 100644 --- a/app/src/main/java/com/babylon/wallet/android/domain/model/DAppWithMetadataAndAssociatedResources.kt +++ b/app/src/main/java/com/babylon/wallet/android/domain/model/DAppWithMetadataAndAssociatedResources.kt @@ -8,11 +8,11 @@ data class DAppWithMetadataAndAssociatedResources( val fungibleResources: List get() = resources.fungibleResources - val nonFungibleResources: List + val nonFungibleResources: List get() = resources.nonFungibleResources } data class DAppResources( val fungibleResources: List, - val nonFungibleResources: List + val nonFungibleResources: List ) diff --git a/app/src/main/java/com/babylon/wallet/android/presentation/account/AccountScreen.kt b/app/src/main/java/com/babylon/wallet/android/presentation/account/AccountScreen.kt index 028ce83d77..4a01f94558 100644 --- a/app/src/main/java/com/babylon/wallet/android/presentation/account/AccountScreen.kt +++ b/app/src/main/java/com/babylon/wallet/android/presentation/account/AccountScreen.kt @@ -308,11 +308,9 @@ private fun SheetContent( when (val selected = state.selectedResource) { is SelectedResource.SelectedNonFungibleResource -> { NonFungibleTokenBottomSheetDetails( - modifier = modifier - .fillMaxWidth() - .verticalScroll(rememberScrollState()), + modifier = modifier.fillMaxWidth(), item = selected.item, - nonFungibleItem = selected.nonFungible, + nonFungibleResource = selected.nonFungible, onCloseClick = { scope.launch { bottomSheetState.hide() @@ -323,9 +321,7 @@ private fun SheetContent( is SelectedResource.SelectedFungibleResource -> { FungibleTokenBottomSheetDetails( - modifier = modifier - .fillMaxWidth() - .verticalScroll(rememberScrollState()), + modifier = modifier.fillMaxWidth(), fungible = selected.fungible, onCloseClick = { scope.launch { diff --git a/app/src/main/java/com/babylon/wallet/android/presentation/account/composable/FungibleTokenBottomSheetDetails.kt b/app/src/main/java/com/babylon/wallet/android/presentation/account/composable/FungibleTokenBottomSheetDetails.kt index b3157727aa..03a837ec8f 100644 --- a/app/src/main/java/com/babylon/wallet/android/presentation/account/composable/FungibleTokenBottomSheetDetails.kt +++ b/app/src/main/java/com/babylon/wallet/android/presentation/account/composable/FungibleTokenBottomSheetDetails.kt @@ -14,6 +14,8 @@ import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll import androidx.compose.material.Icon import androidx.compose.material.Text import androidx.compose.material3.Divider @@ -53,7 +55,7 @@ fun FungibleTokenBottomSheetDetails( modifier: Modifier = Modifier, ) { Column( - modifier = modifier, + modifier = modifier.verticalScroll(rememberScrollState()), horizontalAlignment = Alignment.CenterHorizontally ) { RadixCenteredTopAppBar( diff --git a/app/src/main/java/com/babylon/wallet/android/presentation/account/composable/NonFungibleTokenBottomSheetDetails.kt b/app/src/main/java/com/babylon/wallet/android/presentation/account/composable/NonFungibleTokenBottomSheetDetails.kt index 8f735f7d02..966ce28732 100644 --- a/app/src/main/java/com/babylon/wallet/android/presentation/account/composable/NonFungibleTokenBottomSheetDetails.kt +++ b/app/src/main/java/com/babylon/wallet/android/presentation/account/composable/NonFungibleTokenBottomSheetDetails.kt @@ -8,12 +8,15 @@ import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.ExperimentalLayoutApi import androidx.compose.foundation.layout.FlowRow +import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.Row import androidx.compose.foundation.layout.Spacer import androidx.compose.foundation.layout.fillMaxWidth import androidx.compose.foundation.layout.height import androidx.compose.foundation.layout.padding import androidx.compose.foundation.layout.size +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll import androidx.compose.material.Text import androidx.compose.material3.Divider import androidx.compose.runtime.Composable @@ -46,13 +49,14 @@ import com.google.accompanist.drawablepainter.rememberDrawablePainter @OptIn(ExperimentalLayoutApi::class) @Composable fun NonFungibleTokenBottomSheetDetails( - item: Resource.NonFungibleResource.Item, + item: Resource.NonFungibleResource.Item?, onCloseClick: () -> Unit, modifier: Modifier = Modifier, - nonFungibleItem: Resource.NonFungibleResource? = null, + nonFungibleResource: Resource.NonFungibleResource? = null, ) { Column( - modifier, + modifier = modifier + .verticalScroll(rememberScrollState()), horizontalAlignment = Alignment.CenterHorizontally ) { RadixCenteredTopAppBar( @@ -61,12 +65,7 @@ fun NonFungibleTokenBottomSheetDetails( contentColor = RadixTheme.colors.gray1, backIconType = BackIconType.Close ) - Column( - modifier = Modifier - .fillMaxWidth() - .padding(horizontal = RadixTheme.dimensions.paddingXLarge), - horizontalAlignment = Alignment.CenterHorizontally - ) { + if (item != null) { val painter = rememberAsyncImagePainter( model = rememberImageUrl( fromUrl = item.imageUrl, @@ -81,12 +80,15 @@ fun NonFungibleTokenBottomSheetDetails( contentScale = ContentScale.FillWidth, modifier = Modifier .fillMaxWidth() + .padding(horizontal = RadixTheme.dimensions.paddingXLarge) .clip(RadixTheme.shapes.roundedRectMedium) .background(Color.Transparent, RadixTheme.shapes.roundedRectMedium) ) Spacer(modifier = Modifier.height(RadixTheme.dimensions.paddingLarge)) AssetMetadataRow( - modifier = Modifier.fillMaxWidth(), + modifier = Modifier + .fillMaxWidth() + .padding(horizontal = RadixTheme.dimensions.paddingXLarge), key = stringResource(id = R.string.assetDetails_NFTDetails_id) ) { ActionableAddressView( @@ -98,7 +100,7 @@ fun NonFungibleTokenBottomSheetDetails( Spacer(modifier = Modifier.height(RadixTheme.dimensions.paddingDefault)) item.nameMetadataItem?.name?.let { name -> Row( - modifier = Modifier, + modifier = Modifier.padding(horizontal = RadixTheme.dimensions.paddingXLarge), verticalAlignment = Alignment.CenterVertically, horizontalArrangement = Arrangement.SpaceBetween ) { @@ -115,154 +117,149 @@ fun NonFungibleTokenBottomSheetDetails( ) } } + Spacer(modifier = Modifier.weight(1f)) } - Spacer(modifier = Modifier.weight(1f)) - if (nonFungibleItem != null) { - Divider( - Modifier - .fillMaxWidth() - .padding(top = RadixTheme.dimensions.paddingDefault), - color = RadixTheme.colors.gray4 - ) - GrayBackgroundWrapper { - Column( - modifier = Modifier + if (nonFungibleResource != null) { + if (item != null) { + Divider( + Modifier .fillMaxWidth() - .padding(horizontal = RadixTheme.dimensions.paddingLarge), - horizontalAlignment = Alignment.CenterHorizontally - ) { - val placeholder = - rememberDrawablePainter(drawable = ColorDrawable(RadixTheme.colors.gray3.toArgb())) - AsyncImage( - model = rememberImageUrl( - fromUrl = nonFungibleItem.iconUrl, - size = ImageSize.LARGE - ), - placeholder = placeholder, - fallback = placeholder, - error = placeholder, - contentDescription = null, - contentScale = ContentScale.Crop, - modifier = Modifier - .padding(vertical = RadixTheme.dimensions.paddingDefault) - .size(104.dp) - .background(RadixTheme.colors.gray3, RadixTheme.shapes.circle) - .clip(RadixTheme.shapes.circle) - ) + .padding(top = RadixTheme.dimensions.paddingDefault), + color = RadixTheme.colors.gray4 + ) + } + GrayBackgroundWrapper(contentPadding = PaddingValues(horizontal = RadixTheme.dimensions.paddingXLarge)) { + val placeholder = + rememberDrawablePainter(drawable = ColorDrawable(RadixTheme.colors.gray3.toArgb())) + AsyncImage( + model = rememberImageUrl( + fromUrl = nonFungibleResource.iconUrl, + size = ImageSize.LARGE + ), + placeholder = placeholder, + fallback = placeholder, + error = placeholder, + contentDescription = null, + contentScale = ContentScale.Crop, + modifier = Modifier + .padding(vertical = RadixTheme.dimensions.paddingDefault) + .size(104.dp) + .background(RadixTheme.colors.gray3, RadixTheme.shapes.circle) + .clip(RadixTheme.shapes.circle) + ) - if (nonFungibleItem.description.isNotBlank()) { - Divider(Modifier.fillMaxWidth(), color = RadixTheme.colors.gray4) - Spacer(modifier = Modifier.height(RadixTheme.dimensions.paddingLarge)) + if (nonFungibleResource.description.isNotBlank()) { + Divider(Modifier.fillMaxWidth(), color = RadixTheme.colors.gray4) + Spacer(modifier = Modifier.height(RadixTheme.dimensions.paddingLarge)) + Text( + text = nonFungibleResource.description, + style = RadixTheme.typography.body2Regular, + color = RadixTheme.colors.gray1 + ) + Spacer(modifier = Modifier.height(RadixTheme.dimensions.paddingLarge)) + Divider(Modifier.fillMaxWidth(), color = RadixTheme.colors.gray4) + Spacer(modifier = Modifier.height(RadixTheme.dimensions.paddingDefault)) + } + AddressRow( + modifier = Modifier.fillMaxWidth(), + address = nonFungibleResource.resourceAddress + ) + if (nonFungibleResource.name.isNotBlank()) { + Spacer(modifier = Modifier.height(RadixTheme.dimensions.paddingDefault)) + Row( + modifier = Modifier, + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween + ) { + Text( + text = stringResource(id = R.string.assetDetails_name), + style = RadixTheme.typography.body1Regular, + color = RadixTheme.colors.gray2 + ) + Spacer(modifier = Modifier.weight(1f)) Text( - text = nonFungibleItem.description, - style = RadixTheme.typography.body2Regular, + text = nonFungibleResource.name, + style = RadixTheme.typography.body1Regular, color = RadixTheme.colors.gray1 ) - Spacer(modifier = Modifier.height(RadixTheme.dimensions.paddingLarge)) - Divider(Modifier.fillMaxWidth(), color = RadixTheme.colors.gray4) - Spacer(modifier = Modifier.height(RadixTheme.dimensions.paddingDefault)) - } - AddressRow( - modifier = Modifier.fillMaxWidth(), - address = nonFungibleItem.resourceAddress - ) - if (nonFungibleItem.name.isNotBlank()) { - Spacer(modifier = Modifier.height(RadixTheme.dimensions.paddingDefault)) - Row( - modifier = Modifier, - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.SpaceBetween - ) { - Text( - text = stringResource(id = R.string.assetDetails_name), - style = RadixTheme.typography.body1Regular, - color = RadixTheme.colors.gray2 - ) - Spacer(modifier = Modifier.weight(1f)) - Text( - text = nonFungibleItem.name, - style = RadixTheme.typography.body1Regular, - color = RadixTheme.colors.gray1 - ) - } - } - Spacer(modifier = Modifier.height(RadixTheme.dimensions.paddingDefault)) - nonFungibleItem.currentSupplyToDisplay?.let { currentSupply -> - Row( - modifier = Modifier, - verticalAlignment = Alignment.CenterVertically, - horizontalArrangement = Arrangement.SpaceBetween - ) { - Text( - text = stringResource(id = R.string.assetDetails_currentSupply), - style = RadixTheme.typography.body1Regular, - color = RadixTheme.colors.gray2 - ) - Spacer(modifier = Modifier.weight(1f)) - Text( - modifier = Modifier - .padding(start = RadixTheme.dimensions.paddingDefault), - text = currentSupply.toString(), - style = RadixTheme.typography.body1Regular, - color = RadixTheme.colors.gray1, - textAlign = TextAlign.End - ) - } } - if (nonFungibleItem.resourceBehaviours.isNotEmpty()) { - Column { - Text( - modifier = Modifier - .fillMaxWidth() - .padding( - top = RadixTheme.dimensions.paddingDefault, - bottom = RadixTheme.dimensions.paddingSmall - ), - text = stringResource(id = R.string.assetDetails_behavior), - style = RadixTheme.typography.body1Regular, - color = RadixTheme.colors.gray2 - ) - nonFungibleItem.resourceBehaviours.forEach { resourceBehaviour -> - Behaviour( - icon = resourceBehaviour.icon(), - name = resourceBehaviour.name() - ) - } - } - } - - if (nonFungibleItem.tags.isNotEmpty()) { - Spacer(modifier = Modifier.height(RadixTheme.dimensions.paddingDefault)) + } + Spacer(modifier = Modifier.height(RadixTheme.dimensions.paddingDefault)) + nonFungibleResource.currentSupplyToDisplay?.let { currentSupply -> + Row( + modifier = Modifier, + verticalAlignment = Alignment.CenterVertically, + horizontalArrangement = Arrangement.SpaceBetween + ) { Text( - modifier = Modifier.fillMaxWidth(), - text = stringResource(id = R.string.assetDetails_tags), + text = stringResource(id = R.string.assetDetails_currentSupply), style = RadixTheme.typography.body1Regular, color = RadixTheme.colors.gray2 ) - Spacer(modifier = Modifier.height(RadixTheme.dimensions.paddingDefault)) - FlowRow( - modifier = Modifier.fillMaxWidth(), - content = { - nonFungibleItem.tags.forEach { tag -> - Tag( - modifier = Modifier - .padding(RadixTheme.dimensions.paddingXSmall) - .border( - width = 1.dp, - color = RadixTheme.colors.gray4, - shape = RadixTheme.shapes.roundedTag - ) - .padding(RadixTheme.dimensions.paddingSmall), - tag = tag - ) - } - } + Spacer(modifier = Modifier.weight(1f)) + Text( + modifier = Modifier + .padding(start = RadixTheme.dimensions.paddingDefault), + text = currentSupply.toString(), + style = RadixTheme.typography.body1Regular, + color = RadixTheme.colors.gray1, + textAlign = TextAlign.End ) - Spacer(modifier = Modifier.height(RadixTheme.dimensions.paddingDefault)) } + } + if (nonFungibleResource.resourceBehaviours.isNotEmpty()) { + Column { + Text( + modifier = Modifier + .fillMaxWidth() + .padding( + top = RadixTheme.dimensions.paddingDefault, + bottom = RadixTheme.dimensions.paddingSmall + ), + text = stringResource(id = R.string.assetDetails_behavior), + style = RadixTheme.typography.body1Regular, + color = RadixTheme.colors.gray2 + ) + nonFungibleResource.resourceBehaviours.forEach { resourceBehaviour -> + Behaviour( + icon = resourceBehaviour.icon(), + name = resourceBehaviour.name() + ) + } + } + } - Spacer(modifier = Modifier.height(100.dp)) + if (nonFungibleResource.tags.isNotEmpty()) { + Spacer(modifier = Modifier.height(RadixTheme.dimensions.paddingDefault)) + Text( + modifier = Modifier.fillMaxWidth(), + text = stringResource(id = R.string.assetDetails_tags), + style = RadixTheme.typography.body1Regular, + color = RadixTheme.colors.gray2 + ) + Spacer(modifier = Modifier.height(RadixTheme.dimensions.paddingDefault)) + FlowRow( + modifier = Modifier.fillMaxWidth(), + content = { + nonFungibleResource.tags.forEach { tag -> + Tag( + modifier = Modifier + .padding(RadixTheme.dimensions.paddingXSmall) + .border( + width = 1.dp, + color = RadixTheme.colors.gray4, + shape = RadixTheme.shapes.roundedTag + ) + .padding(RadixTheme.dimensions.paddingSmall), + tag = tag + ) + } + } + ) + Spacer(modifier = Modifier.height(RadixTheme.dimensions.paddingDefault)) } + + Spacer(modifier = Modifier.height(100.dp)) } } } diff --git a/app/src/main/java/com/babylon/wallet/android/presentation/settings/dappdetail/DAppDetailsSheetContent.kt b/app/src/main/java/com/babylon/wallet/android/presentation/settings/dappdetail/DAppDetailsSheetContent.kt index e74483ddca..b4f8094a52 100644 --- a/app/src/main/java/com/babylon/wallet/android/presentation/settings/dappdetail/DAppDetailsSheetContent.kt +++ b/app/src/main/java/com/babylon/wallet/android/presentation/settings/dappdetail/DAppDetailsSheetContent.kt @@ -161,11 +161,11 @@ fun DAppDetailsSheetContent( } } } - items(dApp.nonFungibleResources) { nonFungibleToken -> + items(dApp.nonFungibleResources) { nonFungibleResource -> GrayBackgroundWrapper { StandardOneLineCard( - image = nonFungibleToken.imageUrl.toString(), - title = nonFungibleToken.localId.displayable, + image = nonFungibleResource.iconUrl.toString(), + title = nonFungibleResource.name, modifier = Modifier .shadow(elevation = 8.dp, shape = RadixTheme.shapes.roundedRectMedium) .clip(RadixTheme.shapes.roundedRectMedium) diff --git a/app/src/main/java/com/babylon/wallet/android/presentation/settings/dappdetail/DappDetailScreen.kt b/app/src/main/java/com/babylon/wallet/android/presentation/settings/dappdetail/DappDetailScreen.kt index 15e4d383d1..073c683eee 100644 --- a/app/src/main/java/com/babylon/wallet/android/presentation/settings/dappdetail/DappDetailScreen.kt +++ b/app/src/main/java/com/babylon/wallet/android/presentation/settings/dappdetail/DappDetailScreen.kt @@ -62,7 +62,9 @@ import com.babylon.wallet.android.designsystem.theme.RadixTheme import com.babylon.wallet.android.designsystem.theme.RadixTheme.dimensions import com.babylon.wallet.android.designsystem.theme.RadixWalletTheme import com.babylon.wallet.android.domain.SampleDataProvider +import com.babylon.wallet.android.domain.model.DAppResources import com.babylon.wallet.android.domain.model.DAppWithMetadata +import com.babylon.wallet.android.domain.model.DAppWithMetadataAndAssociatedResources import com.babylon.wallet.android.domain.model.RequiredPersonaFields import com.babylon.wallet.android.domain.model.Resource import com.babylon.wallet.android.domain.model.metadata.ClaimedWebsitesMetadataItem @@ -119,11 +121,8 @@ fun DappDetailScreen( .navigationBarsPadding() .fillMaxSize() .background(RadixTheme.colors.defaultBackground), - dappName = state.dappWithMetadata?.name.orEmpty(), personaList = state.personas, dappWithMetadata = state.dappWithMetadata, - associatedFungibleTokens = state.associatedTokens, - associatedNonFungibleTokens = state.associatedNfts, onPersonaClick = viewModel::onPersonaClick, onFungibleTokenClick = viewModel::onFungibleTokenClick, onNftClick = viewModel::onNftClick, @@ -143,14 +142,11 @@ fun DappDetailScreen( private fun DappDetailContent( onBackClick: () -> Unit, modifier: Modifier = Modifier, - dappName: String, personaList: ImmutableList, - dappWithMetadata: DAppWithMetadata?, - associatedFungibleTokens: ImmutableList, - associatedNonFungibleTokens: ImmutableList, + dappWithMetadata: DAppWithMetadataAndAssociatedResources?, onPersonaClick: (Network.Persona) -> Unit, onFungibleTokenClick: (Resource.FungibleResource) -> Unit, - onNftClick: (Resource.NonFungibleResource.Item) -> Unit, + onNftClick: (Resource.NonFungibleResource) -> Unit, selectedSheetState: SelectedSheetState?, selectedPersonaSharedAccounts: ImmutableList, onDisconnectPersona: (Network.Persona) -> Unit, @@ -206,7 +202,7 @@ private fun DappDetailContent( shape = RadixTheme.shapes.roundedRectTopMedium ) .clip(shape = RadixTheme.shapes.roundedRectTopMedium), - dappName = dappName, + dappName = dappWithMetadata?.dAppWithMetadata?.name.orEmpty(), onDisconnectPersona = { persona -> scope.launch { bottomSheetState.hide() @@ -234,12 +230,13 @@ private fun DappDetailContent( is SelectedSheetState.SelectedNonFungibleResource -> { NonFungibleTokenBottomSheetDetails( modifier = Modifier.fillMaxSize(), - item = selectedSheetState.nftItem, + item = null, onCloseClick = { scope.launch { bottomSheetState.hide() } - } + }, + nonFungibleResource = selectedSheetState.nonFungibleResource ) } @@ -250,11 +247,8 @@ private fun DappDetailContent( content = { DappDetails( modifier = Modifier.fillMaxSize(), - dappName = dappName, onBackClick = onBackClick, - dappWithMetadata = dappWithMetadata, - associatedFungibleTokens = associatedFungibleTokens, - associatedNonFungibleTokens = associatedNonFungibleTokens, + dAppWithResources = dappWithMetadata, personaList = personaList, onPersonaClick = { persona -> onPersonaClick(persona) @@ -268,7 +262,7 @@ private fun DappDetailContent( bottomSheetState.show() } }, - onNftClick = { nftItem -> + onNonFungibleClick = { nftItem -> onNftClick(nftItem) scope.launch { bottomSheetState.show() @@ -314,22 +308,19 @@ private fun DappDetailContent( } @Composable -fun DappDetails( +private fun DappDetails( modifier: Modifier, - dappName: String, onBackClick: () -> Unit, - dappWithMetadata: DAppWithMetadata?, + dAppWithResources: DAppWithMetadataAndAssociatedResources?, personaList: ImmutableList, - associatedFungibleTokens: ImmutableList, - associatedNonFungibleTokens: ImmutableList, onPersonaClick: (Network.Persona) -> Unit, onFungibleTokenClick: (Resource.FungibleResource) -> Unit, - onNftClick: (Resource.NonFungibleResource.Item) -> Unit, + onNonFungibleClick: (Resource.NonFungibleResource) -> Unit, onDeleteDapp: () -> Unit ) { Column(modifier = modifier) { RadixCenteredTopAppBar( - title = dappName, + title = dAppWithResources?.dAppWithMetadata?.name.orEmpty(), onBackClick = onBackClick, contentColor = RadixTheme.colors.gray1 ) @@ -340,7 +331,7 @@ fun DappDetails( modifier = Modifier .fillMaxSize() ) { - dappWithMetadata?.iconUrl?.let { + dAppWithResources?.dAppWithMetadata?.iconUrl?.let { val url = it.toString() if (url.isNotEmpty()) { item { @@ -354,7 +345,7 @@ fun DappDetails( } } } - dappWithMetadata?.description?.let { description -> + dAppWithResources?.dAppWithMetadata?.description?.let { description -> item { Text( modifier = Modifier @@ -368,7 +359,7 @@ fun DappDetails( Divider(color = RadixTheme.colors.gray5) } } - dappWithMetadata?.dAppAddress?.let { dappDefinitionAddress -> + dAppWithResources?.dAppWithMetadata?.dAppAddress?.let { dappDefinitionAddress -> item { Spacer(modifier = Modifier.height(dimensions.paddingDefault)) DappDefinitionAddressRow( @@ -380,7 +371,7 @@ fun DappDetails( Spacer(modifier = Modifier.height(dimensions.paddingDefault)) } } - dappWithMetadata?.claimedWebsites?.let { websites -> + dAppWithResources?.dAppWithMetadata?.claimedWebsites?.let { websites -> if (websites.isNotEmpty()) { item { DAppWebsiteAddressRow( @@ -393,7 +384,7 @@ fun DappDetails( } } } - if (associatedFungibleTokens.isNotEmpty()) { + if (dAppWithResources?.fungibleResources?.isNotEmpty() == true) { item { GrayBackgroundWrapper { Text( @@ -408,7 +399,7 @@ fun DappDetails( } } } - itemsIndexed(associatedFungibleTokens) { _, fungibleToken -> + itemsIndexed(dAppWithResources?.fungibleResources.orEmpty()) { _, fungibleToken -> GrayBackgroundWrapper { val placeholder = if (fungibleToken.isXrd) { painterResource(id = com.babylon.wallet.android.designsystem.R.drawable.ic_xrd_token) @@ -417,7 +408,9 @@ fun DappDetails( } StandardOneLineCard( image = fungibleToken.iconUrl.toString(), - title = fungibleToken.displayTitle, + title = fungibleToken.displayTitle.ifEmpty { + stringResource(id = R.string.authorizedDapps_dAppDetails_unknownTokenName) + }, modifier = Modifier .shadow(elevation = 8.dp, shape = RadixTheme.shapes.roundedRectMedium) .clip(RadixTheme.shapes.roundedRectMedium) @@ -439,7 +432,7 @@ fun DappDetails( Spacer(modifier = Modifier.height(dimensions.paddingDefault)) } } - if (associatedNonFungibleTokens.isNotEmpty()) { + if (dAppWithResources?.nonFungibleResources?.isNotEmpty() == true) { item { GrayBackgroundWrapper { Text( @@ -454,16 +447,18 @@ fun DappDetails( } } } - items(associatedNonFungibleTokens) { nftItem -> + items(dAppWithResources?.nonFungibleResources.orEmpty()) { nonFungibleResource -> GrayBackgroundWrapper { StandardOneLineCard( - image = nftItem.imageUrl?.toString().orEmpty(), - title = nftItem.localId.displayable, + image = nonFungibleResource.iconUrl?.toString().orEmpty(), + title = nonFungibleResource.name.ifEmpty { + stringResource(id = R.string.authorizedDapps_dAppDetails_unknownTokenName) + }, modifier = Modifier .shadow(elevation = 8.dp, shape = RadixTheme.shapes.roundedRectMedium) .clip(RadixTheme.shapes.roundedRectMedium) .throttleClickable { - onNftClick(nftItem) + onNonFungibleClick(nonFungibleResource) } .fillMaxWidth() .background( @@ -824,21 +819,21 @@ fun DappDetailContentPreview() { RadixWalletTheme { DappDetailContent( onBackClick = {}, - dappName = "Dapp", personaList = persistentListOf(SampleDataProvider().samplePersona()), - dappWithMetadata = DAppWithMetadata( - dAppAddress = "account_tdx_abc", - nameItem = NameMetadataItem("Dapp"), - descriptionItem = DescriptionMetadataItem("Description"), - claimedWebsitesItem = ClaimedWebsitesMetadataItem( - websites = listOf( - "https://hammunet-dashboard.rdx-works-main.extratools.works", - "https://ansharnet-dashboard.rdx-works-main.extratools.works" + dappWithMetadata = DAppWithMetadataAndAssociatedResources( + dAppWithMetadata = DAppWithMetadata( + dAppAddress = "account_tdx_abc", + nameItem = NameMetadataItem("Dapp"), + descriptionItem = DescriptionMetadataItem("Description"), + claimedWebsitesItem = ClaimedWebsitesMetadataItem( + websites = listOf( + "https://hammunet-dashboard.rdx-works-main.extratools.works", + "https://ansharnet-dashboard.rdx-works-main.extratools.works" + ) ) - ) + ), + resources = DAppResources(emptyList(), emptyList()), ), - associatedFungibleTokens = persistentListOf(), - associatedNonFungibleTokens = persistentListOf(), onPersonaClick = {}, onFungibleTokenClick = {}, onNftClick = {}, diff --git a/app/src/main/java/com/babylon/wallet/android/presentation/settings/dappdetail/DappDetailViewModel.kt b/app/src/main/java/com/babylon/wallet/android/presentation/settings/dappdetail/DappDetailViewModel.kt index 321b0e3c73..e42cba9dbd 100644 --- a/app/src/main/java/com/babylon/wallet/android/presentation/settings/dappdetail/DappDetailViewModel.kt +++ b/app/src/main/java/com/babylon/wallet/android/presentation/settings/dappdetail/DappDetailViewModel.kt @@ -5,7 +5,7 @@ import androidx.lifecycle.viewModelScope import com.babylon.wallet.android.data.dapp.IncomingRequestRepository import com.babylon.wallet.android.domain.common.onError import com.babylon.wallet.android.domain.common.onValue -import com.babylon.wallet.android.domain.model.DAppWithMetadata +import com.babylon.wallet.android.domain.model.DAppWithMetadataAndAssociatedResources import com.babylon.wallet.android.domain.model.MessageFromDataChannel import com.babylon.wallet.android.domain.model.RequiredPersonaField import com.babylon.wallet.android.domain.model.RequiredPersonaFields @@ -57,9 +57,7 @@ class DappDetailViewModel @Inject constructor( metadataResult.onValue { dAppWithAssociatedResources -> _state.update { state -> state.copy( - dappWithMetadata = dAppWithAssociatedResources.dAppWithMetadata, - associatedTokens = dAppWithAssociatedResources.fungibleResources.toPersistentList(), - associatedNfts = dAppWithAssociatedResources.nonFungibleResources.toPersistentList(), + dappWithMetadata = dAppWithAssociatedResources, loading = false ) } @@ -114,12 +112,12 @@ class DappDetailViewModel @Inject constructor( } } - fun onNftClick(nftItem: Resource.NonFungibleResource.Item) { + fun onNftClick(nftItem: Resource.NonFungibleResource) { viewModelScope.launch { _state.update { it.copy( selectedSheetState = SelectedSheetState.SelectedNonFungibleResource( - nftItem = nftItem + nonFungibleResource = nftItem ) ) } @@ -241,9 +239,7 @@ sealed interface DappDetailEvent : OneOffEvent { data class DappDetailUiState( val loading: Boolean = true, val dapp: Network.AuthorizedDapp? = null, - val dappWithMetadata: DAppWithMetadata? = null, - val associatedTokens: ImmutableList = persistentListOf(), - val associatedNfts: ImmutableList = persistentListOf(), + val dappWithMetadata: DAppWithMetadataAndAssociatedResources? = null, val personas: ImmutableList = persistentListOf(), val sharedPersonaAccounts: ImmutableList = persistentListOf(), val selectedSheetState: SelectedSheetState? = null @@ -252,7 +248,7 @@ data class DappDetailUiState( sealed interface SelectedSheetState { data class SelectedFungibleResource(val fungible: Resource.FungibleResource) : SelectedSheetState data class SelectedNonFungibleResource( - val nftItem: Resource.NonFungibleResource.Item + val nonFungibleResource: Resource.NonFungibleResource ) : SelectedSheetState data class SelectedPersona( diff --git a/app/src/main/java/com/babylon/wallet/android/presentation/settings/personadetail/PersonaDetailScreen.kt b/app/src/main/java/com/babylon/wallet/android/presentation/settings/personadetail/PersonaDetailScreen.kt index a175d65c69..33e9fe32fc 100644 --- a/app/src/main/java/com/babylon/wallet/android/presentation/settings/personadetail/PersonaDetailScreen.kt +++ b/app/src/main/java/com/babylon/wallet/android/presentation/settings/personadetail/PersonaDetailScreen.kt @@ -75,9 +75,7 @@ fun PersonaDetailScreen( persona = state.persona, onEditPersona = onEditPersona, authorizedDapps = state.authorizedDapps, - selectedDAppWithMetadata = state.selectedDAppWithMetadata, - selectedDAppAssociatedFungibleTokens = state.selectedDAppAssociatedFungibleTokens, - selectedDAppAssociatedNonFungibleTokens = state.selectedDAppAssociatedNonFungibleTokens, + selectedDApp = state.selectedDApp, onDAppClick = viewModel::onDAppClick, hasAuthKey = state.hasAuthKey, loading = state.loading, @@ -93,9 +91,7 @@ private fun PersonaDetailContent( persona: Network.Persona?, onEditPersona: (String) -> Unit, authorizedDapps: ImmutableList, - selectedDAppWithMetadata: DAppWithMetadata?, - selectedDAppAssociatedFungibleTokens: ImmutableList, - selectedDAppAssociatedNonFungibleTokens: ImmutableList, + selectedDApp: DAppWithMetadataAndAssociatedResources?, onDAppClick: (DAppWithMetadataAndAssociatedResources) -> Unit, hasAuthKey: Boolean, onCreateAndUploadAuthKey: () -> Unit, @@ -123,20 +119,14 @@ private fun PersonaDetailContent( .fillMaxSize(), sheetState = bottomSheetState, sheetContent = { - selectedDAppWithMetadata?.let { + selectedDApp?.let { DAppDetailsSheetContent( onBackClick = { scope.launch { bottomSheetState.hide() } }, - dApp = DAppWithMetadataAndAssociatedResources( - dAppWithMetadata = it, - resources = DAppResources( - fungibleResources = selectedDAppAssociatedFungibleTokens, - nonFungibleResources = selectedDAppAssociatedNonFungibleTokens - ) - ) + dApp = it ) } } @@ -300,9 +290,7 @@ fun DappDetailContentPreview() { persona = SampleDataProvider().samplePersona(), onEditPersona = {}, authorizedDapps = persistentListOf(), - selectedDAppWithMetadata = null, - selectedDAppAssociatedFungibleTokens = persistentListOf(), - selectedDAppAssociatedNonFungibleTokens = persistentListOf(), + selectedDApp = null, onDAppClick = {}, hasAuthKey = false, onCreateAndUploadAuthKey = {}, diff --git a/app/src/main/java/com/babylon/wallet/android/presentation/settings/personadetail/PersonaDetailViewModel.kt b/app/src/main/java/com/babylon/wallet/android/presentation/settings/personadetail/PersonaDetailViewModel.kt index 0a5a65463b..28fc8a7dbe 100644 --- a/app/src/main/java/com/babylon/wallet/android/presentation/settings/personadetail/PersonaDetailViewModel.kt +++ b/app/src/main/java/com/babylon/wallet/android/presentation/settings/personadetail/PersonaDetailViewModel.kt @@ -6,9 +6,7 @@ import com.babylon.wallet.android.data.dapp.IncomingRequestRepository import com.babylon.wallet.android.data.manifest.prepareInternalTransactionRequest import com.babylon.wallet.android.data.transaction.ROLAClient import com.babylon.wallet.android.domain.common.value -import com.babylon.wallet.android.domain.model.DAppWithMetadata import com.babylon.wallet.android.domain.model.DAppWithMetadataAndAssociatedResources -import com.babylon.wallet.android.domain.model.Resource import com.babylon.wallet.android.domain.usecases.GetDAppWithMetadataAndAssociatedResourcesUseCase import com.babylon.wallet.android.presentation.common.StateViewModel import com.babylon.wallet.android.presentation.common.UiState @@ -18,7 +16,6 @@ import dagger.hilt.android.lifecycle.HiltViewModel import kotlinx.collections.immutable.ImmutableList import kotlinx.collections.immutable.persistentListOf import kotlinx.collections.immutable.toImmutableList -import kotlinx.collections.immutable.toPersistentList import kotlinx.coroutines.flow.combine import kotlinx.coroutines.flow.filter import kotlinx.coroutines.flow.filterIsInstance @@ -100,11 +97,7 @@ class PersonaDetailViewModel @Inject constructor( fun onDAppClick(dApp: DAppWithMetadataAndAssociatedResources) { _state.update { state -> - state.copy( - selectedDAppWithMetadata = dApp.dAppWithMetadata, - selectedDAppAssociatedFungibleTokens = dApp.fungibleResources.toPersistentList(), - selectedDAppAssociatedNonFungibleTokens = dApp.nonFungibleResources.toPersistentList() - ) + state.copy(selectedDApp = dApp) } } @@ -142,7 +135,5 @@ data class PersonaDetailUiState( val authorizedDapps: ImmutableList = persistentListOf(), val persona: Network.Persona? = null, val hasAuthKey: Boolean = false, - val selectedDAppWithMetadata: DAppWithMetadata? = null, - val selectedDAppAssociatedFungibleTokens: ImmutableList = persistentListOf(), - val selectedDAppAssociatedNonFungibleTokens: ImmutableList = persistentListOf(), + val selectedDApp: DAppWithMetadataAndAssociatedResources? = null ) : UiState diff --git a/app/src/main/java/com/babylon/wallet/android/presentation/ui/composables/GrayBackgroundWrapper.kt b/app/src/main/java/com/babylon/wallet/android/presentation/ui/composables/GrayBackgroundWrapper.kt index e2d6abd129..a774868da9 100644 --- a/app/src/main/java/com/babylon/wallet/android/presentation/ui/composables/GrayBackgroundWrapper.kt +++ b/app/src/main/java/com/babylon/wallet/android/presentation/ui/composables/GrayBackgroundWrapper.kt @@ -3,6 +3,7 @@ package com.babylon.wallet.android.presentation.ui.composables import androidx.compose.foundation.background import androidx.compose.foundation.layout.Column import androidx.compose.foundation.layout.ColumnScope +import androidx.compose.foundation.layout.PaddingValues import androidx.compose.foundation.layout.padding import androidx.compose.runtime.Composable import androidx.compose.ui.Alignment @@ -11,11 +12,15 @@ import com.babylon.wallet.android.designsystem.theme.RadixTheme import com.babylon.wallet.android.designsystem.theme.RadixTheme.dimensions @Composable -fun GrayBackgroundWrapper(modifier: Modifier = Modifier, content: @Composable ColumnScope.() -> Unit) { +fun GrayBackgroundWrapper( + modifier: Modifier = Modifier, + contentPadding: PaddingValues = PaddingValues(horizontal = dimensions.paddingDefault), + content: @Composable ColumnScope.() -> Unit +) { Column( modifier .background(RadixTheme.colors.gray5) - .padding(horizontal = dimensions.paddingDefault), + .padding(contentPadding), horizontalAlignment = Alignment.CenterHorizontally ) { content() From 7fa1d78d626bfa76953cffdd00ab8aed9f2dc9c9 Mon Sep 17 00:00:00 2001 From: micbakos-rdx Date: Wed, 6 Sep 2023 16:32:15 +0300 Subject: [PATCH 2/2] Fix detekt issues --- .../presentation/settings/personadetail/PersonaDetailScreen.kt | 3 --- 1 file changed, 3 deletions(-) diff --git a/app/src/main/java/com/babylon/wallet/android/presentation/settings/personadetail/PersonaDetailScreen.kt b/app/src/main/java/com/babylon/wallet/android/presentation/settings/personadetail/PersonaDetailScreen.kt index 33e9fe32fc..e56101f4ce 100644 --- a/app/src/main/java/com/babylon/wallet/android/presentation/settings/personadetail/PersonaDetailScreen.kt +++ b/app/src/main/java/com/babylon/wallet/android/presentation/settings/personadetail/PersonaDetailScreen.kt @@ -38,10 +38,7 @@ import com.babylon.wallet.android.designsystem.theme.RadixTheme import com.babylon.wallet.android.designsystem.theme.RadixTheme.dimensions import com.babylon.wallet.android.designsystem.theme.RadixWalletTheme import com.babylon.wallet.android.domain.SampleDataProvider -import com.babylon.wallet.android.domain.model.DAppResources -import com.babylon.wallet.android.domain.model.DAppWithMetadata import com.babylon.wallet.android.domain.model.DAppWithMetadataAndAssociatedResources -import com.babylon.wallet.android.domain.model.Resource import com.babylon.wallet.android.presentation.common.FullscreenCircularProgressContent import com.babylon.wallet.android.presentation.settings.dappdetail.DAppDetailsSheetContent import com.babylon.wallet.android.presentation.ui.composables.DefaultModalSheetLayout