Updated on 2026-08-14
This commit is contained in:
parent
546bcc908f
commit
6ac5724e56
9 changed files with 63 additions and 37 deletions
|
|
@ -114,12 +114,12 @@ internal object TokenMarketInfoConverter : Converter<TokenMarketInfoResponse, To
|
|||
private fun TokenMarketInfoResponse.SecurityData.convert(): TokenMarketInfo.SecurityData {
|
||||
return TokenMarketInfo.SecurityData(
|
||||
totalSecurityScore = totalSecurityScore,
|
||||
providerData = providerData.map { it.convert() },
|
||||
securityScoreProviderData = providerData.map { it.convert() },
|
||||
)
|
||||
}
|
||||
|
||||
private fun TokenMarketInfoResponse.ProviderData.convert(): TokenMarketInfo.ProviderData {
|
||||
return TokenMarketInfo.ProviderData(
|
||||
private fun TokenMarketInfoResponse.ProviderData.convert(): TokenMarketInfo.SecurityScoreProvider {
|
||||
return TokenMarketInfo.SecurityScoreProvider(
|
||||
providerId = providerId,
|
||||
providerName = providerName,
|
||||
urlData = link?.convertToUrlData(),
|
||||
|
|
@ -129,8 +129,8 @@ internal object TokenMarketInfoConverter : Converter<TokenMarketInfoResponse, To
|
|||
)
|
||||
}
|
||||
|
||||
private fun String.convertToUrlData(): TokenMarketInfo.ProviderUrlData {
|
||||
return TokenMarketInfo.ProviderUrlData(
|
||||
private fun String.convertToUrlData(): TokenMarketInfo.SecurityScoreProvider.UrlData {
|
||||
return TokenMarketInfo.SecurityScoreProvider.UrlData(
|
||||
fullUrl = this,
|
||||
rootHost = this.extractMainDomainOrNull(),
|
||||
)
|
||||
|
|
|
|||
|
|
@ -55,22 +55,22 @@ data class TokenMarketInfo(
|
|||
|
||||
data class SecurityData(
|
||||
val totalSecurityScore: Float,
|
||||
val providerData: List<ProviderData>,
|
||||
val securityScoreProviderData: List<SecurityScoreProvider>,
|
||||
)
|
||||
|
||||
data class ProviderData(
|
||||
data class SecurityScoreProvider(
|
||||
val providerId: String,
|
||||
val providerName: String,
|
||||
val urlData: ProviderUrlData?,
|
||||
val urlData: UrlData?,
|
||||
val iconUrl: String,
|
||||
val securityScore: Float,
|
||||
val lastAuditDate: DateTime?,
|
||||
)
|
||||
|
||||
data class ProviderUrlData(
|
||||
) {
|
||||
data class UrlData(
|
||||
val fullUrl: String,
|
||||
val rootHost: String?,
|
||||
)
|
||||
}
|
||||
|
||||
data class Links(
|
||||
val officialLinks: List<Link>?,
|
||||
|
|
|
|||
|
|
@ -51,6 +51,19 @@ internal class MarketDetailsAnalyticsEvent(
|
|||
"Token" to token.symbol,
|
||||
),
|
||||
)
|
||||
|
||||
fun securityScoreOpened() = MarketDetailsAnalyticsEvent(
|
||||
event = "Security Score Info",
|
||||
params = mapOf("Token" to token.symbol),
|
||||
)
|
||||
|
||||
fun securityScoreProviderClicked(provider: String) = MarketDetailsAnalyticsEvent(
|
||||
event = "Security Score Provider Clicked",
|
||||
params = mapOf(
|
||||
"Token" to token.symbol,
|
||||
"Provider" to provider,
|
||||
),
|
||||
)
|
||||
}
|
||||
|
||||
enum class IntervalType(val source: String) {
|
||||
|
|
|
|||
|
|
@ -88,8 +88,19 @@ internal class MarketsTokenDetailsModel @Inject constructor(
|
|||
// === Analytics ===
|
||||
analyticsEventHandler.send(analyticsEventBuilder.linkClicked(linkTitle = link.title))
|
||||
},
|
||||
onSecurityScoreInfoClick = {
|
||||
showBottomSheet(it)
|
||||
|
||||
// === Analytics ===
|
||||
analyticsEventHandler.send(analyticsEventBuilder.securityScoreOpened())
|
||||
},
|
||||
onSecurityScoreProviderLinkClick = {
|
||||
urlOpener.openUrl(it)
|
||||
it.urlData?.fullUrl?.let { url ->
|
||||
urlOpener.openUrl(url)
|
||||
}
|
||||
|
||||
// === Analytics ===
|
||||
analyticsEventHandler.send(analyticsEventBuilder.securityScoreProviderClicked(it.name))
|
||||
},
|
||||
// === Analytics ===
|
||||
onPricePerformanceIntervalChanged = {
|
||||
|
|
|
|||
|
|
@ -13,12 +13,12 @@ import com.tangem.utils.converter.Converter
|
|||
|
||||
@Stable
|
||||
internal class SecurityScoreConverter(
|
||||
private val onInfoClick: (SecurityScoreBottomSheetContent) -> Unit,
|
||||
private val onSecurityScoreProviderLinkClick: (String) -> Unit,
|
||||
private val onSecurityScoreInfoClick: (SecurityScoreBottomSheetContent) -> Unit,
|
||||
private val onSecurityScoreProviderLinkClick: (SecurityScoreBottomSheetContent.SecurityScoreProviderUM) -> Unit,
|
||||
) : Converter<TokenMarketInfo.SecurityData, SecurityScoreUM> {
|
||||
|
||||
override fun convert(value: TokenMarketInfo.SecurityData): SecurityScoreUM {
|
||||
val ratingsCount = value.providerData.size
|
||||
val ratingsCount = value.securityScoreProviderData.size
|
||||
return SecurityScoreUM(
|
||||
score = value.totalSecurityScore,
|
||||
description = pluralReference(
|
||||
|
|
@ -27,11 +27,11 @@ internal class SecurityScoreConverter(
|
|||
formatArgs = wrappedList(ratingsCount),
|
||||
),
|
||||
onInfoClick = {
|
||||
onInfoClick(
|
||||
onSecurityScoreInfoClick(
|
||||
SecurityScoreBottomSheetContent(
|
||||
title = resourceReference(R.string.markets_token_details_security_score),
|
||||
description = resourceReference(R.string.markets_token_details_security_score_description),
|
||||
providers = value.providerData.map {
|
||||
providers = value.securityScoreProviderData.map {
|
||||
SecurityScoreBottomSheetContent.SecurityScoreProviderUM(
|
||||
name = it.providerName,
|
||||
lastAuditDate = it.lastAuditDate?.let { date ->
|
||||
|
|
@ -40,7 +40,7 @@ internal class SecurityScoreConverter(
|
|||
score = it.securityScore,
|
||||
urlData = it.urlData?.let {
|
||||
urlData ->
|
||||
SecurityScoreBottomSheetContent.SecurityScoreProviderUrlData(
|
||||
SecurityScoreBottomSheetContent.SecurityScoreProviderUM.UrlData(
|
||||
fullUrl = urlData.fullUrl,
|
||||
rootHost = urlData.rootHost,
|
||||
)
|
||||
|
|
|
|||
|
|
@ -8,6 +8,7 @@ import com.tangem.domain.markets.TokenMarketInfo
|
|||
import com.tangem.features.markets.details.impl.ui.state.LinksUM
|
||||
import com.tangem.features.markets.details.impl.ui.state.ListedOnUM
|
||||
import com.tangem.features.markets.details.impl.ui.state.MarketsTokenDetailsUM
|
||||
import com.tangem.features.markets.details.impl.ui.state.SecurityScoreBottomSheetContent
|
||||
import com.tangem.utils.Provider
|
||||
import com.tangem.utils.converter.Converter
|
||||
|
||||
|
|
@ -17,8 +18,9 @@ internal class TokenMarketInfoConverter(
|
|||
private val appCurrency: Provider<AppCurrency>,
|
||||
private val onInfoClick: (TangemBottomSheetConfigContent) -> Unit,
|
||||
private val onListedOnClick: (Int) -> Unit,
|
||||
onSecurityScoreInfoClick: (SecurityScoreBottomSheetContent) -> Unit,
|
||||
onLinkClick: (LinksUM.Link) -> Unit,
|
||||
onSecurityScoreProviderLinkClick: (String) -> Unit,
|
||||
onSecurityScoreProviderLinkClick: (SecurityScoreBottomSheetContent.SecurityScoreProviderUM) -> Unit,
|
||||
onPricePerformanceIntervalChanged: (PriceChangeInterval) -> Unit,
|
||||
onInsightsIntervalChanged: (PriceChangeInterval) -> Unit,
|
||||
) : Converter<TokenMarketInfo, MarketsTokenDetailsUM.InformationBlocks> {
|
||||
|
|
@ -30,7 +32,7 @@ internal class TokenMarketInfoConverter(
|
|||
)
|
||||
|
||||
private val securityScoreConverter = SecurityScoreConverter(
|
||||
onInfoClick = onInfoClick,
|
||||
onSecurityScoreInfoClick = onSecurityScoreInfoClick,
|
||||
onSecurityScoreProviderLinkClick = onSecurityScoreProviderLinkClick,
|
||||
)
|
||||
private val pricePerformanceConverter = PricePerformanceConverter(
|
||||
|
|
|
|||
|
|
@ -86,7 +86,7 @@ internal fun SecurityScoreBottomSheet(config: TangemBottomSheetConfig) {
|
|||
@Composable
|
||||
private fun SecurityScoreProviderRow(
|
||||
providerUM: SecurityScoreBottomSheetContent.SecurityScoreProviderUM,
|
||||
onLinkClick: (String) -> Unit,
|
||||
onLinkClick: (SecurityScoreBottomSheetContent.SecurityScoreProviderUM) -> Unit,
|
||||
) {
|
||||
Row(
|
||||
modifier = Modifier
|
||||
|
|
@ -137,7 +137,7 @@ private fun SecurityScoreProviderRow(
|
|||
enabled = providerUM.urlData != null,
|
||||
indication = ripple(bounded = false),
|
||||
interactionSource = remember { MutableInteractionSource() },
|
||||
onClick = { providerUM.urlData?.let { onLinkClick(it.fullUrl) } },
|
||||
onClick = { onLinkClick(providerUM) },
|
||||
),
|
||||
) {
|
||||
ScoreStarsBlock(
|
||||
|
|
|
|||
|
|
@ -17,7 +17,7 @@ internal object SecurityScorePreviewData {
|
|||
name = "Moralis",
|
||||
lastAuditDate = "21.10.2024",
|
||||
score = 4.9F,
|
||||
urlData = SecurityScoreBottomSheetContent.SecurityScoreProviderUrlData(
|
||||
urlData = SecurityScoreBottomSheetContent.SecurityScoreProviderUM.UrlData(
|
||||
fullUrl = "https://moralis.com/",
|
||||
rootHost = "moralis.com",
|
||||
),
|
||||
|
|
@ -27,7 +27,7 @@ internal object SecurityScorePreviewData {
|
|||
name = "Certik",
|
||||
lastAuditDate = "10.07.2024",
|
||||
score = 4.6F,
|
||||
urlData = SecurityScoreBottomSheetContent.SecurityScoreProviderUrlData(
|
||||
urlData = SecurityScoreBottomSheetContent.SecurityScoreProviderUM.UrlData(
|
||||
fullUrl = "https://certik.com/",
|
||||
rootHost = "certik.com",
|
||||
),
|
||||
|
|
@ -37,7 +37,7 @@ internal object SecurityScorePreviewData {
|
|||
name = "Cyberscope",
|
||||
lastAuditDate = "25.06.2023",
|
||||
score = 4.5F,
|
||||
urlData = SecurityScoreBottomSheetContent.SecurityScoreProviderUrlData(
|
||||
urlData = SecurityScoreBottomSheetContent.SecurityScoreProviderUM.UrlData(
|
||||
fullUrl = "https://cyberscope.com/",
|
||||
rootHost = "cyberscope.com",
|
||||
),
|
||||
|
|
@ -47,7 +47,7 @@ internal object SecurityScorePreviewData {
|
|||
name = "TokenInsight",
|
||||
lastAuditDate = "17.01.2022",
|
||||
score = 4.0F,
|
||||
urlData = SecurityScoreBottomSheetContent.SecurityScoreProviderUrlData(
|
||||
urlData = SecurityScoreBottomSheetContent.SecurityScoreProviderUM.UrlData(
|
||||
fullUrl = "https://tokeninsight.com/",
|
||||
rootHost = "tokeninsight.com",
|
||||
),
|
||||
|
|
|
|||
|
|
@ -7,19 +7,19 @@ internal data class SecurityScoreBottomSheetContent(
|
|||
val title: TextReference,
|
||||
val description: TextReference,
|
||||
val providers: List<SecurityScoreProviderUM>,
|
||||
val onProviderLinkClick: (String) -> Unit,
|
||||
val onProviderLinkClick: (SecurityScoreProviderUM) -> Unit,
|
||||
) : TangemBottomSheetConfigContent {
|
||||
|
||||
data class SecurityScoreProviderUM(
|
||||
val name: String,
|
||||
val lastAuditDate: String?,
|
||||
val score: Float,
|
||||
val urlData: SecurityScoreProviderUrlData?,
|
||||
val urlData: UrlData?,
|
||||
val iconUrl: String?,
|
||||
)
|
||||
|
||||
data class SecurityScoreProviderUrlData(
|
||||
) {
|
||||
data class UrlData(
|
||||
val fullUrl: String,
|
||||
val rootHost: String?,
|
||||
)
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue