diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/pay/TangemPayApi.kt b/core/datasource/src/main/java/com/tangem/datasource/api/pay/TangemPayApi.kt index 1054ffef58..773dbb7b72 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/api/pay/TangemPayApi.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/api/pay/TangemPayApi.kt @@ -62,6 +62,12 @@ interface TangemPayApi { @Body body: CardDetailsRequest, ): ApiResponse + @GET("v1/customer/card/pin") + suspend fun getPin( + @Header("Authorization") authHeader: String, + @Header("X-Session-Id") sessionId: String, + ): ApiResponse + @PUT("v1/customer/card/pin") suspend fun setPin( @Header("Authorization") authHeader: String, diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/pay/models/request/GetPinResponse.kt b/core/datasource/src/main/java/com/tangem/datasource/api/pay/models/request/GetPinResponse.kt new file mode 100644 index 0000000000..ad9da0eda5 --- /dev/null +++ b/core/datasource/src/main/java/com/tangem/datasource/api/pay/models/request/GetPinResponse.kt @@ -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, + ) +} \ No newline at end of file diff --git a/core/datasource/src/main/java/com/tangem/datasource/api/pay/models/response/CardDetailsResponse.kt b/core/datasource/src/main/java/com/tangem/datasource/api/pay/models/response/CardDetailsResponse.kt index 17b226bacc..599d94d6b1 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/api/pay/models/response/CardDetailsResponse.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/api/pay/models/response/CardDetailsResponse.kt @@ -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) diff --git a/core/res/src/main/res/values-de/strings.xml b/core/res/src/main/res/values-de/strings.xml index cefd04ae41..dcdf6d4a87 100644 --- a/core/res/src/main/res/values-de/strings.xml +++ b/core/res/src/main/res/values-de/strings.xml @@ -449,7 +449,7 @@ Überprüfe deine Internetverbindung oder wechseln zu einem anderen Netzwerk Nutzungsbedingungen Standardadresse - Legacy adresse + Legacy %s adresse Empfangen von Vermögenswerten %s Adresse Das Senden von Vermögenswerten in anderen Netzwerken führt zu dauerhaftem Verlust. @@ -542,6 +542,7 @@ Bitte sag uns, welche Karte oder Ring du hast Hallo Support-Team, Bitte erzähle uns mehr über dein Problem. Jedes kleine Detail kann helfen. + Problem mit der Sicherung Zuvor aktivierte Wallet Meine Vorschläge Kann eine Karte oder Ring nicht scannen @@ -1502,6 +1503,7 @@ Erhalten Sie Ihre kostenlose Tangem Pay Card in wenigen Minuten Zahlungskonto Zahlungskonto ist nicht synchronisiert + Ungültige PIN: Sequenzen oder Wiederholungen vermeiden Wir beheben ein technisches Problem. Bitte versuchen Sie es später erneut. Service vorübergehend nicht verfügbar Daten können derzeit nicht angezeigt werden, Kartenzahlungen funktionieren jedoch weiterhin. @@ -1770,6 +1772,8 @@ OK, habe ich verstanden! Echt toll! Aktualisieren + 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. + Migration des Clore-Netzwerks Du befindest sich derzeit im Demo-Modus Demo-Modus aktiv Die Karte, die du gescannt hast, ist eine Entwicklerkarte. Verwenden diese nicht zur Erstellung Ihrer Wallet. diff --git a/core/res/src/main/res/values-es/strings.xml b/core/res/src/main/res/values-es/strings.xml index c1cf00a410..1c463c9d8e 100644 --- a/core/res/src/main/res/values-es/strings.xml +++ b/core/res/src/main/res/values-es/strings.xml @@ -401,7 +401,7 @@ Compruebe su conexión a internet o cambia a una red diferente Condiciones de uso Dirección por defecto - Dirección Legacy + Dirección %s Legacy Recibir activos %s dirección Enviar activos a otras redes resultará en una pérdida permanente. @@ -491,6 +491,7 @@ Por favor, díganos qué tarjeta o anillo tiene Hola equipo de soporte, Por favor, cuéntenos más sobre tu problema. Cada pequeño detalle puede ayudar. + Problema con la copia de seguridad Billetera previamente activada Mis recomendaciones No se puede escanear una tarjeta/anillo @@ -1399,6 +1400,7 @@ Obtén tu tarjeta Tangem Pay gratuita en minutos Cuenta de pago La cuenta de pago no está sincronizada + PIN no válido: evitar secuencias o repeticiones Estamos solucionando un problema técnico. Por favor, inténtelo de nuevo más tarde. Servicio temporalmente no disponible No es posible mostrar los datos en este momento, pero los pagos con tarjeta siguen funcionando. @@ -1582,6 +1584,8 @@ Entendido ¡Realmente genial! Actualizar + 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. + Migración de la red Clore Actualmente estás en el modo Demo Modo demo activo La tarjeta que ha escaneado es una tarjeta de desarrollador. No la use para crear su billetera. diff --git a/core/res/src/main/res/values-fr/strings.xml b/core/res/src/main/res/values-fr/strings.xml index 24e86ad9cd..16ebbde2fe 100644 --- a/core/res/src/main/res/values-fr/strings.xml +++ b/core/res/src/main/res/values-fr/strings.xml @@ -394,7 +394,7 @@ Vérifiez votre connexion Internet ou passez à un réseau différent Conditions d\'utilisation Adresse par défaut - Legacy adresse + Legacy %s adresse Recevoir des actifs %s adresse L’envoi d’actifs sur d’autres réseaux entraînera une perte définitive. @@ -482,6 +482,7 @@ Veuillez nous dire quelle carte vous avez Chère équipe de support, Veuillez nous en dire plus sur votre problème. Chaque petit détail peut nous aider. + Problème de sauvegarde Portefeuille précédemment activé Mes suggestions Impossible de scanner une carte @@ -1391,6 +1392,7 @@ Obtenez votre carte Tangem Pay gratuite en quelques minutes Compte de paiement Le compte de paiement n\'est pas synchronisé + Code PIN invalide : évitez les séquences ou les répétitions Nous réparons un problème technique. Veuillez réessayer plus tard. Service temporairement indisponible Les données ne peuvent pas être affichées pour le moment, mais les paiements par carte fonctionnent toujours. @@ -1592,6 +1594,8 @@ Ok, compris! Vraiment cool ! Rafraîchir + 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. + Migration du réseau Clore Vous êtes actuellement en mode démo Mode démo actif La carte que vous avez scannée est une carte de développeur. Ne l\'utilisez pas pour créer votre portefeuille. diff --git a/core/res/src/main/res/values-it/strings.xml b/core/res/src/main/res/values-it/strings.xml index 2e418c1d4c..9128efeb7f 100644 --- a/core/res/src/main/res/values-it/strings.xml +++ b/core/res/src/main/res/values-it/strings.xml @@ -164,6 +164,7 @@ Ottieni la tua carta Tangem Pay gratuita in pochi minuti Conto di pagamento Il conto di pagamento non è sincronizzato + PIN non valido: evitare sequenze o ripetizioni Stiamo risolvendo un problema tecnico. Riprova più tardi. Servizio temporaneamente non disponibile Al momento non è possibile visualizzare i dati, ma i pagamenti con carta continuano a funzionare. diff --git a/core/res/src/main/res/values-ja/strings.xml b/core/res/src/main/res/values-ja/strings.xml index f884797c15..666fe8e6bb 100644 --- a/core/res/src/main/res/values-ja/strings.xml +++ b/core/res/src/main/res/values-ja/strings.xml @@ -1504,6 +1504,7 @@ 無料のTangem Payカードを数分でゲットしましょう 支払いアカウント 支払アカウントが同期されていません + 無効な暗証番号:連続や繰り返しを避けてください 技術的な問題を修正しています。後でもう一度お試しください。 サービスは一時的に利用できません 現在、データを表示できませんが、カードでのお支払いは引き続きご利用いただけます。 diff --git a/core/res/src/main/res/values-ru/strings.xml b/core/res/src/main/res/values-ru/strings.xml index 6be32ab70f..ee6d3b99d7 100644 --- a/core/res/src/main/res/values-ru/strings.xml +++ b/core/res/src/main/res/values-ru/strings.xml @@ -460,7 +460,7 @@ Проверьте подключение с интернетом или переключитесь на другую сеть Условия использования Основной адрес - Legacy адрес + Legacy %s адрес Получить активы %s адрес Отправка средств в другой сети может повлечь потерю средств. @@ -551,6 +551,7 @@ Скажите, пожалуйста, какая у вас карта или кольцо? Привет, команда поддержки, Пожалуйста, расскажите нам больше о вашей проблеме. Каждая маленькая деталь может помочь. + Проблема резервного копирования Ранее активированный кошелек Мои предложения Не могу отсканировать карту/кольцо @@ -1531,6 +1532,7 @@ Откройте виртуальную \nTangem Pay Card Платежный аккаунт Платежный аккаунт не синхронизирован + Слабый ПИН: не используйте повторы или последовательности. Мы устраняем техническую проблему. Пожалуйста, попробуйте позже. Сервис временно недоступен Не можем показать данные карты, но оплаты продолжают работать. @@ -1739,6 +1741,8 @@ Понятно! Очень круто! Обновить + Согласно официальной документации Clore, все монеты, полученные до 21 декабря, будут мигрированы в токен Clore (ERC-20); монеты, полученные после этой даты, — нет. Решение для перевода находится в разработке — следите за обновлениями. + Миграция сети Clore Вы находитесь в режиме демо Демо режим включен Отсканированная вами карта является картой разработчика. Не используйте ее для создания своего кошелька. diff --git a/core/res/src/main/res/values-uk-rUA/strings.xml b/core/res/src/main/res/values-uk-rUA/strings.xml index 968fdbb71e..6df04c2899 100644 --- a/core/res/src/main/res/values-uk-rUA/strings.xml +++ b/core/res/src/main/res/values-uk-rUA/strings.xml @@ -323,7 +323,7 @@ Перевірте підключення до інтернету або змініть мережу Умови використання Основна адреса - Legacy адреса + Legacy %s адреса Отримати активи %s адреса Надсилання активів в інші мережі призведе до безповоротної втрати. @@ -408,6 +408,7 @@ Розкажіть, будь ласка, яку картку або кільце ви маєте? Привіт, команда підтримки, Будь ласка, розкажіть нам більше про вашу проблему. Кожна дрібниця може допомогти. + Проблема з резервним копіюванням Раніше активований гаманець Мої пропозиції Не вдається відсканувати картку/кільце @@ -1383,6 +1384,8 @@ Зрозуміло! Дуже круто! Оновити + Згідно з офіційною документацією Clore, усі монети, отримані до 21 грудня, будуть мігровані в токен Clore (ERC-20); монети, отримані після цієї дати, — ні. Рішення для переказу перебуває в розробці — стежте за оновленнями. + Міграція мережі Clore Ви перебуваєте в демонстраційному режимі Демонстраційний режим активовано Відсканована вами картка є карткою розробника. Не використовуйте її для створення гаманця. diff --git a/core/res/src/main/res/values/strings.xml b/core/res/src/main/res/values/strings.xml index 1bce65560b..1a5e95cd53 100644 --- a/core/res/src/main/res/values/strings.xml +++ b/core/res/src/main/res/values/strings.xml @@ -1527,6 +1527,7 @@ Get your free Tangem Pay Card in minutes Payment account Payment account is not synced + Invalid PIN: avoid sequences or repeats We’re fixing a technical issue. Please try again later. Service temporarily unavailable Unable to display details. However, card payments are still working. @@ -1796,7 +1797,7 @@ Ok, Got it! Really cool! Refresh - According to Clore’s official documentation, all tokens received before December 21 will be migrated to Clore (ERC20); tokens received after will not. Transfer solution coming — stay tuned. + According to Clore’s 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. Clore Network Migration You are currently in the Demo mode Demo mode active diff --git a/data/visa/src/main/kotlin/com/tangem/data/pay/repository/DefaultOnboardingRepository.kt b/data/visa/src/main/kotlin/com/tangem/data/pay/repository/DefaultOnboardingRepository.kt index fe06e7b5e3..9b12c88cb6 100644 --- a/data/visa/src/main/kotlin/com/tangem/data/pay/repository/DefaultOnboardingRepository.kt +++ b/data/visa/src/main/kotlin/com/tangem/data/pay/repository/DefaultOnboardingRepository.kt @@ -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") + }, + ) } } diff --git a/data/visa/src/main/kotlin/com/tangem/data/pay/repository/DefaultTangemPayCardDetailsRepository.kt b/data/visa/src/main/kotlin/com/tangem/data/pay/repository/DefaultTangemPayCardDetailsRepository.kt index a05f92ee7a..3252c49c4e 100644 --- a/data/visa/src/main/kotlin/com/tangem/data/pay/repository/DefaultTangemPayCardDetailsRepository.kt +++ b/data/visa/src/main/kotlin/com/tangem/data/pay/repository/DefaultTangemPayCardDetailsRepository.kt @@ -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 { - 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 { - 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 { - 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( diff --git a/data/visa/src/main/kotlin/com/tangem/data/pay/repository/TangemPayRequestPerformer.kt b/data/visa/src/main/kotlin/com/tangem/data/pay/repository/TangemPayRequestPerformer.kt index 95b6decdf8..a788639680 100644 --- a/data/visa/src/main/kotlin/com/tangem/data/pay/repository/TangemPayRequestPerformer.kt +++ b/data/visa/src/main/kotlin/com/tangem/data/pay/repository/TangemPayRequestPerformer.kt @@ -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() private val tokensMutex = Mutex() - @Deprecated("Do not use this method") - suspend fun runWithErrorLogs(tag: String, requestBlock: suspend () -> T): Either { - 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 request( - userWalletId: UserWalletId, - requestBlock: suspend (header: String) -> - ApiResponse, - ): 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 performWithStaticToken( requestBlock: suspend (header: String) -> ApiResponse, ): Either = withContext(dispatchers.io) { diff --git a/domain/visa/src/main/kotlin/com/tangem/domain/pay/usecase/TangemPayMainScreenCustomerInfoUseCase.kt b/domain/visa/src/main/kotlin/com/tangem/domain/pay/usecase/TangemPayMainScreenCustomerInfoUseCase.kt index 78d8486b32..6cf5c28a6f 100644 --- a/domain/visa/src/main/kotlin/com/tangem/domain/pay/usecase/TangemPayMainScreenCustomerInfoUseCase.kt +++ b/domain/visa/src/main/kotlin/com/tangem/domain/pay/usecase/TangemPayMainScreenCustomerInfoUseCase.kt @@ -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, diff --git a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayChangePinModel.kt b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayChangePinModel.kt index 405a45ad13..6d9f9d47f2 100644 --- a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayChangePinModel.kt +++ b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayChangePinModel.kt @@ -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, diff --git a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/transformers/TangemPayViewPinErrorStateTransformer.kt b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/transformers/TangemPayViewPinErrorStateTransformer.kt index eacc9656fd..abf2326617 100644 --- a/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/transformers/TangemPayViewPinErrorStateTransformer.kt +++ b/features/tangempay/details/impl/src/main/kotlin/com/tangem/features/tangempay/model/transformers/TangemPayViewPinErrorStateTransformer.kt @@ -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