Updated on 2026-08-14

This commit is contained in:
Tangem 2025-12-26 15:29:35 +05:00
parent 00032d7d11
commit 258e950178
18 changed files with 125 additions and 99 deletions

View file

@ -62,6 +62,12 @@ interface TangemPayApi {
@Body body: CardDetailsRequest,
): ApiResponse<CardDetailsResponse>
@GET("v1/customer/card/pin")
suspend fun getPin(
@Header("Authorization") authHeader: String,
@Header("X-Session-Id") sessionId: String,
): ApiResponse<GetPinResponse>
@PUT("v1/customer/card/pin")
suspend fun setPin(
@Header("Authorization") authHeader: String,

View file

@ -0,0 +1,14 @@
package com.tangem.datasource.api.pay.models.request
import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
@JsonClass(generateAdapter = true)
data class GetPinResponse(@Json(name = "result") val result: Result?) {
@JsonClass(generateAdapter = true)
data class Result(
@Json(name = "secret") val secret: String,
@Json(name = "iv") val iv: String,
)
}

View file

@ -17,7 +17,6 @@ data class CardDetailsResponse(
@Json(name = "card_number_end") val cardNumberEnd: String,
@Json(name = "pan") val pan: Secret,
@Json(name = "cvv") val cvv: Secret,
@Json(name = "pin") val pin: Secret?,
)
@JsonClass(generateAdapter = true)

View file

@ -449,7 +449,7 @@
<string name="disclaimer_error_loading">Überprüfe deine Internetverbindung oder wechseln zu einem anderen Netzwerk</string>
<string name="disclaimer_title">Nutzungsbedingungen</string>
<string name="domain_receive_assets_default_address">Standardadresse</string>
<string name="domain_receive_assets_legacy_address">Legacy adresse</string>
<string name="domain_receive_assets_legacy_address">Legacy %s adresse</string>
<string name="domain_receive_assets_navigation_title">Empfangen von Vermögenswerten</string>
<string name="domain_receive_assets_network_name_address">%s Adresse</string>
<string name="domain_receive_assets_onboarding_description">Das Senden von Vermögenswerten in anderen Netzwerken führt zu dauerhaftem Verlust.</string>
@ -542,6 +542,7 @@
<string name="feedback_preface_scan_failed">Bitte sag uns, welche Karte oder Ring du hast</string>
<string name="feedback_preface_support">Hallo Support-Team,</string>
<string name="feedback_preface_tx_failed">Bitte erzähle uns mehr über dein Problem. Jedes kleine Detail kann helfen.</string>
<string name="feedback_subject_backup_problem">Problem mit der Sicherung</string>
<string name="feedback_subject_pre_activated_wallet">Zuvor aktivierte Wallet</string>
<string name="feedback_subject_rate_negative">Meine Vorschläge</string>
<string name="feedback_subject_scan_failed">Kann eine Karte oder Ring nicht scannen</string>
@ -1502,6 +1503,7 @@
<string name="tangempay_onboarding_title">Erhalten Sie Ihre kostenlose Tangem Pay Card in wenigen Minuten</string>
<string name="tangempay_payment_account">Zahlungskonto</string>
<string name="tangempay_payment_account_sync_needed">Zahlungskonto ist nicht synchronisiert</string>
<string name="tangempay_pin_validation_error_message">Ungültige PIN: Sequenzen oder Wiederholungen vermeiden</string>
<string name="tangempay_service_unavailable_description">Wir beheben ein technisches Problem. Bitte versuchen Sie es später erneut.</string>
<string name="tangempay_service_unavailable_title">Service vorübergehend nicht verfügbar</string>
<string name="tangempay_service_unreachable_try_later">Daten können derzeit nicht angezeigt werden, Kartenzahlungen funktionieren jedoch weiterhin.</string>
@ -1770,6 +1772,8 @@
<string name="warning_button_ok">OK, habe ich verstanden!</string>
<string name="warning_button_really_cool">Echt toll!</string>
<string name="warning_button_refresh">Aktualisieren</string>
<string name="warning_clore_migration_message">Laut der offiziellen Dokumentation von Clore werden alle Münzen, die vor dem 21. Dezember erhalten wurden, in Clore (ERC-20 Token) migriert; Münzen, die nach diesem Datum erhalten wurden, nicht. Eine Lösung für den Transfer ist in Arbeit — bleibt dran.</string>
<string name="warning_clore_migration_title">Migration des Clore-Netzwerks</string>
<string name="warning_demo_mode_message">Du befindest sich derzeit im Demo-Modus</string>
<string name="warning_demo_mode_title">Demo-Modus aktiv</string>
<string name="warning_developer_card_message">Die Karte, die du gescannt hast, ist eine Entwicklerkarte. Verwenden diese nicht zur Erstellung Ihrer Wallet.</string>

View file

@ -401,7 +401,7 @@
<string name="disclaimer_error_loading">Compruebe su conexión a internet o cambia a una red diferente</string>
<string name="disclaimer_title">Condiciones de uso</string>
<string name="domain_receive_assets_default_address">Dirección por defecto</string>
<string name="domain_receive_assets_legacy_address">Dirección Legacy</string>
<string name="domain_receive_assets_legacy_address">Dirección %s Legacy</string>
<string name="domain_receive_assets_navigation_title">Recibir activos</string>
<string name="domain_receive_assets_network_name_address">%s dirección</string>
<string name="domain_receive_assets_onboarding_description">Enviar activos a otras redes resultará en una pérdida permanente.</string>
@ -491,6 +491,7 @@
<string name="feedback_preface_scan_failed">Por favor, díganos qué tarjeta o anillo tiene</string>
<string name="feedback_preface_support">Hola equipo de soporte,</string>
<string name="feedback_preface_tx_failed">Por favor, cuéntenos más sobre tu problema. Cada pequeño detalle puede ayudar.</string>
<string name="feedback_subject_backup_problem">Problema con la copia de seguridad</string>
<string name="feedback_subject_pre_activated_wallet">Billetera previamente activada</string>
<string name="feedback_subject_rate_negative">Mis recomendaciones</string>
<string name="feedback_subject_scan_failed">No se puede escanear una tarjeta/anillo</string>
@ -1399,6 +1400,7 @@
<string name="tangempay_onboarding_title">Obtén tu tarjeta Tangem Pay gratuita en minutos</string>
<string name="tangempay_payment_account">Cuenta de pago</string>
<string name="tangempay_payment_account_sync_needed">La cuenta de pago no está sincronizada</string>
<string name="tangempay_pin_validation_error_message">PIN no válido: evitar secuencias o repeticiones</string>
<string name="tangempay_service_unavailable_description">Estamos solucionando un problema técnico. Por favor, inténtelo de nuevo más tarde.</string>
<string name="tangempay_service_unavailable_title">Servicio temporalmente no disponible</string>
<string name="tangempay_service_unreachable_try_later">No es posible mostrar los datos en este momento, pero los pagos con tarjeta siguen funcionando.</string>
@ -1582,6 +1584,8 @@
<string name="warning_button_ok">Entendido</string>
<string name="warning_button_really_cool">¡Realmente genial!</string>
<string name="warning_button_refresh">Actualizar</string>
<string name="warning_clore_migration_message">Según la documentación oficial de Clore, todas las monedas recibidas antes del 21 de diciembre serán migradas a Clore (token ERC-20); las monedas recibidas después de esa fecha no lo serán. Se está desarrollando una solución de transferencia — mantente atento.</string>
<string name="warning_clore_migration_title">Migración de la red Clore</string>
<string name="warning_demo_mode_message">Actualmente estás en el modo Demo</string>
<string name="warning_demo_mode_title">Modo demo activo</string>
<string name="warning_developer_card_message">La tarjeta que ha escaneado es una tarjeta de desarrollador. No la use para crear su billetera.</string>

View file

@ -394,7 +394,7 @@
<string name="disclaimer_error_loading">Vérifiez votre connexion Internet ou passez à un réseau différent</string>
<string name="disclaimer_title">Conditions d\'utilisation</string>
<string name="domain_receive_assets_default_address">Adresse par défaut</string>
<string name="domain_receive_assets_legacy_address">Legacy adresse</string>
<string name="domain_receive_assets_legacy_address">Legacy %s adresse</string>
<string name="domain_receive_assets_navigation_title">Recevoir des actifs</string>
<string name="domain_receive_assets_network_name_address">%s adresse</string>
<string name="domain_receive_assets_onboarding_description">Lenvoi dactifs sur dautres réseaux entraînera une perte définitive.</string>
@ -482,6 +482,7 @@
<string name="feedback_preface_scan_failed">Veuillez nous dire quelle carte vous avez</string>
<string name="feedback_preface_support">Chère équipe de support,</string>
<string name="feedback_preface_tx_failed">Veuillez nous en dire plus sur votre problème. Chaque petit détail peut nous aider.</string>
<string name="feedback_subject_backup_problem">Problème de sauvegarde</string>
<string name="feedback_subject_pre_activated_wallet">Portefeuille précédemment activé</string>
<string name="feedback_subject_rate_negative">Mes suggestions</string>
<string name="feedback_subject_scan_failed">Impossible de scanner une carte</string>
@ -1391,6 +1392,7 @@
<string name="tangempay_onboarding_title">Obtenez votre carte Tangem Pay gratuite en quelques minutes</string>
<string name="tangempay_payment_account">Compte de paiement</string>
<string name="tangempay_payment_account_sync_needed">Le compte de paiement n\'est pas synchronisé</string>
<string name="tangempay_pin_validation_error_message">Code PIN invalide : évitez les séquences ou les répétitions</string>
<string name="tangempay_service_unavailable_description">Nous réparons un problème technique. Veuillez réessayer plus tard.</string>
<string name="tangempay_service_unavailable_title">Service temporairement indisponible</string>
<string name="tangempay_service_unreachable_try_later">Les données ne peuvent pas être affichées pour le moment, mais les paiements par carte fonctionnent toujours.</string>
@ -1592,6 +1594,8 @@
<string name="warning_button_ok">Ok, compris!</string>
<string name="warning_button_really_cool">Vraiment cool !</string>
<string name="warning_button_refresh">Rafraîchir</string>
<string name="warning_clore_migration_message">Selon la documentation officielle de Clore, toutes les pièces reçues avant le 21 décembre seront migrées vers Clore (token ERC-20) ; les pièces reçues après cette date ne le seront pas. Une solution de transfert arrive — restez à l\'écoute.</string>
<string name="warning_clore_migration_title">Migration du réseau Clore</string>
<string name="warning_demo_mode_message">Vous êtes actuellement en mode démo</string>
<string name="warning_demo_mode_title">Mode démo actif</string>
<string name="warning_developer_card_message">La carte que vous avez scannée est une carte de développeur. Ne l\'utilisez pas pour créer votre portefeuille.</string>

View file

@ -164,6 +164,7 @@
<string name="tangempay_onboarding_title">Ottieni la tua carta Tangem Pay gratuita in pochi minuti</string>
<string name="tangempay_payment_account">Conto di pagamento</string>
<string name="tangempay_payment_account_sync_needed">Il conto di pagamento non è sincronizzato</string>
<string name="tangempay_pin_validation_error_message">PIN non valido: evitare sequenze o ripetizioni</string>
<string name="tangempay_service_unavailable_description">Stiamo risolvendo un problema tecnico. Riprova più tardi.</string>
<string name="tangempay_service_unavailable_title">Servizio temporaneamente non disponibile</string>
<string name="tangempay_service_unreachable_try_later">Al momento non è possibile visualizzare i dati, ma i pagamenti con carta continuano a funzionare.</string>

View file

@ -1504,6 +1504,7 @@
<string name="tangempay_onboarding_title">無料のTangem Payカードを数分でゲットしましょう</string>
<string name="tangempay_payment_account">支払いアカウント</string>
<string name="tangempay_payment_account_sync_needed">支払アカウントが同期されていません</string>
<string name="tangempay_pin_validation_error_message">無効な暗証番号:連続や繰り返しを避けてください</string>
<string name="tangempay_service_unavailable_description">技術的な問題を修正しています。後でもう一度お試しください。</string>
<string name="tangempay_service_unavailable_title">サービスは一時的に利用できません</string>
<string name="tangempay_service_unreachable_try_later">現在、データを表示できませんが、カードでのお支払いは引き続きご利用いただけます。</string>

View file

@ -460,7 +460,7 @@
<string name="disclaimer_error_loading">Проверьте подключение с интернетом или переключитесь на другую сеть</string>
<string name="disclaimer_title">Условия использования</string>
<string name="domain_receive_assets_default_address">Основной адрес</string>
<string name="domain_receive_assets_legacy_address">Legacy адрес</string>
<string name="domain_receive_assets_legacy_address">Legacy %s адрес</string>
<string name="domain_receive_assets_navigation_title">Получить активы</string>
<string name="domain_receive_assets_network_name_address">%s адрес</string>
<string name="domain_receive_assets_onboarding_description">Отправка средств в другой сети может повлечь потерю средств.</string>
@ -551,6 +551,7 @@
<string name="feedback_preface_scan_failed">Скажите, пожалуйста, какая у вас карта или кольцо?</string>
<string name="feedback_preface_support">Привет, команда поддержки,</string>
<string name="feedback_preface_tx_failed">Пожалуйста, расскажите нам больше о вашей проблеме. Каждая маленькая деталь может помочь.</string>
<string name="feedback_subject_backup_problem">Проблема резервного копирования</string>
<string name="feedback_subject_pre_activated_wallet">Ранее активированный кошелек</string>
<string name="feedback_subject_rate_negative">Мои предложения</string>
<string name="feedback_subject_scan_failed">Не могу отсканировать карту/кольцо</string>
@ -1531,6 +1532,7 @@
<string name="tangempay_onboarding_title">Откройте виртуальную \nTangem Pay Card</string>
<string name="tangempay_payment_account">Платежный аккаунт</string>
<string name="tangempay_payment_account_sync_needed">Платежный аккаунт не синхронизирован</string>
<string name="tangempay_pin_validation_error_message">Слабый ПИН: не используйте повторы или последовательности.</string>
<string name="tangempay_service_unavailable_description">Мы устраняем техническую проблему. Пожалуйста, попробуйте позже.</string>
<string name="tangempay_service_unavailable_title">Сервис временно недоступен</string>
<string name="tangempay_service_unreachable_try_later">Не можем показать данные карты, но оплаты продолжают работать.</string>
@ -1739,6 +1741,8 @@
<string name="warning_button_ok">Понятно!</string>
<string name="warning_button_really_cool">Очень круто!</string>
<string name="warning_button_refresh">Обновить</string>
<string name="warning_clore_migration_message">Согласно официальной документации Clore, все монеты, полученные до 21 декабря, будут мигрированы в токен Clore (ERC-20); монеты, полученные после этой даты, — нет. Решение для перевода находится в разработке — следите за обновлениями.</string>
<string name="warning_clore_migration_title">Миграция сети Clore</string>
<string name="warning_demo_mode_message">Вы находитесь в режиме демо</string>
<string name="warning_demo_mode_title">Демо режим включен</string>
<string name="warning_developer_card_message">Отсканированная вами карта является картой разработчика. Не используйте ее для создания своего кошелька.</string>

View file

@ -323,7 +323,7 @@
<string name="disclaimer_error_loading">Перевірте підключення до інтернету або змініть мережу</string>
<string name="disclaimer_title">Умови використання</string>
<string name="domain_receive_assets_default_address">Основна адреса</string>
<string name="domain_receive_assets_legacy_address">Legacy адреса</string>
<string name="domain_receive_assets_legacy_address">Legacy %s адреса</string>
<string name="domain_receive_assets_navigation_title">Отримати активи</string>
<string name="domain_receive_assets_network_name_address">%s адреса</string>
<string name="domain_receive_assets_onboarding_description">Надсилання активів в інші мережі призведе до безповоротної втрати.</string>
@ -408,6 +408,7 @@
<string name="feedback_preface_scan_failed">Розкажіть, будь ласка, яку картку або кільце ви маєте?</string>
<string name="feedback_preface_support">Привіт, команда підтримки,</string>
<string name="feedback_preface_tx_failed">Будь ласка, розкажіть нам більше про вашу проблему. Кожна дрібниця може допомогти.</string>
<string name="feedback_subject_backup_problem">Проблема з резервним копіюванням</string>
<string name="feedback_subject_pre_activated_wallet">Раніше активований гаманець</string>
<string name="feedback_subject_rate_negative">Мої пропозиції</string>
<string name="feedback_subject_scan_failed">Не вдається відсканувати картку/кільце</string>
@ -1383,6 +1384,8 @@
<string name="warning_button_ok">Зрозуміло!</string>
<string name="warning_button_really_cool">Дуже круто!</string>
<string name="warning_button_refresh">Оновити</string>
<string name="warning_clore_migration_message">Згідно з офіційною документацією Clore, усі монети, отримані до 21 грудня, будуть мігровані в токен Clore (ERC-20); монети, отримані після цієї дати, — ні. Рішення для переказу перебуває в розробці — стежте за оновленнями.</string>
<string name="warning_clore_migration_title">Міграція мережі Clore</string>
<string name="warning_demo_mode_message">Ви перебуваєте в демонстраційному режимі</string>
<string name="warning_demo_mode_title">Демонстраційний режим активовано</string>
<string name="warning_developer_card_message">Відсканована вами картка є карткою розробника. Не використовуйте її для створення гаманця.</string>

View file

@ -1527,6 +1527,7 @@
<string name="tangempay_onboarding_title">Get your free Tangem Pay Card in minutes</string>
<string name="tangempay_payment_account">Payment account</string>
<string name="tangempay_payment_account_sync_needed">Payment account is not synced</string>
<string name="tangempay_pin_validation_error_message">Invalid PIN: avoid sequences or repeats</string>
<string name="tangempay_service_unavailable_description">Were fixing a technical issue. Please try again later.</string>
<string name="tangempay_service_unavailable_title">Service temporarily unavailable</string>
<string name="tangempay_service_unreachable_try_later">Unable to display details. However, card payments are still working.</string>
@ -1796,7 +1797,7 @@
<string name="warning_button_ok">Ok, Got it!</string>
<string name="warning_button_really_cool">Really cool!</string>
<string name="warning_button_refresh">Refresh</string>
<string name="warning_clore_migration_message">According to Clores official documentation, all tokens received before December 21 will be migrated to Clore (ERC20); tokens received after will not. Transfer solution coming — stay tuned.</string>
<string name="warning_clore_migration_message">According to Clores official documentation, all coins received before December 21 will be migrated to Clore (ERC-20 token); coins received after that date will not. A transfer solution is coming — stay tuned.</string>
<string name="warning_clore_migration_title">Clore Network Migration</string>
<string name="warning_demo_mode_message">You are currently in the Demo mode</string>
<string name="warning_demo_mode_title">Demo mode active</string>

View file

@ -1,6 +1,7 @@
package com.tangem.data.pay.repository
import arrow.core.Either
import arrow.core.raise.catch
import com.tangem.datasource.api.pay.TangemPayApi
import com.tangem.datasource.api.pay.models.request.DeeplinkValidityRequest
import com.tangem.datasource.api.pay.models.request.OrderRequest
@ -23,6 +24,7 @@ import com.tangem.features.hotwallet.HotWalletFeatureToggles
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import kotlinx.coroutines.launch
import kotlinx.coroutines.withContext
import timber.log.Timber
import java.util.concurrent.ConcurrentHashMap
import javax.inject.Inject
@ -110,15 +112,21 @@ internal class DefaultOnboardingRepository @Inject constructor(
override suspend fun createOrder(userWalletId: UserWalletId) = withContext(dispatcherProvider.io) {
launch {
requestHelper.runWithErrorLogs(TAG) {
val walletAddress = requestHelper.getCustomerWalletAddress(userWalletId)
val result = requestHelper.request(userWalletId) { authHeader ->
tangemPayApi.createOrder(authHeader, body = OrderRequest(walletAddress))
}.result ?: error("Create order result is null")
catch(
block = {
val walletAddress = requestHelper.getCustomerWalletAddress(userWalletId)
val response = requestHelper.performRequest(userWalletId) { authHeader ->
tangemPayApi.createOrder(authHeader, body = OrderRequest(walletAddress))
}.getOrNull()
val customerWalletAddress = requireNotNull(result.data.customerWalletAddress)
tangemPayStorage.storeOrderId(customerWalletAddress, result.id)
}
val result = requireNotNull(response?.result)
val customerWalletAddress = requireNotNull(result.data.customerWalletAddress)
tangemPayStorage.storeOrderId(customerWalletAddress, result.id)
},
catch = {
Timber.tag(TAG).e("createOrder: $it")
},
)
}
}

View file

@ -120,27 +120,18 @@ internal class DefaultTangemPayCardDetailsRepository @Inject constructor(
block = {
val publicKeyBase64 = getPublicKeyBase64()
val (secretKeyBytes, sessionId) = rainCryptoUtil.generateSecretKeyAndSessionId(publicKeyBase64)
val result = requireNotNull(
requestHelper.performRequest(userWalletId = userWalletId) { authHeader ->
tangemPayApi.revealCardDetails(
authHeader = authHeader,
body = CardDetailsRequest(sessionId = sessionId),
)
}.getOrNull()?.result,
)
val response = requestHelper.performRequest(userWalletId = userWalletId) { authHeader ->
tangemPayApi.getPin(authHeader = authHeader, sessionId = sessionId)
}.getOrNull()
val result = requireNotNull(response?.result)
val pin = rainCryptoUtil.decryptPin(
base64Secret = result.secret,
base64Iv = result.iv,
secretKeyBytes = secretKeyBytes,
).takeIf { !it.isNullOrEmpty() }
val encryptedPin = result.pin
val pin = if (encryptedPin != null) {
rainCryptoUtil.decryptPin(
base64Secret = encryptedPin.secret,
base64Iv = encryptedPin.iv,
secretKeyBytes = secretKeyBytes,
).takeIf { !it.isNullOrEmpty() }
} else {
null
}
secretKeyBytes.fill(0)
pin.right()
},
catch = ::catchException,
@ -148,14 +139,14 @@ internal class DefaultTangemPayCardDetailsRepository @Inject constructor(
}
override suspend fun setPin(userWalletId: UserWalletId, pin: String): Either<UniversalError, SetPinResult> {
return requestHelper.runWithErrorLogs(TAG) {
val publicKeyBase64 = getPublicKeyBase64()
val (secretKeyBytes, sessionId) = rainCryptoUtil.generateSecretKeyAndSessionId(publicKeyBase64)
val encryptedData = rainCryptoUtil.encryptPin(pin = pin, secretKeyBytes = secretKeyBytes)
secretKeyBytes.fill(0)
return catch(
block = {
val publicKeyBase64 = getPublicKeyBase64()
val (secretKeyBytes, sessionId) = rainCryptoUtil.generateSecretKeyAndSessionId(publicKeyBase64)
val encryptedData = rainCryptoUtil.encryptPin(pin = pin, secretKeyBytes = secretKeyBytes)
secretKeyBytes.fill(0)
val status = requireNotNull(
requestHelper.request(userWalletId) { authHeader ->
val response = requestHelper.performRequest(userWalletId) { authHeader ->
tangemPayApi.setPin(
authHeader = authHeader,
body = SetPinRequest(
@ -164,27 +155,41 @@ internal class DefaultTangemPayCardDetailsRepository @Inject constructor(
iv = encryptedData.ivBase64,
),
)
}.result?.result,
)
when (status) {
SetPinResult.SUCCESS.name -> SetPinResult.SUCCESS
SetPinResult.PIN_TOO_WEAK.name -> SetPinResult.PIN_TOO_WEAK
SetPinResult.DECRYPTION_ERROR.name -> SetPinResult.DECRYPTION_ERROR
else -> SetPinResult.UNKNOWN_ERROR
}
}
}.getOrNull()
val status = requireNotNull(response?.result?.result)
val result = when (status) {
SetPinResult.SUCCESS.name -> SetPinResult.SUCCESS
SetPinResult.PIN_TOO_WEAK.name -> SetPinResult.PIN_TOO_WEAK
SetPinResult.DECRYPTION_ERROR.name -> SetPinResult.DECRYPTION_ERROR
else -> SetPinResult.UNKNOWN_ERROR
}
result.right()
},
catch = ::catchException,
)
}
override suspend fun isAddToWalletDone(userWalletId: UserWalletId): Either<UniversalError, Boolean> {
return requestHelper.runWithErrorLogs(TAG) {
storage.getAddToWalletDone(requestHelper.getCustomerWalletAddress(userWalletId))
}
return catch(
block = {
storage.getAddToWalletDone(
customerWalletAddress = requestHelper.getCustomerWalletAddress(userWalletId),
).right()
},
catch = ::catchException,
)
}
override suspend fun setAddToWalletAsDone(userWalletId: UserWalletId): Either<UniversalError, Unit> {
return requestHelper.runWithErrorLogs(TAG) {
storage.storeAddToWalletDone(requestHelper.getCustomerWalletAddress(userWalletId), isDone = true)
}
return catch(
block = {
storage.storeAddToWalletDone(
customerWalletAddress = requestHelper.getCustomerWalletAddress(userWalletId),
isDone = true,
).right()
},
catch = ::catchException,
)
}
override suspend fun freezeCard(

View file

@ -18,7 +18,6 @@ import com.tangem.domain.visa.error.VisaApiError
import com.tangem.domain.visa.model.TangemPayAuthTokens
import com.tangem.domain.visa.model.getAuthHeader
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import kotlinx.coroutines.CancellationException
import kotlinx.coroutines.sync.Mutex
import kotlinx.coroutines.sync.withLock
import kotlinx.coroutines.withContext
@ -41,38 +40,6 @@ internal class TangemPayRequestPerformer @Inject constructor(
private val customerWalletAddresses = ConcurrentHashMap<UserWalletId, String>()
private val tokensMutex = Mutex()
@Deprecated("Do not use this method")
suspend fun <T : Any> runWithErrorLogs(tag: String, requestBlock: suspend () -> T): Either<VisaApiError, T> {
return try {
val result = requestBlock()
Either.Right(result)
} catch (exception: Exception) {
when (exception) {
is CancellationException -> {
throw exception
}
else -> {
Timber.tag(tag).e(exception)
Either.Left(errorConverter.convert(exception))
}
}
}
}
@Deprecated("Use perform request instead", replaceWith = ReplaceWith("performRequest"))
suspend fun <T : Any> request(
userWalletId: UserWalletId,
requestBlock: suspend (header: String) ->
ApiResponse<T>,
): T = withContext(dispatchers.io) {
performRequest(userWalletId, requestBlock = requestBlock)
// to keep behaviour as previous
.fold(
ifRight = { it },
ifLeft = { error -> error("Cannot perform request: $error") },
)
}
suspend fun <T : Any> performWithStaticToken(
requestBlock: suspend (header: String) -> ApiResponse<T>,
): Either<VisaApiError, T> = withContext(dispatchers.io) {

View file

@ -17,10 +17,6 @@ import timber.log.Timber
private const val TAG = "TangemPayMainScreenCustomerInfoUseCase"
/**
* Returns tangem pay customer info for the main screen banner
* Works only if the user already authorised at least once (won't emit anything otherwise)
*/
class TangemPayMainScreenCustomerInfoUseCase(
private val onboardingRepository: OnboardingRepository,
private val customerOrderRepository: CustomerOrderRepository,

View file

@ -5,9 +5,13 @@ import com.tangem.core.decompose.di.ModelScoped
import com.tangem.core.decompose.model.Model
import com.tangem.core.decompose.model.ParamsContainer
import com.tangem.core.decompose.navigation.Router
import com.tangem.core.decompose.ui.UiMessageSender
import com.tangem.core.ui.extensions.resourceReference
import com.tangem.core.ui.message.ToastMessage
import com.tangem.domain.pay.model.SetPinResult
import com.tangem.domain.pay.repository.TangemPayCardDetailsRepository
import com.tangem.features.tangempay.components.TangemPayDetailsContainerComponent
import com.tangem.features.tangempay.details.impl.R
import com.tangem.features.tangempay.entity.TangemPayChangePinUM
import com.tangem.features.tangempay.model.transformers.PinCodeChangeTransformer
import com.tangem.features.tangempay.navigation.TangemPayDetailsInnerRoute
@ -23,6 +27,7 @@ import javax.inject.Inject
internal class TangemPayChangePinModel @Inject constructor(
paramsContainer: ParamsContainer,
override val dispatchers: CoroutineDispatcherProvider,
private val uiMessageSender: UiMessageSender,
private val router: Router,
private val cardDetailsRepository: TangemPayCardDetailsRepository,
) : Model() {
@ -49,8 +54,12 @@ internal class TangemPayChangePinModel @Inject constructor(
}
uiState.update { it.copy(submitButtonLoading = false) }
when (result) {
SetPinResult.PIN_TOO_WEAK -> {
uiMessageSender.send(
message = ToastMessage(resourceReference(R.string.tangempay_pin_validation_error_message)),
)
}
SetPinResult.SUCCESS -> router.push(TangemPayDetailsInnerRoute.ChangePINSuccess)
SetPinResult.PIN_TOO_WEAK,
SetPinResult.DECRYPTION_ERROR,
SetPinResult.UNKNOWN_ERROR,
null,

View file

@ -4,11 +4,11 @@ import com.tangem.core.ui.R
import com.tangem.core.ui.components.bottomsheets.message.MessageBottomSheetUMV2
import com.tangem.core.ui.components.bottomsheets.message.icon
import com.tangem.core.ui.components.bottomsheets.message.infoBlock
import com.tangem.core.ui.components.bottomsheets.message.messageBottomSheetUM
import com.tangem.core.ui.components.bottomsheets.message.onClick
import com.tangem.core.ui.components.bottomsheets.message.secondaryButton
import com.tangem.core.ui.extensions.TextReference
import com.tangem.core.ui.extensions.resourceReference
import com.tangem.core.ui.message.bottomSheetMessage
import com.tangem.features.tangempay.entity.TangemPayViewPinUM
import com.tangem.utils.transformer.Transformer
@ -16,7 +16,7 @@ internal class TangemPayViewPinErrorStateTransformer : Transformer<TangemPayView
override fun transform(prevState: TangemPayViewPinUM): TangemPayViewPinUM {
return TangemPayViewPinUM.Error(
errorMessage = bottomSheetMessage {
errorMessage = messageBottomSheetUM {
infoBlock {
icon(R.drawable.img_attention_20) {
backgroundType = MessageBottomSheetUMV2.Icon.BackgroundType.Attention
@ -26,9 +26,9 @@ internal class TangemPayViewPinErrorStateTransformer : Transformer<TangemPayView
}
secondaryButton {
text = resourceReference(R.string.common_got_it)
onClick { closeBs() }
onClick { prevState.onDismiss() }
}
}.messageBottomSheetUMV2,
},
onDismiss = prevState.onDismiss,
)
}

View file

@ -85,7 +85,7 @@ internal class TangemPayClickIntentsImplementor @Inject constructor(
userWallet = userWallet,
userWalletId = userWallet.walletId,
onRefreshClick = { onRefreshPayToken(userWallet) },
)
),
)
}
}