diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/onramp/OnrampApi.kt b/core/datasource/src/main/java/com/tangem/datasource/api/onramp/OnrampApi.kt index e50542a463..2a8034b8b1 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/api/onramp/OnrampApi.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/api/onramp/OnrampApi.kt @@ -35,6 +35,7 @@ interface OnrampApi { @GET("onramp-quote") suspend fun getQuote( @Query("fromCurrencyCode") fromCurrencyCode: String, + @Query("fromPrecision") fromPrecision: Int, @Query("toContractAddress") toContractAddress: String, @Query("toNetwork") toNetwork: String, @Query("paymentMethod") paymentMethod: String, @@ -47,6 +48,7 @@ interface OnrampApi { @GET("onramp-data") suspend fun getData( @Query("fromCurrencyCode") fromCurrencyCode: String, + @Query("fromPrecision") fromPrecision: Int, @Query("toContractAddress") toContractAddress: String, @Query("toNetwork") toNetwork: String, @Query("paymentMethod") paymentMethod: String, diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/onramp/models/response/OnrampDataResponse.kt b/core/datasource/src/main/java/com/tangem/datasource/api/onramp/models/response/OnrampDataResponse.kt index 3146bb435d..e558fdd934 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/api/onramp/models/response/OnrampDataResponse.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/api/onramp/models/response/OnrampDataResponse.kt @@ -25,6 +25,9 @@ data class OnrampDataJson( @Json(name = "widgetUrl") val widgetUrl: String, + @Json(name = "requestId") + val requestId: String, + @Json(name = "externalTxId") val externalTxId: String, diff --git a/data/onramp/build.gradle.kts b/data/onramp/build.gradle.kts index 51477ea895..15eeae4113 100644 --- a/data/onramp/build.gradle.kts +++ b/data/onramp/build.gradle.kts @@ -21,6 +21,7 @@ dependencies { /** Domain modules */ implementation(projects.domain.onramp) implementation(projects.domain.legacy) + implementation(projects.domain.appTheme.models) // region DI diff --git a/data/onramp/src/main/java/com/tangem/data/onramp/DefaultOnrampRepository.kt b/data/onramp/src/main/java/com/tangem/data/onramp/DefaultOnrampRepository.kt index b8034ca4a2..f4f5c141f9 100644 --- a/data/onramp/src/main/java/com/tangem/data/onramp/DefaultOnrampRepository.kt +++ b/data/onramp/src/main/java/com/tangem/data/onramp/DefaultOnrampRepository.kt @@ -30,8 +30,10 @@ import com.tangem.datasource.local.onramp.quotes.OnrampQuotesStore import com.tangem.datasource.local.preferences.AppPreferencesStore import com.tangem.datasource.local.preferences.PreferencesKeys import com.tangem.datasource.local.preferences.utils.getObject +import com.tangem.datasource.local.preferences.utils.getObjectSyncOrDefault import com.tangem.datasource.local.preferences.utils.getObjectSyncOrNull import com.tangem.datasource.local.preferences.utils.storeObject +import com.tangem.domain.apptheme.model.AppThemeMode import com.tangem.domain.onramp.model.* import com.tangem.domain.onramp.model.cache.OnrampTransaction import com.tangem.domain.onramp.repositories.OnrampRepository @@ -200,6 +202,7 @@ internal class DefaultOnrampRepository( call = { val response = onrampApi.getQuote( fromCurrencyCode = currency.code, + fromPrecision = currency.precision, toContractAddress = cryptoCurrency.getContractAddress(), toNetwork = cryptoCurrency.network.backendId, paymentMethod = paymentMethod.id, @@ -267,10 +270,12 @@ internal class DefaultOnrampRepository( val fromAmountString = quote.fromAmount.value.movePointRight(quote.fromAmount.decimals).toString() val currency = requireNotNull(getDefaultCurrencySync()) { "Default currency must not be null" } val country = requireNotNull(getDefaultCountrySync()) { "Default country must not be null" } + val requestId = UUID.randomUUID().toString() val data = safeApiCall( call = { onrampApi.getData( fromCurrencyCode = currency.code, + fromPrecision = currency.precision, toContractAddress = cryptoCurrency.getContractAddress(), toNetwork = cryptoCurrency.network.backendId, paymentMethod = quote.paymentMethod.id, @@ -281,8 +286,8 @@ internal class DefaultOnrampRepository( toAddress = address, redirectUrl = "tangem://redirect?action=dismissBrowser", language = null, - theme = null, - requestId = UUID.randomUUID().toString(), + theme = getTheme(), + requestId = requestId, ).bind() }, onError = { e -> @@ -294,6 +299,8 @@ internal class DefaultOnrampRepository( val dataJson = requireNotNull(onrampDataAdapter.fromJson(data.dataJson)) { "Can not parse dataJson. ${data.dataJson}" } + if (requestId != dataJson.requestId) throw OnrampRedirectError.WrongRequestId + createOnrampTransaction( txId = data.txId, onrampDataJson = dataJson, @@ -400,6 +407,19 @@ internal class DefaultOnrampRepository( ) } + private suspend fun getTheme(): String { + val appTheme = appPreferencesStore.getObjectSyncOrDefault( + key = PreferencesKeys.APP_THEME_MODE_KEY, + default = AppThemeMode.DEFAULT, + ) + return when (appTheme) { + AppThemeMode.FORCE_DARK -> "dark" + AppThemeMode.FORCE_LIGHT, + AppThemeMode.FOLLOW_SYSTEM, + -> "light" + } + } + private fun List.removeApplePay(): List = filterNot { it.id == "apple-pay" } private companion object { diff --git a/domain/onramp/models/src/main/kotlin/com/tangem/domain/onramp/model/OnrampRedirectError.kt b/domain/onramp/models/src/main/kotlin/com/tangem/domain/onramp/model/OnrampRedirectError.kt index c8733be36a..119530ef72 100644 --- a/domain/onramp/models/src/main/kotlin/com/tangem/domain/onramp/model/OnrampRedirectError.kt +++ b/domain/onramp/models/src/main/kotlin/com/tangem/domain/onramp/model/OnrampRedirectError.kt @@ -5,4 +5,6 @@ sealed class OnrampRedirectError : Throwable() { data class DataError(override val cause: Throwable?) : OnrampRedirectError() data object VerificationFailed : OnrampRedirectError() + + data object WrongRequestId : OnrampRedirectError() } \ No newline at end of file diff --git a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/redirect/ui/OnrampRedirectContent.kt b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/redirect/ui/OnrampRedirectContent.kt index 384f8f83e7..dc25078184 100644 --- a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/redirect/ui/OnrampRedirectContent.kt +++ b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/redirect/ui/OnrampRedirectContent.kt @@ -1,9 +1,9 @@ package com.tangem.features.onramp.redirect.ui -import androidx.compose.foundation.Image import androidx.compose.foundation.background import androidx.compose.foundation.layout.* import androidx.compose.foundation.shape.CircleShape +import androidx.compose.material3.Icon import androidx.compose.material3.Scaffold import androidx.compose.material3.Text import androidx.compose.runtime.Composable @@ -79,13 +79,14 @@ private fun LogoBlock(providerImageUrl: String, modifier: Modifier = Modifier) { horizontalArrangement = Arrangement.spacedBy(TangemTheme.dimens.spacing12), verticalAlignment = Alignment.CenterVertically, ) { - Image( + Icon( modifier = Modifier .size(TangemTheme.dimens.size64) .clip(TangemTheme.shapes.roundedCorners8) .background(TangemTheme.colors.background.primary) .padding(vertical = TangemTheme.dimens.spacing8, horizontal = TangemTheme.dimens.spacing12), painter = painterResource(id = R.drawable.ic_tangem_24), + tint = TangemTheme.colors.icon.primary1, contentDescription = null, ) LoadingDots()