From ba28cf5b6ddae531e151a45c5a10f68cc4d233e6 Mon Sep 17 00:00:00 2001 From: Tangem Date: Tue, 13 Jan 2026 16:42:46 +0400 Subject: [PATCH] Updated on 2026-08-14 --- core/res/src/main/res/values-de/strings.xml | 10 +- core/res/src/main/res/values-es/strings.xml | 217 ++++++++++++++++++ core/res/src/main/res/values-fr/strings.xml | 205 ++++++++++++++++- core/res/src/main/res/values-ru/strings.xml | 15 +- .../src/main/res/values-uk-rUA/strings.xml | 4 +- core/res/src/main/res/values/strings.xml | 16 +- .../message/MessageBottomSheetV2.kt | 3 +- .../core/ui/extensions/TextReference.kt | 6 +- .../main/res/drawable/ic_heart_broken_32.xml | 9 + .../repository/DefaultOnboardingRepository.kt | 16 +- .../feedback/models/FeedbackEmailType.kt | 2 + .../domain/feedback/FeedbackDataBuilder.kt | 5 + .../feedback/SendFeedbackEmailUseCase.kt | 2 + .../utils/EmailMessageBodyResolver.kt | 7 + .../utils/EmailMessageTitleResolver.kt | 1 + .../feedback/utils/EmailSubjectResolver.kt | 1 + .../feedback/utils/FeedbackConstants.kt | 3 +- .../tangem/domain/pay/model/CustomerInfo.kt | 17 +- .../TangemPayMainScreenCustomerInfoUseCase.kt | 9 +- .../model/TangemPayOnboardingModel.kt | 5 +- .../wallet/child/wallet/WalletComponent.kt | 12 + .../wallet/child/wallet/model/WalletModel.kt | 16 ++ .../model/intents/TangemPayClickIntents.kt | 47 ++++ .../feature/wallet/di/WalletFeatureModule.kt | 6 + .../WalletTangemPayAnalyticsEventSender.kt | 7 +- .../wallet/state/model/WalletDialogConfig.kt | 3 + .../TangemPayUpdateInfoStateTransformer.kt | 32 ++- .../components/visa/KycRejectedComponent.kt | 49 ++++ .../ui/components/visa/KycRejectedModel.kt | 77 +++++++ 29 files changed, 761 insertions(+), 41 deletions(-) create mode 100644 core/ui/src/main/res/drawable/ic_heart_broken_32.xml create mode 100644 features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/ui/components/visa/KycRejectedComponent.kt create mode 100644 features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/ui/components/visa/KycRejectedModel.kt diff --git a/core/res/src/main/res/values-de/strings.xml b/core/res/src/main/res/values-de/strings.xml index 0b971535c9..65cca8211d 100644 --- a/core/res/src/main/res/values-de/strings.xml +++ b/core/res/src/main/res/values-de/strings.xml @@ -303,7 +303,7 @@ Importieren In Arbeit Später - Mehr erfahren + Mehr erfahren %1$s übrig Legacy Bitcoin Gesperrt @@ -627,8 +627,8 @@ Backup anzeigen Entferne Deine Wallet für immer! Trotzdem entfernen! - Für diese Wallet existiert ein Backup. Überprüfe dieses bitte, bevor Du sie entfernst, um sicherzustellen, dass Du sie später wiederherstellen kannst. - Wenn Du diese Wallet ohne Backup entfernst, verlierst Du dauerhaft den Zugriff auf Deine Assets. + Diese Wallet verfügt über ein Backup. Stelle sicher, dass Du es wiederherstellen kannst, bevor die Wallet resettet wird. + Wenn Du diese Wallet ohne Backup löschst, verlierst Du dauerhaft den Zugriff auf Dein Guthaben. Bist du sicher, dass du diese Wallet vergessen willst? Mir ist bewusst, dass ich den Zugriff auf meine Wallet verlieren kann, wenn ich sie vor der Entfernung nicht gesichert habe. Mir ist bewusst, dass durch das Entfernen meiner Wallet diese nicht gelöscht, sondern lediglich von meinem Gerät entfernt wird. @@ -2016,7 +2016,7 @@ Deine Gelder werden derzeit dem Aave-Protokoll bereitgestellt, Du kannst sie jedoch jederzeit verwalten. Deine%s ist in Aave hinterlegt Chart konnte nicht geladen werden... - Das Bereitstellen von %1$s %2$s bei Aave steht aus. + Lieferung %1$s %2$s nach Aave. Deaktiviere den Yield-Modus APY %1$s%% Verfügbar @@ -2082,7 +2082,7 @@ Angebot Effektiver Jahreszins für Versorgung Effektiver Jahreszins - Die Zinsen fallen automatisch an. + Zinsen fallen automatisch an. Zinsen fallen automatisch an Ertragsmodus Bearbeitung Deiner Einzahlung diff --git a/core/res/src/main/res/values-es/strings.xml b/core/res/src/main/res/values-es/strings.xml index aad8904c38..fdd6015419 100644 --- a/core/res/src/main/res/values-es/strings.xml +++ b/core/res/src/main/res/values-es/strings.xml @@ -16,12 +16,53 @@ Establezca un código de acceso de %sdígitos para desbloquear su billetera. Crear código de acceso Código de acceso + No puede crear más de %1$s cuentas. Archive una para añadir una nueva. + No se puede agregar una nueva cuenta + Cuenta archivada + Cuentas archivadas + Recuperar + Está a punto de recuperar \"%1$s\". + Recuperar cuenta + Ha alcanzado el límite de 20 cuentas activas. Archive una cuenta para recuperar esta. + No se puede recuperar la cuenta + Archivado + No hemos podido archivar la cuenta. Vuelva a intentarlo más tarde. + Esta cuenta está participando en el programa de referidos. + Esta cuenta no se puede archivar + No se ha podido crear la cuenta. Por favor, inténtelo más tarde. + Cuenta creada Archivar cuenta Archivar Estás archivando esta cuenta, pero siempre puede recuperarla. + Archivando... Cuenta No se puede editar la cuenta + Cuenta guardada + Cuenta para recompensas + Cuenta #%s - utilizada para la derivación de la dirección. + Añadir cuenta + Guardar + Nombre de la cuenta + Ya existe una cuenta con este nombre. Por favor, elija un nombre diferente. + Nombre de cuenta ya utilizado + Cuenta + Nueva cuenta + Añadir cuenta + Editar cuenta + Vuelva a intentarlo más tarde. Si el problema persiste, póngase en contacto con el servicio de asistencia y le ayudaremos a resolverlo. + %1$s en %2$s + Cuenta principal + Ya ha superado el límite de %1$s cuentas activas. Archive una para recuperarla + No se puede recuperar la cuenta + Cuenta recuperada + Pulse prolongadamente sobre una cuenta para reordenarla + Seguir editando + Descartar + ¿Seguro que quieres descartar la cuenta nueva? + ¿Seguro que deseas descartar las ediciones? + Cambios no guardados Algunos tokens personalizados se moverán automáticamente de \"%1$s\" a \"%2$s\" ya que su derivación pertenece a esa cuenta. + Algunos tokens personalizados se moverán automáticamente ¿No encuentra el token en su billetera? Consulte la sección de Mercados para encontrarlo y añadirlo a la compra ¿No encuentra el token en su billetera? Consulte los mercados para encontrarlo y añadirlo a la venta Vender @@ -81,6 +122,11 @@ Agregar billetera Seleccione una billetera para iniciar sesión ¡Bienvenido de nuevo! + + %d tarjeta + %d tarjetas + + Billetera Móvil Realizó una copia de seguridad de su billetera correctamente. Estas palabras son irrecuperables si se pierden. Guárdelas en un lugar seguro. Copia de seguridad completada @@ -341,6 +387,7 @@ Transferencia No se pueden cargar los datos… Entiendo + Entiendo, continuar Hubo un error. Por favor inténtelo de nuevo. Inaccesible Termine el staking @@ -352,6 +399,9 @@ Modo de rendimiento Dirección de contrato copiada Redes disponibles + La derivación de su token coincide con la derivación de %1$s. Su token se añadirá a esta cuenta. + La derivación pertenece a otra cuenta. + Token añadido a la cuenta %1$s Dirección de contrato La dirección de contrato es incorrecta Por favor, seleccione la red @@ -413,6 +463,7 @@ Error de WalletConnect Ha usado una tarjeta de otra billetera. Toque la tarjeta asociada con esta billetera No hay fondos suficientes para la transacción. Por favor, recargue su cuenta. + Intercambie cualquier activo de su cartera por este token Mis tokens Aún no ha añadido ningún token. Agregue tokens a través de Mercados para hacer intercambios No se puede intercambiar por %s @@ -488,6 +539,12 @@ ID : %s ID de transacción copiado Convierta una de sus activos de su portafolio por este token + Una mayor velocidad significa una confirmación más rápida y una tarifa de red más alta. %s + Elija la velocidad + Elija qué token utilizar para pagar la tarifa de red. %s + Elija token + Mercado y noticias + De actualidad La siguiente información es opcional. Puede borrarla si no quiere compartirla. Cuéntenos qué funciones echa de menos y trataremos de ayudarle. Por favor, díganos qué tarjeta o anillo tiene @@ -640,6 +697,7 @@ El token seleccionado no está disponible actualmente para acciones dentro de la billetera cripto. Pero no se preocupa, puede expresar su interés votando a favor. Votar a favor La billetera no admite más de una red + Sobre la moneda Para comprar, intercambiar o recibir este activo, agréguelo a su portafolio Este activo no está disponible en la billetera Este activo no está disponible para esta billetera @@ -675,8 +733,10 @@ Top Ganadores Top Perdedores Tendencias + Modo Rendimiento Staking es la forma más fácil de recibir recompensas por sus criptomonedas. %s Gana hasta %s APY + Token añadido Acerca de %s %d intercambio @@ -747,6 +807,21 @@ Activar Modo Rendimiento Debes actualizar a %1$s para crear una mobile wallet Mobile Wallet requiere %1$s o posterior + Todas las noticias + Me Gusta + + Hace %dh + Hace %dh + + + Hace %d minuto + Hace %d minutos + + Resumen rápido + Noticias relacionadas + Tokens relacionados + Fuentes + Manténgase informado NFC no está disponible en su dispositivo Acerca de NFT Activo NFT @@ -852,12 +927,14 @@ Generar claves de forma privada Su tarjeta está activada y lista para usar ¡Éxito! + ¡Su billetera está configurada y lista para usar! En este caso, necesitará empezar desde el principio. ¿Quiere salir del proceso de activación? Inicializando Ya se ha creado otra billetera en la tarjeta que está intentando agregar. Si tiene fondos en esta billetera, por favor retírelos y luego reinicie esta tarjeta y agréguela como backup. Guardar su billetera Creando un backup + Biometría Leer más sobre seed phrase @@ -911,6 +988,7 @@ Restaurar código de acceso Tarjetas idénticas Código de acceso + Todas las ofertas Disponible con %s La compra de criptomonedas en Tangem se lleva a cabo utilizando proveedores externos. Buscar por país @@ -918,13 +996,26 @@ Otras monedas Monedas fiduciarias populares Buscar por moneda + Esta transacción ya ha sido procesada. No se requiere ninguna otra acción. + Obteniendo las mejores tarifas... + Instantáneo Al utilizar la funcionalidad onramp, acepta %1$s y %2$s del proveedor. + El servicio es proporcionado por un proveedor externo. \nTangem no es responsable. El monto de la compra no debe ser mayor a %s La cantidad a comprar debe ser como mínimo %s No hay proveedores disponibles para esta moneda + Más rápido Pagar con + Método de pago Disponible hasta %s Disponible desde %s + + %d proveedor + %d proveedores + + Proveedores + Utilizado recientemente + Recomendado Podrá completar su transacción en el proveedor externo, %s Redirigiendo a %s... Nuestros servicios no están disponibles en este país @@ -933,8 +1024,19 @@ Seleccione el país correcto para garantizar opciones de pago y servicios precisos. Ajustes Puede comprobar el estado de la transacción desde la página del token. + + hasta %d día + hasta %d días + + %s mín. + Disponible desde + Disponible hasta + Obtiene + El servicio es proporcionado por un proveedor externo. \nTangem no es responsable. Puede comprobar el estado de la transacción desde la página detallada del token + Hasta Vía + Pagará Agrupar Por saldo Organizar tokens @@ -958,6 +1060,7 @@ Envíe solo %s a esta dirección. Enviar cualquier otra moneda resultará en su pérdida irreversible. Envíe solo %1$s en la red %2$s Transfiera fondos desde otra billetera o exchange + Dirección para recompensas Participar Error al cargar la información sobre el programa de referidos. Por favor, inténtelo de nuevo más tarde. Error al cargar la información sobre el programa de referidos. Código de error: %s. Por favor, inténtelo de nuevo más tarde. @@ -990,8 +1093,13 @@ Resetear la tarjeta Entiendo que después de realizar esta acción, ya no tendré acceso a la billetera actual Entiendo que no puedo usar esta tarjeta para recuperar mi código de acceso en las otras tarjetas de la wallet actual + Entiendo que perderé completamente el acceso a mi tarjeta Tangem Pay y a todos los fondos que contenga sin posibilidad de recuperación El restablecimiento de fábrica eliminará completamente la billetera de la tarjeta seleccionada. No podrá restaurar la billetera actual ni usar la tarjeta para recuperar el código de acceso. El reseteo a valores de fábrica eliminará completamente la billetera de la tarjeta/anillo seleccionado y lo eliminará de la app. No podrá restaurar la billetera actual. + Se han restablecido todos los dispositivos Tangem. + Hubo un problema con la activación. Por favor, restablezca las tarjetas una a una. + Error en la verificación de la tarjeta + Por favor, reinicie el siguiente dispositivo para continuar Si tiene un Anillo Tangem, ¡3 swaps sin comisión en Changelly hasta el 15/11! ¡Intercambia con 0% de comisión! Los dispositivos con jailbreak se consideran menos seguros. Sus datos podrían estar expuestos a riesgos adicionales. @@ -1070,6 +1178,7 @@ Los aranceles aduaneros son altos Debido a las peculiaridades de la red %1$s, la tarifa por transferir el saldo completo es más alta. Para reducir la comisión, puedes dejar %2$s. La tarifa es más alta + La cuenta del beneficiario no está activada. El importe mínimo de la transferencia debe ser igual o superior al saldo exento de alquiler: %1$s. Su saldo no puede ser inferior al monto del alquiler. Mantenga al menos %1$s en su cuenta o retire todos los fondos. La comisión incluida excede el monto de la transferencia, lo que resulta en un valor negativo Cantidad no válida @@ -1135,15 +1244,21 @@ Esto eliminará la wallet de la aplicación. La wallet en sí puede\nañadirse de nuevo. Nombre Haga que su token trabaje para Ud. + Una tarifa de red es un pequeño pago necesario para procesar y confirmar su transacción en la blockchain. Para comenzar a hacer staking, debe activar su cuenta TON con una auto-transacción de 1 TON. Los fondos permanecerán en su billetera; este paso solo es necesario para habilitar su cuenta para staking. + Activación de cuenta + La tarifa de red ha cambiado. Por favor, revise el nuevo importe antes de continuar. + Tarifa de red actualizada La cantidad del staking debe ser al menos %s La cantidad de staking se redondeará a %1$s TRX debido a las reglas de la red. La cantidad de unstaking se redondeará a %1$s TRX debido a las reglas de la red. + APR %1$s%% Reclamar lo que no está en staking Tarifa de staking de la cuenta Una cuenta de staking es una cuenta especial donde se almacenan los tokens SOL de staking. Se crea cuando delegas sus tokens a un validador para participar en la validación de transacciones y ganar recompensas. Se cobra una pequeña tarifa por crear la cuenta de staking, que se devuelve una vez que se completa el staking. Porcentaje de rendimiento anual APR: Muestra el interés que podrías ganar en un año sin capitalización. Los intereses ganados no se añaden a tu saldo, por lo que no ganas intereses adicionales sobre ellos. + Porcentaje de rendimiento anual APY: Muestra el total de intereses que podrías ganar en un año con capitalización. La capitalización significa que los intereses ganados se añaden a tu saldo, por lo que también ganas intereses sobre esos intereses. APR APY @@ -1172,6 +1287,7 @@ La red cobrará una tarifa de aprobación de token para verificar que usted está autorizando el uso de su token para el staking. Al utilizar la función de staking, usted acepta %1$s y %2$s del proveedor Bloqueado + Importe máximo: %s Migrar Staking nativo No hay validadores activos disponibles para hacer staking en este momento. Por favor, inténtalo de nuevo más tarde. @@ -1202,6 +1318,7 @@ La opción de volver a staking le permite mover sus fondos de un validador a otro sin necesidad de retirarlos. Está a punto de hacer staking con todo su saldo. Recomendamos dejar una pequeña cantidad para cubrir las tarifas de red para hacer unstaking o reclamar recompensas. Para empezar a hacer staking, primero debes activar tu cuenta de TON. + Activación de cuenta Para empezar a hacer staking en TON, realice primero una transacción de salida de cualquier importe - esto activará su billetera. Es posible que se requieran hasta 0.2 TON además de la tarifa de red para completar la transacción. Cualquier cantidad no utilizada será reembolsada. Se requieren 0.2 TON para realizar esta operación, además de la tarifa de red. Por favor, recargue su saldo. @@ -1300,6 +1417,7 @@ Error en la estimación de la tarifa. Envíe sus comentarios al servicio de asistencia. Usted intercambia Hacer un intercambio de esta cantidad del token seleccionado causará un impacto significativo en el precio y reducirá su resultado. + Alto impacto en los precios Fondos insuficientes Dar autorización Intercambiar @@ -1322,6 +1440,7 @@ Tu tarjeta está congelada. Obtener ayuda Otro + No se puede usar en dispositivos rooteados Completado Rechazado Pendiente @@ -1334,6 +1453,8 @@ No se pudo descongelar la tarjeta. Inténtalo de nuevo más tarde. Tu tarjeta está descongelada. Retirada + No se puede usar en un dispositivo rooteado + Cancelar KYC Agregar fondos Opciones de recarga Número de tarjeta @@ -1361,19 +1482,24 @@ ¡Todo listo! Tu tarjeta está lista para usar. Añadir tarjeta a Google Pay Añade tu tarjeta a Apple Pay + Código PIN Comparte tu dirección o muestra el código QR + Se detectaron problemas técnicos. Inténtelo de nuevo más tarde o póngase en contacto con el servicio de asistencia. Recepción no disponible ahora Mostrar Mostrar detalles Intercambia cualquier activo de tu portafolio por una tarjeta Detalles de la tarjeta Descongelar tarjeta + Vuelva a la aplicación si lo olvida. + Su código PIN Retirar Retiro no disponible ahora No puedes iniciar un intercambio o un nuevo retiro hasta que el actual finalice. Retiro en progreso Cambiar código PIN Vuelve a la app si lo olvidas. + Entiendo que perderé completamente el acceso a mi tarjeta Tangem Pay y a todos los fondos que contenga sin posibilidad de recuperación Error al emitir la tarjeta Ha ocurrido un error técnico, por favor inténtalo de nuevo haciendo clic en el botón de abajo Ha ocurrido un error técnico, por favor contacta con el soporte @@ -1385,11 +1511,14 @@ Emisión de su tarjeta Estamos preparando tu tarjeta. Esto puede llevar un poco de tiempo. Tangem Pay + Confirmar cancelación + ¿Seguro que desea detener el proceso KYC? Puede retomarlo en cualquier momento. No pudimos verificar tu perfil. Si tienes alguna pregunta, contacta con el soporte. Lamentablemente, no pudimos verificar tu identidad KYC en curso Ver estado KYC en progreso para Tangem Pay + Utilice los botones a continuación para ver su estado KYC actual o cancelarlo. Obtén tu tarjeta virtual Tangem Visa gratuita Usa USDC para pagos cotidianos Obtener tarjeta @@ -1406,7 +1535,9 @@ 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. + Establecer \nCódigo PIN Sincronización necesaria + Restablecer acceso Usa USDC para pagos cotidianos Tangem Pay temporalmente no disponible Tangem Pay @@ -1440,6 +1571,7 @@ Token en la red %%image%% %1$s El token %1$s (%2$s) es la moneda principal en la red %3$s y no se puede ocultar mientras tengas otros tokens de esta red en la lista No se puede ocultar %s + Mostrar código QR Cambie este token por otro por una tarifa de servicio de %1$s del %2$s al %3$s de febrero. Intercambie con Changelly, %s comisiones Intercambie ahora @@ -1454,6 +1586,7 @@ Múltiples direcciones El historial de transacciones no está soportado actualmente para esta blockchain. Pero no se preocupe, ¡estamos trabajando en ello! Mientras tanto, puede consultarlo en el explorador. Operación + para: %s desde: %s a: %s validador: %s @@ -1500,11 +1633,81 @@ Renombrar la billetera Desbloquear todo Desbloquear todo con %s + AML verificado + Disponible + Bloqueado + Deuda + Límites + Otros (no-otp) + Transacción única + Total + + disponible por %d día + disponible por %d días + + El saldo disponible son los fondos reales disponibles, teniendo en cuenta las operaciones pendientes, los importes bloqueados y el saldo deudor para evitar descubiertos. + Disponible hasta %1$s + Saldos y límites + Falta información de la cuenta de pago. Contacte con el soporte técnico. + No se puede cargar información sobre el token + La información aún se está cargando, por favor espere. + Los límites son necesarios para controlar los costes, mejorar la seguridad y gestionar el riesgo. Puede gastar %1$s durante el periodo para pagos con tarjeta en comercios y %2$s para otras transacciones, por ejemplo, suscripciones o deudas. + El código de acceso se utilizará para gestionar su cuenta de pago y protegerla de accesos no autorizados + Código de acceso + Activación de cuenta + Por favor, seleccione la billetera con la que inició el proceso de registro para firmar la transacción de creación de su cuenta en Blockchain. + Cancelar Activación + ¿Seguro que quiere salir? Puede continuar más tarde desde donde lo dejó. + Esto no tardará mucho. Estamos configurando tu cuenta. + Esto no tardará mucho. Estamos completando la activación. + ¡Preparando todo! + Otra billetera Configure un código de 4 dígitos.\nSe utilizará para los pagos. + Código PIN Crear código PIN No se aceptó el PIN. Inténtalo de nuevo o usa un código diferente. PIN no válido: evitar secuencias o repeticiones + ¡Está listo para empezar! + Prepare la tarjeta Tangem y toque para aprobar + Prepare su Billetera Tangem + Podrá completar su conexión \n en un sitio web de terceros \n y volver a la aplicación Tangem + Ir al sitio web + Conexión de billetera + Elija su billetera + Continuar Activación + Continuemos configurando su cuenta. + ¡Bienvenido de nuevo! + Iniciar Activación + Siga los pasos para configurar su cuenta. + ¡Bienvenido! + Cantidad en blockchain + Código de moneda + Fecha + Código de error + Detalles de la transacción + Código de categoría de comerciante + Ciudad del comercio + Código de país del comercio + Nombre del comercio + ID Solicitud + Estado + Transacción + Importe de la transacción + Hash de la transacción + Solicitud de transacción + Estado de la transacción + Tipo + Impugnar esta transacción + Desbloquear + Escanee su tarjeta para desbloquear el acceso + Desbloqueo necesario Elija cómo agregar su billetera + Escanee su tarjeta o anillo Tangem para restaurarlo o importarlo desde otra billetera. + Crear una billetera de hardware + ¿Quiere comprar una  Billetera Tangem? + Importar seed phrase + Restaure su billetera en su teléfono o impórtela desde otra aplicación: cómodo, pero menos seguro que una tarjeta Tangem. + ¿Qué elegir? La blockchain está Inaccesible. Inténtelo más tarde Escanee la tarjeta o el anillo Esta billetera ya ha sido activada anteriormente.\nSi no fue usted quien lo hizo, comuníquese con el servicio de asistencia.\nTangem nunca vende billeteras con un código de acceso pre generado. @@ -1525,6 +1728,8 @@ Tarjeta/anillo incorrecta (o) seleccionada en Tangem App Error al crear la transacción a partir de los datos de la dApp. Código: %s Hemos encontrado un error desconocido. Mensaje de error: %d. Si el problema persiste, contacte con nuestro soporte + Transacción en varias partes + Para que se procese correctamente, su transacción se dividirá en varias partes. Tendrá que tocar su tarjeta varias veces para completarla. No hay sesiones abiertas de WalletConnect ¡Qué lástima! No hay sesiones. Error al emparejar la sesión de WalletConnect: %1$s @@ -1536,11 +1741,22 @@ Esta tarjeta no se puede usar para establecer una sesión de WalletConnect Esta red no es compatible. Por favor, seleccione otra red. Seleccione una red + La transacción se está procesando. Toque su tarjeta varias veces para completarla. + Transacción en curso Sesiones de WalletConnect Conectar a dApps WalletConnect La conexión puede tardar unos segundos. Crear una billetera Tangem + Desde %s + Compre Tangem Wallet, un dispositivo físico que almacena de forma segura su clave privada sin conexión a internet. + Billetera de hardware + Crea una billetera segura en su teléfono en segundos. + Billetera Móvil + ¿Qué elegir? + ¿Ya está usando una Billetera Tangem? + Escanear ahora + Elija un método de configuración de billetera ¿Quiere comprar Tangem Wallet? Comprar ahora Recuperar una billetera existente mediante copia de seguridad de Google Drive @@ -1607,6 +1823,7 @@ Esto puede suceder porque el proveedor actualmente no puede operar con el par que usted seleccionó. Espere un momento e inténtelo de nuevo. (Código %s) El par seleccionado no está disponible temporalmente Algunos proveedores no están autorizados por la Autoridad de Conducta Financiera del Reino Unido. Debe evitar tratar con ellos. + Lista de advertencias de la FCA Servicio no disponible temporalmente La cantidad de tokens a intercambiar no debe exceder %s El monto a cambiar debe ser de al menos %s diff --git a/core/res/src/main/res/values-fr/strings.xml b/core/res/src/main/res/values-fr/strings.xml index 16ebbde2fe..58a8d7eb70 100644 --- a/core/res/src/main/res/values-fr/strings.xml +++ b/core/res/src/main/res/values-fr/strings.xml @@ -16,6 +16,52 @@ Définissez un code d\'accès à %s chiffres pour déverrouiller votre portefeuille. Créer un code d\'accès Code d\'accès + Vous ne pouvez pas créer plus de %1$s comptes. Archivez-en un pour en ajouter un nouveau. + Impossible d\'ajouter un nouveau compte + Compte archivé + Comptes archivés + Récupérer + Vous êtes sur le point de récupérer « %1$s ». + Récupérer le compte + Vous avez atteint la limite de 20 comptes actifs. Archivez un compte pour récupérer celui-ci. + Impossible de récupérer le compte + Archivé + Nous n\'avons pas pu archiver le compte. Veuillez réessayer plus tard. + Ce compte participe au programme de parrainage. + Ce compte ne peut pas être archivé. + Nous n\'avons pas pu créer de compte. Veuillez réessayer plus tard. + Compte créé + Compte archivé + Archives + Vous archivez ce compte, mais vous pouvez toujours le récupérer. + Archivage... + Compte + Impossible de modifier le compte + Compte enregistré + Compte pour les récompenses + Compte n° %s — utilisé pour la dérivation d\'adresse. + Ajouter un compte + Enregistrer + Nom du compte + Nom de compte déjà utilisé + Compte + Nouveau compte + Ajouter un compte + Modifier le compte + Veuillez réessayer plus tard. Si le problème persiste, contactez le service d\'assistance et nous vous aiderons à le résoudre. + %1$s dans %2$s + Compte principal + Vous avez déjà dépassé la limite de %1$s comptes actifs. Archivez-en un pour en récupérer un autre. + Impossible de récupérer le compte + Compte récupéré + Appuyez longuement sur un compte pour réorganiser les comptes. + Continuer à modifier + Supprimer + Êtes-vous sûr de vouloir supprimer le nouveau compte ? + Êtes-vous sûr de vouloir supprimer les modifications ? + Modifications non enregistrées + Certains jetons personnalisés seront automatiquement déplacés de « %1$s » vers « %2$s », car leur dérivation appartient à ce compte. + Certains jetons personnalisés seront automatiquement déplacés. Jeton non trouvé dans votre portefeuille ? Consultez les marchés pour le trouver et l\'ajouter à l\'achat Jeton non trouvé dans votre portefeuille ? Consultez les marchés pour le trouver et l\'ajouter à la vente Vendre @@ -51,14 +97,17 @@ Avez-vous des difficultés à scanner votre carte ? Cette carte n\'est pas conçue pour fonctionner avec Tangem Définissez d\'abord un code d\'accès pour activer la biométrie. + Utilisez %1$s pour déverrouiller votre portefeuille et approuver les actions sensibles, telles que la signature de transactions. Pour les portefeuilles matériels, une carte ou une bague est toujours nécessaire pour signer. Frais par défaut Activez les frais par défaut pour définir automatiquement les frais de transaction et ignorer la page Frais lors de l\'envoi de fonds. Vous pouvez toujours revenir sur cette page si nécessaire. Accédez aux paramètres pour activer l\'authentification biométrique dans l\'application Tangem Activer l\'authentification biométrique + La désactivation de %1$s vous obligera à saisir votre code d\'accès pour déverrouiller l\'application et interagir avec votre portefeuille. Le code d\'accès à votre portefeuille vous sera demandé ultérieurement afin que nous puissions le stocker en toute sécurité pour une utilisation future. Cela supprimera tous les codes d\'accès des portefeuilles enregistrés. Toute opération ultérieure avec le portefeuille nécessitera la soumission du code d\'accès. La suppression de la carte enregistrée supprime de l\'application tous les portefeuilles enregistrés et leurs codes d\'accès. Cela supprimera tous les codes d\'accès enregistrés pour le portefeuille. Toute interaction ultérieure avec le portefeuille nécessitera la saisie du code d\'accès. + Code d\'accès requis Cette option désactive la biométrie pour les actions sensibles. Vous devrez saisir votre code d\'accès à chaque fois que vous signerez une transaction. Enregistrer le code d\'accès L\'authentification biométrique sera demandée à la place du code d\'accès pour les interactions avec votre carte. @@ -72,6 +121,11 @@ Ajouter un wallet Sélectionnez un wallet pour vous connecter Heureux de te revoir! + + %d carte + %d cartes + + Mobile Wallet Vous avez sauvegardé votre portefeuille avec succès. Ces mots ne peuvent pas être récupérés en cas de perte. Assurez-vous de les conserver en lieu sûr. Sauvegarde terminée @@ -332,6 +386,7 @@ Fourniture Impossible de charger les données… Je comprends + Je comprends, continuer. Il y avait une erreur. Veuillez réessayer. Inaccessible Unstakez @@ -343,6 +398,7 @@ Mode Rendement Adresse du contrat copiée ! Réseaux disponibles + Jeton ajouté au compte %1$s Adresse du contrat L\'adresse du contrat n\'est pas valide Veuillez sélectionner le réseau @@ -404,6 +460,7 @@ Erreur WalletConnect Vous avez utilisé une carte d\'un autre portefeuille. Appuyez sur la carte associée à ce portefeuille Pas assez de fonds pour la transaction. Veuillez recharger votre compte. + Échangez n\'importe quel actif de votre portefeuille contre ce jeton. Mes jetons Vous n\'avez pas encore ajouté de jetons. Ajoutez des jetons via Market pour effectuer une échange Ne peut pas être échangé contre %s @@ -442,6 +499,7 @@ En attente du dépôt En attente du dépôt Remboursé + En attente de remboursement Transfert à votre compte En cours d\'envoi Envoyé @@ -459,6 +517,7 @@ Meilleur taux Liste d’avertissement de la FCA Meilleur choix + Fournisseur figurant sur la liste d\'avertissement de la FCA Disponible jusqu\'à %s Disponible à partir de %s Indisponible pour cette paire @@ -477,6 +536,12 @@ ID : %s ID de transaction copié Convertissez une de vos devises en une autre + Une vitesse plus élevée signifie une confirmation plus rapide et des frais de réseau plus élevés. %s + Choisissez la vitesse + Choisissez le token à utiliser pour payer les frais de réseau. %s + Choisissez un token + Marché et actualités + Tendances actuelles Les informations suivantes sont facultatives. Vous pouvez les effacer si vous ne souhaitez pas les partager. Dites-nous quelles fonctions vous manquent, et nous essaierons de vous aider. Veuillez nous dire quelle carte vous avez @@ -629,6 +694,7 @@ Le jeton sélectionné n\'est actuellement pas disponible pour des actions dans le portefeuille crypto. Mais ne vous inquiétez pas, vous pouvez exprimer votre intérêt en votant positivement. Vote positif Le portefeuille ne prend pas en charge plus d\'un réseau + À propos de la crypto Pour acheter, échanger ou recevoir cet actif, ajoutez-le à votre portefeuille Cet actif n\'est pas pris en charge dans le portefeuille Cet actif n\'est pas disponible pour ce portefeuille @@ -664,8 +730,10 @@ Meilleurs Gagnants Top Perdants Tendances + Mode rendement Le staking est le moyen le plus simple de recevoir des récompenses sur votre crypto. %s Gagnez jusqu\'à %s APY + Jeton ajouté À propos de %s %d échange @@ -736,6 +804,21 @@ Activer le mode rendement Vous devez effectuer la mise à jour %1$s afin de créer un portefeuille mobile. Le portefeuille mobile nécessite %1$s ou une version supérieure. + Toutes les actualités + Like + + Il y a %dh + Il y a %dh + + + Il y a %d minute + Il y a %d minutes + + Récapitulatif rapide + Actualités similaires + Tokens associés + Sources + Restez informé NFC n\'est pas disponible sur votre appareil À propos des NFT Actif NFT @@ -841,20 +924,22 @@ Générer des clés de manière privée Votre carte est activée et prête à être utilisée Succès ! + Votre portefeuille est configuré et prêt à être utilisé ! Dans ce cas, vous devrez recommencer depuis le début. Voulez-vous quitter le processus d\'activation ? Initialisation en cours Un autre portefeuille a déjà été créé sur la carte que vous essayez d\'ajouter. Si vous avez des fonds dans ce portefeuille, veuillez les retirer, puis réinitialiser cette carte et l\'ajouter comme sauvegarde. Enregistrer votre portefeuille Sauvegarde en cours + Biométrie En savoir plus sur les seed phrases - + Vide Écrivez ces %d mots dans l\'ordre indiqué ci-dessous et conservez-les dans un endroit sûr et secret. Votre seed phrase - + Vide %d mots Pour importer votre portefeuille, entrez votre seed phrase dans le champ ci-dessous @@ -900,6 +985,7 @@ Restauration du code d\'accès Cartes identiques Code d\'accès + Toutes les offres Disponible avec %s L\'achat de crypto-monnaies sur Tangem est assuré par des fournisseurs tiers selon leurs conditions. Recherche par pays @@ -907,13 +993,26 @@ Autres devises Devises Fiats Populaires Recherche par devise + Cette transaction a déjà été traitée. Aucune autre action n\'est requise. + Recherche des meilleurs tarifs... + Instantané En utilisant la fonctionnalité onramp, vous acceptez %1$s et %2$s du fournisseur + Le service est fourni par un prestataire externe. Tangem n\'est pas responsable. Le montant de l\'achat ne doit pas dépasser %s Le montant à acheter doit être au moins %s Aucun fournisseur disponible pour cette devise + Le plus rapide Payer avec + Mode de paiement Disponible jusqu\'à %s Disponible à partir de %s + + %d fournisseur + %d fournisseurs + + Fournisseurs + Récemment utilisé + Recommandé Vous pourrez finaliser votre transaction sur le fournisseur tiers, %s Redirection vers %s... Nos services ne sont pas disponibles dans ce pays @@ -922,8 +1021,18 @@ Veuillez sélectionner le bon pays pour garantir des options de paiement et des services précis. Paramètres Vous pouvez vérifier l\'état de la transaction à partir de la page du jeton. + + jusqu\'à %d jour + jusqu\'à %d jours + + %s min + Disponible auprès de + Disponible jusqu\'à + Vous obtenez Vous pouvez vérifier l\'état de la transaction à partir de la page du jeton + Jusqu\'à Via + Vous paierez Grouper Par solde Organiser les jetons @@ -947,6 +1056,7 @@ Envoyez uniquement %s à cette adresse. L\'envoi de toute autre devise entraînera sa perte irréversible. Envoyez uniquement %1$s sur le réseau %2$s Transférez des fonds depuis un autre portefeuille ou une autre bourse + Adresse pour les récompenses Participer Échec du chargement des informations sur le programme de parrainage. Veuillez réessayer plus tard. Échec du chargement des informations sur le programme de parrainage. Code d\'erreur : %s. Veuillez réessayer plus tard. @@ -979,8 +1089,13 @@ Réinitialiser la carte Je comprends qu\'après avoir effectué cette action, je n\'aurai plus accès au portefeuille actuel Je comprends que je ne peux pas utiliser cette carte pour récupérer mon code d\'accès sur les autres cartes du portefeuille actuel + Je comprends que je perdrai complètement l\'accès à ma carte Tangem Pay et à tous les fonds qui s\'y trouvent, sans possibilité de récupération. La réinitialisation aux paramètres d\'usine supprimera complètement le portefeuille de la carte sélectionnée. Vous ne pourrez pas restaurer le portefeuille actuel ni utiliser la carte pour récupérer le code d\'accès. La réinitialisation aux paramètres d\'usine supprimera complètement le portefeuille de la carte sélectionnée et le supprimera de l\'application. Vous ne pourrez pas restaurer le portefeuille actuel. + Tous les appareils Tangem ont été réinitialisés. + Une erreur s\'est produite lors du processus d\'activation. Veuillez réinitialiser les cartes une par une. + Échec de la vérification de la carte + Veuillez réinitialiser l\'appareil suivant pour continuer. Les propriétaires du Tangem Ring ont droit à 3 swap gratis sur Changelly jusqu\'au 15/11 ! Échangez avec 0 % de frais ! Les appareils disposant d\'un accès root sont considérés comme moins sécurisés. Vos données peuvent être exposées à des risques supplémentaires. @@ -1126,14 +1241,18 @@ Nom Faites travailler votre jeton pour vous Pour commencer à staker, votre compte TON doit être activé avec une transaction de 1 TON. Les fonds restent sur votre compte, car cette étape sert uniquement à l\'activer pour le staking. + Les frais de réseau ont changé. Veuillez vérifier le nouveau montant avant de continuer. + Frais de réseau mis à jour Le montant à staker doit être au moins %s Le montant du staking sera arrondi à %1$s TRX en raison des règles du réseau. Le montant d\'annulation du staking sera arrondi à %1$s TRX en raison des règles du réseau. + TAEG %1$s%% Réclamation déstakée Frais de staking du compte Un compte de staking est un compte spécial où sont stockés les jetons SOL stakés. Il est créé lorsque vous déléguez vos jetons à un validateur pour participer à la validation des transactions et gagner des récompenses. Des frais minimes sont facturés pour la création du compte de staking, qui sont restitués une fois le staking terminé. Pourcentage de rendement annuel APR : Montre le taux d’intérêt que vous pourriez gagner en un an sans capitalisation. Les intérêts gagnés ne sont pas ajoutés à votre solde, donc vous ne gagnez pas d’intérêts supplémentaires dessus. + Taux de rendement annuel APY : Montre le total des intérêts que vous pourriez gagner en un an avec capitalisation. La capitalisation signifie que les intérêts gagnés sont ajoutés à votre solde, et vous gagnez également des intérêts sur ces intérêts. APR APY @@ -1162,6 +1281,7 @@ Le réseau facturera des frais d’approbation de jeton pour vérifier que vous autorisez l’utilisation de votre jeton pour le jalonnement. En utilisant la fonctionnalité de staking, vous acceptez les %1$s et %2$s du fournisseur Bloqué + Montant maximal : %s Migrer Native staking Aucun validateur actif n\'est disponible pour le staking pour le moment. Veuillez réessayer plus tard. @@ -1290,6 +1410,7 @@ Erreur d\'estimation des frais. Veuillez envoyer vos commentaires à l\'équide de support. Vous échangez Échanger ce montant de jetons sélectionnés aura un impact significatif sur les prix et réduira votre résultat. + Impact élevé sur les prix Fonds insuffisants Donner l\'autorisation Échanger @@ -1312,6 +1433,7 @@ Votre carte est gelée. Obtenir de l\'aide Autre + Impossible à utiliser sur les appareils rootés Terminé Refusé En attente @@ -1324,6 +1446,8 @@ Échec du dégel de la carte. Réessayez plus tard. Votre carte est dégelée. Retrait + Impossible à utiliser sur un appareil rooté + Annuler KYC Ajouter des fonds Options de recharge Numéro de carte @@ -1351,19 +1475,24 @@ Tout est prêt ! Votre carte est prête à l\'emploi. Ajouter une carte à Google Pay Ajouter la carte à Apple Pay + code PIN Partagez votre adresse ou montrez le QR code + Problèmes techniques détectés. Veuillez réessayer plus tard ou contacter le service d\'assistance. Réception indisponible pour le moment Révéler Afficher les détails Échangez n\'importe quel actif de votre portefeuille contre une carte Détails de la carte Dégeler la carte + Revenez à l\'application si vous l\'oubliez. + Votre code PIN Retirer Retrait indisponible pour le moment Vous ne pouvez pas lancer d\'échange ou de nouveau retrait tant que le retrait actuel n\'est pas terminé. Retrait en cours Modifier le code PIN Revenez dans l\'application si vous l\'oubliez. + Je comprends que je perdrai complètement l\'accès à ma carte Tangem Pay et à tous les fonds qui s\'y trouvent, sans possibilité de récupération. Échec de l\'émission de la carte Une erreur technique s\'est produite, veuillez réessayer en cliquant sur le bouton ci-dessous Une erreur technique s\'est produite, veuillez contacter le support @@ -1375,11 +1504,14 @@ Émission de votre carte Nous préparons votre carte. Cela peut prendre un peu de temps. Tangem Pay + Confirmer l\'annulation + Êtes-vous sûr de vouloir interrompre le processus KYC ? Vous pouvez y revenir à tout moment. Nous n\'avons pas pu vérifier votre profil. Pour toute question, veuillez contacter le support. Malheureusement, nous n\'avons pas pu vérifier votre identité KYC en cours Voir le statut KYC en cours pour Tangem Pay + Utilisez les boutons ci-dessous pour consulter votre statut KYC actuel ou l\'annuler. Obtenez votre carte virtuelle Tangem Visa gratuite Utilisez USDC pour les paiements quotidiens Obtenir la carte @@ -1396,7 +1528,9 @@ 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. + Définir le \ncode PIN Synchronisation requise + Restaurer l\'accès Utilisez USDC pour les paiements quotidiens Tangem Pay est temporairement indisponible Tangem Pay @@ -1408,6 +1542,7 @@ Annuler Cette opération est actuellement indisponible. Veuillez réessayer plus tard. L\'achat de %s n\'est pas pris en charge par les fournisseurs actuels mais nous travaillons à ajouter davantage d\'options. + L\'action n\'est pas disponible pour les jetons personnalisés. Vous n\'avez pas de fonds à vendre. Renflouez votre compte pour pouvoir vendre des fonds à partir de celui-ci. Vous n\'avez pas de fonds à envoyer. Renflouez votre compte pour pouvoir envoyer des fonds à partir de celui-ci. Die Daten wurden noch nicht geladen. Dies kann einige Sekunden dauern. Bitte versuchen Sie es später noch einmal. @@ -1443,6 +1578,7 @@ Adresses multiples L\'historique des transactions n\'est actuellement pas pris en charge pour cette blockchain. Mais ne vous inquiétez pas, nous y travaillons ! En attendant, vous pouvez le vérifier dans l\'explorateur. Opération + pour : %s de : %s à : %s validateur : %s @@ -1489,26 +1625,71 @@ Renommer le portefeuille Tout déverrouiller Tout déverrouiller avec %s + AML vérifié + Disponible + Bloqué + Dette + Limites + Autre (sans mot de passe) + Transaction unique + Total disponible pour %d jour disponible pour %d jours + Le solde disponible correspond aux fonds réellement disponibles, en tenant compte des transactions en attente, des montants bloqués et du solde débiteur afin d\'éviter les découverts. + Disponible jusqu\'au %1$s Soldes et Limites + Informations de paiement manquantes. Veuillez contacter le service d\'assistance. + Impossible de charger les informations relatives au jeton + Les informations sont en cours de chargement, veuillez patienter. + Des limites sont nécessaires pour contrôler les coûts, améliorer la sécurité et gérer les risques. Vous pouvez dépenser %1$s pendant la période pour les paiements par carte dans les magasins et %2$s pour les autres transactions, par exemple les abonnements ou les dettes. Le code d\'accès sera utilisé pour gérer votre compte de paiement et le protéger contre tout accès non autorisé. Code d\'accès + Activation du compte + Veuillez choisir le portefeuille avec lequel vous avez commencé le processus d\'inscription afin de signer la transaction pour créer votre compte sur la blockchain. + Annuler l\'activation Êtes-vous sûr de vouloir quitter ? Vous pourrez reprendre plus tard là où vous vous étiez arrêté. Cela ne prendra pas longtemps. Nous configurons votre compte. Cela ne prendra pas longtemps. Nous terminons l\'activation. Tout est en cours de préparation ! + Autre portefeuille Créez un code à 4 chiffres. Il servira pour les paiements. + code PIN Créer un code PIN Le code PIN n\'a pas été accepté. Veuillez réessayer ou utiliser un autre code. Code PIN invalide : évitez les séquences ou les répétitions + Vous êtes prêt à partir ! + Préparez la carte Tangem et appuyez pour approuver. + Préparez votre Tangem Wallet + Vous pourrez terminer votre connexion \n sur le site Web tiers \n et revenir à l\'application Tangem. Accéder le site Web + Connexion au portefeuille + Choisissez un portefeuille + Continuer l\'activation Continuons la configuration de votre compte. Content de vous revoir ! + Lancer l\'activation Suivez les étapes pour configurer votre compte. Bienvenue ! + Montant de la blockchain + Code monétaire + Date + Code d\'erreur + Détails de la transaction + Code de catégorie de commerçant + Cité marchande + Code pays du commerçant + Nom du commerçant + Identifiant de la demande + Statut + Transaction + Montant de la transaction + Hash de la transaction + Demande de transaction + Statut de la transaction + Type + Contester cette transaction Déverrouiller Scannez votre carte pour déverrouiller l\'accès Déverrouillage nécessaire @@ -1533,6 +1714,8 @@ Mauvaise carte/bague sélectionnée dans le Tangem App Échec de la création de la transaction à partir des données de la Dapp. Code: %s Nous avons rencontré une erreur inconnue. Code d\'erreur : %d. Si le problème persiste, n\'hésitez pas à contacter notre support + Transaction en plusieurs parties + Pour que le traitement soit effectué correctement, votre transaction sera divisée en plusieurs parties. Vous devrez passer votre carte plusieurs fois pour la finaliser. Aucune session WalletConnect ouverte Oups. Aucune session. Échec de l\'appairage de la session WalletConnect : %1$s @@ -1544,11 +1727,22 @@ Cette carte ne peut pas être utilisée pour établir une session WalletConnect Ce réseau n\'est pas pris en charge. Veuillez sélectionner un autre réseau. Sélectionnez un réseau + La transaction est en cours de traitement. Veuillez taper plusieurs fois votre carte pour la terminer. + Transaction en cours Sessions WalletConnect Se connecter aux dApps WalletConnect La connexion peut prendre quelques secondes Créer un Tangem Wallet + À partir de %s + Achetez Tangem Wallet, un dispositif physique qui stocke votre clé privée hors ligne en toute sécurité. + Hardware Wallet + Créez un portefeuille sécurisé sur votre téléphone en quelques secondes. + Mobile Wallet + Quoi choisir ? + Vous utilisez déjà un Tangem Wallet ? + Scanner maintenant + Choisissez une méthode de configuration du portefeuille Vous souhaitez acheter le Tangem Wallet ? Acheter maintenant Récupérer un portefeuille existant via la sauvegarde Google Drive @@ -1727,6 +1921,7 @@ Connexions Contenu Copier les données + Allocation personnalisée dApp déconnectée Déconnecter tout Toutes les sessions dApp seront déconnectées. Votre portefeuille ne sera plus lié à aucune dApp. @@ -1739,6 +1934,8 @@ La proposition de connexion a expiré Modifications estimées du portefeuille La transaction n\'a pas pu être simulée. Veuillez procéder avec prudence. + L\'estimation n\'est pas prise en charge pour %s. + Suggéré par %s Rechargez votre solde pour couvrir les frais de réseau. %1$s Insuffisant Transaction malveillante @@ -1752,6 +1949,7 @@ Risque de sécurité connu Ouvrez l\'application Web3 et sélectionnez l\'option WalletConnect. Demande de + Signer quand même Type de signature Au moins un réseau est requis pour la connexion à une dApp. Spécifier les réseaux sélectionnés @@ -1760,7 +1958,10 @@ Demande de transaction Demande de transaction Montant illimité + Assurez-vous que chaque tentative d\'appairage utilise un URI unique et nouveau. + URI déjà utilisé WalletConnect + Transaction suspecte Vous avez déjà un portefeuille Tangem ? Des milliers d\'actifs Le meilleur hardware wallet de sa catégorie diff --git a/core/res/src/main/res/values-ru/strings.xml b/core/res/src/main/res/values-ru/strings.xml index aa04e8ffcf..2f51bfad1e 100644 --- a/core/res/src/main/res/values-ru/strings.xml +++ b/core/res/src/main/res/values-ru/strings.xml @@ -546,6 +546,7 @@ ID: %s ID транзакции скопирован Обменяйте любой актив в вашем портфеле на этот токен + Выбрать токен Рынок и Новости В тренде Информация ниже не является обязательной. Вы можете стереть её, если хотите. @@ -602,7 +603,7 @@ Создать новый кошелек Повысьте уровень безопасности с помощью продвинутого аппаратного кошелька Tangem. Аппаратный кошелёк - Перенести текущий кошелёк в Tangem Wallet. + Перенесите свой текущий кошелек в холодный кошелек Tangem. Улучшить текущий кошелёк Перейти к бэкапу Пожалуйста, создайте резервную копию вашего кошелька перед установкой кода доступа. @@ -627,7 +628,7 @@ Вы уверены, что хотите выполнить эту операцию? Забыть кошелек Перейти к резервному копированию - Посмотреть резервное копирование + Показать фразу восстановления Забыть кошелек Забыть всё равно Резервная копия этого кошелька существует. Проверьте её перед удалением, чтобы убедиться, что сможете восстановить кошелёк позже. @@ -1479,6 +1480,7 @@ Карта разморожена Вывести Запрещено использовать на root-устройствах + Отменить KYC Пополнить Способы пополнения Номер @@ -1534,6 +1536,8 @@ Выпускаем карту Выпускаем карту, это займет немного времени. Tangem Pay + Подтвердите отмену + Если вы отмените KYC сейчас, вы сможете потом начать его заново Не удалось подтвердить ваш профиль. Если у вас есть вопросы, обратитесь в службу поддержки. К сожалению, нам не удалось подтвердить вашу личность KYC в процессе @@ -1659,7 +1663,9 @@ Установить ПИН-код ПИН не принят. Попробуйте ещё раз или введите другой код. Слабый ПИН: не используйте повторы или последовательности. + Код валюты Разблокировать + Отсканируйте свою карту, чтобы разблокировать доступ Выберите тип кошелька Отсканируйте вашу карту или кольцо Tangem, чтобы восстановить её или импортировать из другого кошелька. Создать аппаратный кошелёк @@ -1740,8 +1746,8 @@ Откройте Tangem Wallet Код доступа защищает кошелёк и нужен для входа и подписания транзакций. Установить/изменить код доступа - Изменить Код Доступа - Получайте уведомления о входящих транзакциях в кошельке и обновлениях Tangem. + Изменить код доступа + Получайте push-уведомления о входящих транзакциях в кошелек. В настоящий момент push-уведомления могут не работать на устройствах Huawei. Мы уже работаем над решением этой проблемы и планируем исправление в ближайших обновлениях. Спасибо за понимание! Уведомления о транзакциях Установить Код Доступа @@ -1781,6 +1787,7 @@ Сумма получения не может быть менее %s Это может произойти из-за того, что провайдер временно не предоставляет обмен выбранной вами пары. Пожалуйста, подождите некоторое время и попробуйте снова. (Код %s) Выбранная пара временно недоступна + Предупреждающий список FCA Сервис временно недоступен Сумма для обмена должна быть не более %s Сумма для обмена должна быть не менее %s 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 016bb09e5e..fbf1149a65 100644 --- a/core/res/src/main/res/values-uk-rUA/strings.xml +++ b/core/res/src/main/res/values-uk-rUA/strings.xml @@ -607,7 +607,7 @@ Створити новий гаманець Підвищіть рівень своєї безпеки за допомогою просунутого апаратного гаманця Tangem. Апаратний гаманець - Перенесіть свій поточний гаманець у Tangem. + Перетворіть поточний гаманець на холодний гаманець Tangem. Оновіть поточний гаманець Перейти до бекапу Будь ласка, створіть резервну копію свого гаманця, перш ніж створювати код доступу. @@ -1767,7 +1767,7 @@ Цей код доступу захищає ваш гаманець і використовується для входу та підписання транзакцій. Встановити/Змінити код доступу Змінити код доступу - Отримуйте сповіщення про вхідні транзакції в гаманці та оновлення Tangem. + Отримуйте сповіщення про вхідні транзакції в гаманці. Push-повідомлення наразі можуть не працювати на пристроях Huawei. Ми активно працюємо над розв\'язанням цієї проблеми та плануємо випустити виправлення в наступному оновленні. Дякуємо за розуміння! Сповіщення про транзакції Встановити код доступу diff --git a/core/res/src/main/res/values/strings.xml b/core/res/src/main/res/values/strings.xml index 4833e76320..d5b33d94e7 100644 --- a/core/res/src/main/res/values/strings.xml +++ b/core/res/src/main/res/values/strings.xml @@ -539,9 +539,9 @@ ID: %s Transaction ID copied Swap any asset in your portfolio for this token - Higher speed means faster confirmation and a higher network fee. %s + Higher speed means faster confirmation\nand a higher network fee. %s Choose speed - Choose which token to use to pay the network fee. %s + Choose which token to use to pay\nthe network fee. %s Choose token Market & News Tangem AI @@ -600,7 +600,7 @@ Create new wallet Level up your security with the superior Tangem hardware wallet. Hardware wallet - Move your current wallet into Tangem. + Convert your current mobile wallet into a Tangem cold wallet. Upgrade current wallet Go to backup Please back up your wallet before creating an access code. @@ -625,7 +625,7 @@ Are you sure you want to do this? Forget wallet Go to backup - View backup + View recovery phrase Forget wallet Forget anyway This wallet has a backup. Ensure you can recover it before forgetting the wallet. @@ -1264,6 +1264,7 @@ APR APY Rewards automatically accumulate in your staking balance daily. + Rewards are compounded to your staking balance. Funds earned: %s Available Average Reward Rate How Staking Works? @@ -1516,10 +1517,15 @@ Are you sure you want to stop the KYC process? You can return to it anytime. We could not verify your profile. If you have any questions, please contact support. Unfortunately, we couldn\'t verify your identity + KYC has failed KYC in progress View Status KYC in progress for Tangem Pay Use the buttons below to view your current KYC status or cancel it. + KYC rejected + Hide KYC block + Sorry, we couldn\'t verify + your profile. Get your free Tangem Visa virtual card Use USDC for everyday payments Get card @@ -1783,7 +1789,7 @@ This access code protects your wallet and is used to log in and sign transactions. Set/Change access code Change access code - Stay notified on wallet incoming transactions and Tangem updates. + Get push notifications for incoming wallet transactions. Push notifications may currently not work on Huawei devices. We\'re actively working on a solution and will release a fix in an upcoming update. Thank you for your understanding! Transaction notifications Set access code diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/bottomsheets/message/MessageBottomSheetV2.kt b/core/ui/src/main/java/com/tangem/core/ui/components/bottomsheets/message/MessageBottomSheetV2.kt index 7b3ab2dd0b..ab89d9ede7 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/components/bottomsheets/message/MessageBottomSheetV2.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/components/bottomsheets/message/MessageBottomSheetV2.kt @@ -27,6 +27,7 @@ import com.tangem.core.ui.components.buttons.common.TangemButtonIconPosition import com.tangem.core.ui.components.buttons.common.TangemButtonsDefaults import com.tangem.core.ui.components.icons.HighlightedIcon import com.tangem.core.ui.extensions.TextReference +import com.tangem.core.ui.extensions.resolveAnnotatedReference import com.tangem.core.ui.extensions.resolveReference import com.tangem.core.ui.res.TangemTheme import com.tangem.core.ui.res.TangemThemePreview @@ -109,7 +110,7 @@ private fun ContentContainer(state: MessageBottomSheetUMV2.InfoBlock, modifier: modifier = Modifier .fillMaxWidth() .padding(top = TangemTheme.dimens.spacing8), - text = body.resolveReference(), + text = body.resolveAnnotatedReference(), style = TangemTheme.typography.body2, color = TangemTheme.colors.text.secondary, textAlign = TextAlign.Center, diff --git a/core/ui/src/main/java/com/tangem/core/ui/extensions/TextReference.kt b/core/ui/src/main/java/com/tangem/core/ui/extensions/TextReference.kt index 9997470e8c..e771427974 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/extensions/TextReference.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/extensions/TextReference.kt @@ -14,11 +14,8 @@ import androidx.compose.runtime.Immutable import androidx.compose.runtime.ReadOnlyComposable import androidx.compose.ui.Modifier import androidx.compose.ui.platform.LocalUriHandler -import androidx.compose.ui.text.AnnotatedString +import androidx.compose.ui.text.* import androidx.compose.ui.text.AnnotatedString.Builder -import androidx.compose.ui.text.LinkAnnotation -import androidx.compose.ui.text.buildAnnotatedString -import androidx.compose.ui.text.withLink import androidx.compose.ui.tooling.preview.Preview import androidx.compose.ui.tooling.preview.PreviewParameter import androidx.compose.ui.tooling.preview.PreviewParameterProvider @@ -399,6 +396,7 @@ private fun createStyledText( link = LinkAnnotation.Clickable( tag = text, linkInteractionListener = { onClick() }, + styles = TextLinkStyles(style = spanStyleReference()), ), block = { appendStyled( diff --git a/core/ui/src/main/res/drawable/ic_heart_broken_32.xml b/core/ui/src/main/res/drawable/ic_heart_broken_32.xml new file mode 100644 index 0000000000..2d9d8aad75 --- /dev/null +++ b/core/ui/src/main/res/drawable/ic_heart_broken_32.xml @@ -0,0 +1,9 @@ + + + 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 d877f0f1f3..aac0e1c218 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 @@ -29,7 +29,9 @@ import java.util.concurrent.ConcurrentHashMap import javax.inject.Inject private const val VALID_STATUS = "valid" -private const val APPROVED_KYC_STATUS = "APPROVED" +private const val APPROVED_KYC_STATUS = "approved" +private const val IN_PROGRESS_KYC_STATUS = "in_progress" +private const val DECLINED_KYC_STATUS = "declined" private const val TAG = "TangemPay: OnboardingRepository" @Suppress("LongParameterList") @@ -168,8 +170,9 @@ internal class DefaultOnboardingRepository @Inject constructor( ProductInstance(id = instance.id, cardId = instance.cardId, cardFrozenState = cardFrozenState) } return CustomerInfo( + customerId = response?.id, productInstance = productInstance, - isKycApproved = response?.kyc?.status == APPROVED_KYC_STATUS, + kycStatus = getKycStatus(status = response?.kyc?.status), cardInfo = cardInfo, ).also { lastFetchedCustomerInfoMap[userWalletId] = it @@ -236,4 +239,13 @@ internal class DefaultOnboardingRepository @Inject constructor( setHideMainOnboardingBanner(userWalletId) } } + + private fun getKycStatus(status: String?): CustomerInfo.KycStatus { + return when (status?.lowercase()) { + IN_PROGRESS_KYC_STATUS -> CustomerInfo.KycStatus.PENDING + DECLINED_KYC_STATUS -> CustomerInfo.KycStatus.REJECTED + APPROVED_KYC_STATUS -> CustomerInfo.KycStatus.APPROVED + else -> CustomerInfo.KycStatus.INIT + } + } } \ No newline at end of file diff --git a/domain/feedback/models/src/main/kotlin/com/tangem/domain/feedback/models/FeedbackEmailType.kt b/domain/feedback/models/src/main/kotlin/com/tangem/domain/feedback/models/FeedbackEmailType.kt index 81aaaffd7a..1dae5fb656 100644 --- a/domain/feedback/models/src/main/kotlin/com/tangem/domain/feedback/models/FeedbackEmailType.kt +++ b/domain/feedback/models/src/main/kotlin/com/tangem/domain/feedback/models/FeedbackEmailType.kt @@ -84,5 +84,7 @@ sealed interface FeedbackEmailType { ) : Visa() data class FeatureIsBeta(override val walletMetaInfo: WalletMetaInfo) : Visa() + + data class KycRejected(override val walletMetaInfo: WalletMetaInfo, val customerId: String) : Visa() } } \ No newline at end of file diff --git a/domain/feedback/src/main/java/com/tangem/domain/feedback/FeedbackDataBuilder.kt b/domain/feedback/src/main/java/com/tangem/domain/feedback/FeedbackDataBuilder.kt index 00815bea99..d10954f517 100644 --- a/domain/feedback/src/main/java/com/tangem/domain/feedback/FeedbackDataBuilder.kt +++ b/domain/feedback/src/main/java/com/tangem/domain/feedback/FeedbackDataBuilder.kt @@ -54,6 +54,10 @@ internal class FeedbackDataBuilder { builder.appendKeyValue("User Wallet ID", userWalletId) } + fun addCustomerId(customerId: String) { + builder.appendKeyValue("ID: ", customerId) + } + fun addUserWalletMetaInfo(walletMetaInfo: WalletMetaInfo) { builder.appendKeyValue("Mobile Wallet is backed up", walletMetaInfo.hotWalletIsBackedUp?.toString()) builder.appendKeyValue("Card ID", walletMetaInfo.cardId) @@ -116,6 +120,7 @@ internal class FeedbackDataBuilder { is FeedbackEmailType.Visa.Dispute, is FeedbackEmailType.Visa.FeatureIsBeta, is FeedbackEmailType.Visa.Withdrawal, + is FeedbackEmailType.Visa.KycRejected, -> return is FeedbackEmailType.Visa.DisputeV2 -> when (type.item) { is TangemPayTxHistoryItem.Collateral -> "Receive/Withdraw" diff --git a/domain/feedback/src/main/java/com/tangem/domain/feedback/SendFeedbackEmailUseCase.kt b/domain/feedback/src/main/java/com/tangem/domain/feedback/SendFeedbackEmailUseCase.kt index 7bc3d5342a..f1228c50c6 100644 --- a/domain/feedback/src/main/java/com/tangem/domain/feedback/SendFeedbackEmailUseCase.kt +++ b/domain/feedback/src/main/java/com/tangem/domain/feedback/SendFeedbackEmailUseCase.kt @@ -48,6 +48,7 @@ class SendFeedbackEmailUseCase( private fun getAddress(type: FeedbackEmailType): String { return when { + type is FeedbackEmailType.Visa.KycRejected -> PAERA_SUPPORT_EMAIL type.isVisaEmail() -> TANGEM_VISA_SUPPORT_EMAIL type.walletMetaInfo?.isStart2Coin == true -> START2COIN_SUPPORT_EMAIL else -> TANGEM_SUPPORT_EMAIL @@ -95,6 +96,7 @@ class SendFeedbackEmailUseCase( is FeedbackEmailType.Visa.Dispute, is FeedbackEmailType.Visa.DisputeV2, is FeedbackEmailType.Visa.FeatureIsBeta, + is FeedbackEmailType.Visa.KycRejected, -> this is FeedbackEmailType.DirectUserRequest, is FeedbackEmailType.BackupProblem, diff --git a/domain/feedback/src/main/java/com/tangem/domain/feedback/utils/EmailMessageBodyResolver.kt b/domain/feedback/src/main/java/com/tangem/domain/feedback/utils/EmailMessageBodyResolver.kt index 998110b7b7..ec9d994636 100644 --- a/domain/feedback/src/main/java/com/tangem/domain/feedback/utils/EmailMessageBodyResolver.kt +++ b/domain/feedback/src/main/java/com/tangem/domain/feedback/utils/EmailMessageBodyResolver.kt @@ -39,6 +39,7 @@ internal class EmailMessageBodyResolver( is FeedbackEmailType.Visa.DisputeV2 -> addTangemPayDisputeRequestBody(type) is FeedbackEmailType.Visa.Withdrawal -> addTangemPayWithdrawalRequestBody(type) is FeedbackEmailType.Visa.FeatureIsBeta -> addTangemPayBetaRequestBody(type) + is FeedbackEmailType.Visa.KycRejected -> addTangemPayKycRejectedRequestBody(type) } return build() @@ -70,6 +71,12 @@ internal class EmailMessageBodyResolver( } } + private fun FeedbackDataBuilder.addTangemPayKycRejectedRequestBody(type: FeedbackEmailType.Visa.KycRejected) { + addTangemPayPhoneInfoBody(type) + addDelimiter() + addCustomerId(customerId = type.customerId) + } + private suspend fun FeedbackDataBuilder.addTangemPayWithdrawalRequestBody( type: FeedbackEmailType.Visa.Withdrawal, ) { diff --git a/domain/feedback/src/main/java/com/tangem/domain/feedback/utils/EmailMessageTitleResolver.kt b/domain/feedback/src/main/java/com/tangem/domain/feedback/utils/EmailMessageTitleResolver.kt index 03d304ddb7..4064444636 100644 --- a/domain/feedback/src/main/java/com/tangem/domain/feedback/utils/EmailMessageTitleResolver.kt +++ b/domain/feedback/src/main/java/com/tangem/domain/feedback/utils/EmailMessageTitleResolver.kt @@ -27,6 +27,7 @@ internal class EmailMessageTitleResolver(private val resources: Resources) { is FeedbackEmailType.Visa.FailedIssueCard, is FeedbackEmailType.Visa.Withdrawal, is FeedbackEmailType.Visa.FeatureIsBeta, + is FeedbackEmailType.Visa.KycRejected, is FeedbackEmailType.PreActivatedWallet, is FeedbackEmailType.BackupProblem, -> R.string.feedback_preface_support diff --git a/domain/feedback/src/main/java/com/tangem/domain/feedback/utils/EmailSubjectResolver.kt b/domain/feedback/src/main/java/com/tangem/domain/feedback/utils/EmailSubjectResolver.kt index ad9330b4bc..451c9a1beb 100644 --- a/domain/feedback/src/main/java/com/tangem/domain/feedback/utils/EmailSubjectResolver.kt +++ b/domain/feedback/src/main/java/com/tangem/domain/feedback/utils/EmailSubjectResolver.kt @@ -47,6 +47,7 @@ internal class EmailSubjectResolver(private val resources: Resources) { -> "[Visa] [DISPUTE] {auto-filled subject}" is FeedbackEmailType.Visa.Withdrawal -> "[Visa] [WITHDRAWAL] {auto-filled subject}" is FeedbackEmailType.Visa.FeatureIsBeta -> "[VISA] [FEEDBACK]" + is FeedbackEmailType.Visa.KycRejected -> "Tangem Pay - [VISA] [KYC REJECTED]" } } } \ No newline at end of file diff --git a/domain/feedback/src/main/java/com/tangem/domain/feedback/utils/FeedbackConstants.kt b/domain/feedback/src/main/java/com/tangem/domain/feedback/utils/FeedbackConstants.kt index e1ec372cc9..c1bc6d1043 100644 --- a/domain/feedback/src/main/java/com/tangem/domain/feedback/utils/FeedbackConstants.kt +++ b/domain/feedback/src/main/java/com/tangem/domain/feedback/utils/FeedbackConstants.kt @@ -4,4 +4,5 @@ internal const val GMAIL_MAX_FILE_SIZE = 24_900_000 // ≈ 25 MB internal const val START2COIN_SUPPORT_EMAIL = "cardsupport@start2coin.com" internal const val TANGEM_SUPPORT_EMAIL = "support@tangem.com" -internal const val TANGEM_VISA_SUPPORT_EMAIL = "pay@tangem.com" \ No newline at end of file +internal const val TANGEM_VISA_SUPPORT_EMAIL = "pay@tangem.com" +internal const val PAERA_SUPPORT_EMAIL = "support@paera.com" \ No newline at end of file diff --git a/domain/visa/src/main/kotlin/com/tangem/domain/pay/model/CustomerInfo.kt b/domain/visa/src/main/kotlin/com/tangem/domain/pay/model/CustomerInfo.kt index 234366b079..baac6c4f75 100644 --- a/domain/visa/src/main/kotlin/com/tangem/domain/pay/model/CustomerInfo.kt +++ b/domain/visa/src/main/kotlin/com/tangem/domain/pay/model/CustomerInfo.kt @@ -15,11 +15,26 @@ data class MainScreenCustomerInfo( ) data class CustomerInfo( + val customerId: String?, val productInstance: ProductInstance?, - val isKycApproved: Boolean, + val kycStatus: KycStatus, val cardInfo: CardInfo?, ) { + enum class KycStatus { + /** Initial state */ + INIT, + + /** Performing the check */ + PENDING, + + /** SumSub approved */ + APPROVED, + + /** The check failed, documents rejected */ + REJECTED, + } + data class ProductInstance( val id: String, val cardId: String, 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 6cf5c28a6f..33ddcff4c8 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 @@ -128,7 +128,7 @@ class TangemPayMainScreenCustomerInfoUseCase( } .map { customerInfo -> Timber.tag(TAG).i("customerInfo") - if (customerInfo.cardInfo == null && customerInfo.isKycApproved) { + if (customerInfo.cardInfo == null && customerInfo.kycStatus == CustomerInfo.KycStatus.APPROVED) { // If order id wasn't saved -> start order creation and get customer info onboardingRepository.createOrder(userWalletId) } @@ -151,7 +151,12 @@ class TangemPayMainScreenCustomerInfoUseCase( OrderStatus.NEW, OrderStatus.PROCESSING, -> MainScreenCustomerInfo( - info = CustomerInfo(productInstance = null, isKycApproved = true, cardInfo = null), + info = CustomerInfo( + customerId = null, + productInstance = null, + kycStatus = CustomerInfo.KycStatus.APPROVED, + cardInfo = null, + ), orderStatus = orderStatus, ).right() diff --git a/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayOnboardingModel.kt b/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayOnboardingModel.kt index 83700ab313..1c484af706 100644 --- a/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayOnboardingModel.kt +++ b/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayOnboardingModel.kt @@ -13,6 +13,7 @@ import com.tangem.core.decompose.navigation.Router import com.tangem.core.navigation.url.UrlOpener import com.tangem.domain.models.wallet.UserWalletId import com.tangem.domain.pay.TangemPayEligibilityManager +import com.tangem.domain.pay.model.CustomerInfo.KycStatus import com.tangem.domain.pay.repository.OnboardingRepository import com.tangem.domain.pay.usecase.ProduceTangemPayInitialDataUseCase import com.tangem.domain.tangempay.TangemPayAnalyticsEvents @@ -95,7 +96,7 @@ internal class TangemPayOnboardingModel @Inject constructor( .onRight { customerInfo -> uiState.transformerUpdate(TangemPayOnboardingButtonLoadingTransformer(isLoading = false)) when { - !customerInfo.isKycApproved -> { + customerInfo.kycStatus != KycStatus.APPROVED -> { when (params) { is TangemPayOnboardingComponent.Params.ContinueOnboarding -> openKyc(userWalletId) else -> startOnboarding(userWalletId) @@ -171,7 +172,7 @@ internal class TangemPayOnboardingModel @Inject constructor( uiState.transformerUpdate(TangemPayOnboardingButtonLoadingTransformer(isLoading = false)) }, ifRight = { customerInfo -> - if (customerInfo.isKycApproved) { + if (customerInfo.kycStatus == KycStatus.APPROVED) { back() } else { openKyc(userWalletId) diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/WalletComponent.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/WalletComponent.kt index a48d9edade..8d96777c9e 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/WalletComponent.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/WalletComponent.kt @@ -23,6 +23,7 @@ import com.tangem.feature.wallet.child.wallet.model.WalletModel import com.tangem.feature.wallet.navigation.WalletRoute import com.tangem.feature.wallet.presentation.wallet.state.model.WalletDialogConfig import com.tangem.feature.wallet.presentation.wallet.ui.WalletScreen +import com.tangem.feature.wallet.presentation.wallet.ui.components.visa.KycRejectedComponent import com.tangem.feature.walletsettings.component.RenameWalletComponent import com.tangem.features.biometry.AskBiometryComponent import com.tangem.features.feed.entry.components.FeedEntryComponent @@ -126,6 +127,17 @@ internal class WalletComponent @AssistedInject constructor( ), ) } + is WalletDialogConfig.KycRejected -> { + KycRejectedComponent( + appComponentContext = childByContext(componentContext), + params = KycRejectedComponent.Params( + walletId = dialogConfig.walletId, + customerId = dialogConfig.customerId, + callbacks = model.tangemPayKycRejectedCallbacks, + onDismiss = model.innerWalletRouter.dialogNavigation::dismiss, + ), + ) + } } }, ) diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/WalletModel.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/WalletModel.kt index 6759eefd27..2e9816c24a 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/WalletModel.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/WalletModel.kt @@ -39,6 +39,7 @@ import com.tangem.feature.wallet.presentation.wallet.state.model.WalletEvent.Dem import com.tangem.feature.wallet.presentation.wallet.state.model.WalletScreenState import com.tangem.feature.wallet.presentation.wallet.state.transformers.* import com.tangem.feature.wallet.presentation.wallet.state.utils.WalletEventSender +import com.tangem.feature.wallet.presentation.wallet.ui.components.visa.KycRejectedCallbacks import com.tangem.feature.wallet.presentation.wallet.utils.ScreenLifecycleProvider import com.tangem.features.biometry.AskBiometryComponent import com.tangem.features.feed.entry.featuretoggle.FeedFeatureToggle @@ -107,6 +108,7 @@ internal class WalletModel @Inject constructor( ) : Model() { val askBiometryModelCallbacks = AskBiometryModelCallbacks() + val tangemPayKycRejectedCallbacks = TangemPayKycRejectedCallbacks() val askForPushNotificationsModelCallbacks = AskForPushNotificationsCallbacks() val uiState: StateFlow = stateHolder.uiState @@ -769,6 +771,20 @@ internal class WalletModel @Inject constructor( } } + inner class TangemPayKycRejectedCallbacks : KycRejectedCallbacks { + override fun onClickYourProfile(userWalletId: UserWalletId) { + clickIntents.onKycRejectedOpenProfileClicked(userWalletId) + } + + override fun onClickGoToSupport(customerId: String) { + clickIntents.onKycRejectedGoToSupportClicked(customerId) + } + + override fun onClickHideKyc(userWalletId: UserWalletId) { + clickIntents.onKycRejectedHideKycClicked(userWalletId) + } + } + inner class AskForPushNotificationsCallbacks : PushNotificationsModelCallbacks { override fun onAllowSystemPermission() { diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/intents/TangemPayClickIntents.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/intents/TangemPayClickIntents.kt index e7a6f9325e..f157783abb 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/intents/TangemPayClickIntents.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/child/wallet/model/intents/TangemPayClickIntents.kt @@ -1,5 +1,6 @@ package com.tangem.feature.wallet.child.wallet.model.intents +import com.arkivanov.decompose.router.slot.activate import com.tangem.common.routing.AppRoute import com.tangem.core.decompose.di.ModelScoped import com.tangem.core.decompose.ui.UiMessageSender @@ -13,6 +14,7 @@ import com.tangem.core.ui.message.bottomSheetMessage import com.tangem.domain.feedback.GetWalletMetaInfoUseCase import com.tangem.domain.feedback.SendFeedbackEmailUseCase import com.tangem.domain.feedback.models.FeedbackEmailType +import com.tangem.domain.feedback.models.WalletMetaInfo import com.tangem.domain.models.wallet.UserWallet import com.tangem.domain.models.wallet.UserWalletId import com.tangem.domain.pay.TangemPayDetailsConfig @@ -21,6 +23,7 @@ import com.tangem.domain.pay.repository.OnboardingRepository import com.tangem.domain.pay.usecase.ProduceTangemPayInitialDataUseCase import com.tangem.domain.pay.usecase.TangemPayMainScreenCustomerInfoUseCase import com.tangem.feature.wallet.presentation.wallet.state.WalletStateController +import com.tangem.feature.wallet.presentation.wallet.state.model.WalletDialogConfig import com.tangem.feature.wallet.presentation.wallet.state.transformers.TangemPayHideOnboardingStateTransformer import com.tangem.feature.wallet.presentation.wallet.state.transformers.TangemPayRefreshNeededStateTransformer import com.tangem.feature.wallet.presentation.wallet.state.transformers.TangemPayRefreshShowProgressTransformer @@ -38,6 +41,14 @@ internal interface TangemPayIntents { fun onKycProgressClicked(userWalletId: UserWalletId) + fun onKycRejectedClicked(userWalletId: UserWalletId, customerId: String) + + fun onKycRejectedOpenProfileClicked(userWalletId: UserWalletId) + + fun onKycRejectedGoToSupportClicked(customerId: String) + + fun onKycRejectedHideKycClicked(userWalletId: UserWalletId) + fun onIssuingCardClicked() fun onIssuingFailedClicked() @@ -137,6 +148,42 @@ internal class TangemPayClickIntentsImplementor @Inject constructor( uiMessageSender.send(kycInfoBottomSheet) } + override fun onKycRejectedOpenProfileClicked(userWalletId: UserWalletId) { + router.openTangemPayOnboarding( + mode = AppRoute.TangemPayOnboarding.Mode.ContinueOnboarding(userWalletId), + ) + } + + override fun onKycRejectedGoToSupportClicked(customerId: String) { + goToSupportForRejectKyc(customerId) + } + + override fun onKycRejectedHideKycClicked(userWalletId: UserWalletId) { + disableTangemPay(userWalletId) + } + + override fun onKycRejectedClicked(userWalletId: UserWalletId, customerId: String) { + router.dialogNavigation.activate( + configuration = WalletDialogConfig.KycRejected( + walletId = userWalletId, + customerId = customerId, + ), + ) + } + + private fun goToSupportForRejectKyc(customerId: String) { + modelScope.launch { + sendFeedbackEmailUseCase( + type = FeedbackEmailType.Visa.KycRejected( + walletMetaInfo = WalletMetaInfo( + userWalletId = stateHolder.getSelectedWalletId(), + ), + customerId = customerId, + ), + ) + } + } + override fun onIssuingCardClicked() { val issuingBottomSheet = bottomSheetMessage { infoBlock { diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/di/WalletFeatureModule.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/di/WalletFeatureModule.kt index 1a925f467e..913e1262d2 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/di/WalletFeatureModule.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/di/WalletFeatureModule.kt @@ -4,6 +4,7 @@ import com.tangem.core.decompose.model.Model import com.tangem.feature.wallet.DefaultWalletEntryComponent import com.tangem.feature.wallet.child.organizetokens.model.OrganizeTokensModel import com.tangem.feature.wallet.child.wallet.model.WalletModel +import com.tangem.feature.wallet.presentation.wallet.ui.components.visa.KycRejectedModel import com.tangem.feature.wallet.utils.DefaultUserWalletImageFetcher import com.tangem.feature.wallet.utils.DefaultUserWalletsFetcher import com.tangem.features.wallet.WalletEntryComponent @@ -36,6 +37,11 @@ internal interface WalletFeatureModule { @ClassKey(WalletModel::class) fun bindWalletModel(model: WalletModel): Model + @Binds + @IntoMap + @ClassKey(KycRejectedModel::class) + fun bindKycRejectedModel(model: KycRejectedModel): Model + @Binds @IntoMap @ClassKey(OrganizeTokensModel::class) diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/analytics/utils/WalletTangemPayAnalyticsEventSender.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/analytics/utils/WalletTangemPayAnalyticsEventSender.kt index e2df7c8cca..5e65dfb36a 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/analytics/utils/WalletTangemPayAnalyticsEventSender.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/analytics/utils/WalletTangemPayAnalyticsEventSender.kt @@ -2,6 +2,7 @@ package com.tangem.feature.wallet.presentation.wallet.analytics.utils import com.tangem.core.analytics.api.AnalyticsEventHandler import com.tangem.core.decompose.di.ModelScoped +import com.tangem.domain.pay.model.CustomerInfo import com.tangem.domain.pay.model.MainScreenCustomerInfo import com.tangem.domain.pay.model.OrderStatus import com.tangem.domain.tangempay.TangemPayAnalyticsEvents @@ -25,8 +26,10 @@ internal class WalletTangemPayAnalyticsEventSender @Inject constructor( // TODO: TangemPay refactor analytics // when statement copied from TangemPayUpdateInfoStateTransformer. Be careful when editing val event = when { - customerInfo.orderStatus == OrderStatus.CANCELED -> return // ignore cancelled state on analytics - !customerInfo.info.isKycApproved -> return // ignore kyc not approved state on analytics + // ignore cancelled state on analytics + customerInfo.orderStatus == OrderStatus.CANCELED -> return + // ignore kyc not approved state on analytics + customerInfo.info.kycStatus != CustomerInfo.KycStatus.APPROVED -> return cardInfo != null && productInstance != null -> return else -> TangemPayAnalyticsEvents.IssuingBannerDisplayed() } diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/model/WalletDialogConfig.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/model/WalletDialogConfig.kt index 4042c8b37e..a482dc420f 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/model/WalletDialogConfig.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/model/WalletDialogConfig.kt @@ -32,4 +32,7 @@ internal sealed interface WalletDialogConfig { val tokenAction: TokenAction, val onWarningAcknowledged: (TokenAction) -> Unit, ) : WalletDialogConfig + + @Serializable + data class KycRejected(val walletId: UserWalletId, val customerId: String) : WalletDialogConfig } \ No newline at end of file diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/TangemPayUpdateInfoStateTransformer.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/TangemPayUpdateInfoStateTransformer.kt index b6ad2482ff..9a9ce4feee 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/TangemPayUpdateInfoStateTransformer.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/transformers/TangemPayUpdateInfoStateTransformer.kt @@ -16,6 +16,8 @@ import com.tangem.feature.wallet.child.wallet.model.intents.TangemPayIntents import com.tangem.feature.wallet.presentation.wallet.state.model.TangemPayState import com.tangem.feature.wallet.presentation.wallet.state.model.TangemPayState.Progress import com.tangem.feature.wallet.presentation.wallet.state.model.WalletState +import com.tangem.domain.pay.model.CustomerInfo.KycStatus.APPROVED +import com.tangem.domain.pay.model.CustomerInfo import java.util.Currency /** @@ -43,11 +45,13 @@ internal class TangemPayUpdateInfoStateTransformer( private fun createInitialState(): TangemPayState { val cardInfo = value.info.cardInfo val productInstance = value.info.productInstance + val customerId = value.info.customerId // when statement copied to WalletTangemPayAnalyticsEventSender. Be careful when editing. return when { value.orderStatus == OrderStatus.CANCELED -> createCancelledState() - !value.info.isKycApproved -> createKycInProgressState() + value.info.kycStatus != APPROVED && !customerId.isNullOrEmpty() -> + createKycInProgressState(kycStatus = value.info.kycStatus, customerId = customerId) cardInfo != null && productInstance != null -> getCardInfoState(cardInfo, productInstance) else -> createIssueProgressState() } @@ -80,13 +84,25 @@ internal class TangemPayUpdateInfoStateTransformer( } } - private fun createKycInProgressState(): TangemPayState = Progress( - title = TextReference.Res(R.string.tangempay_payment_account), - description = TextReference.Res(R.string.tangempay_kyc_in_progress), - buttonText = TextReference.Res(R.string.tangempay_kyc_in_progress_notification_button), - iconRes = R.drawable.ic_promo_kyc_36, - onButtonClick = { tangemPayClickIntents.onKycProgressClicked(userWalletId) }, - ) + private fun createKycInProgressState(kycStatus: CustomerInfo.KycStatus, customerId: String): TangemPayState = + Progress( + title = TextReference.Res(R.string.tangempay_payment_account), + description = when (kycStatus) { + CustomerInfo.KycStatus.REJECTED -> TextReference.Res(R.string.tangempay_kyc_has_failed) + else -> TextReference.Res(R.string.tangempay_kyc_in_progress) + }, + buttonText = TextReference.Res(R.string.tangempay_kyc_in_progress_notification_button), + iconRes = R.drawable.ic_promo_kyc_36, + onButtonClick = { + when (kycStatus) { + CustomerInfo.KycStatus.REJECTED -> tangemPayClickIntents.onKycRejectedClicked( + userWalletId = userWalletId, + customerId = customerId, + ) + else -> tangemPayClickIntents.onKycProgressClicked(userWalletId) + } + }, + ) private fun createIssueProgressState(): TangemPayState = Progress( title = TextReference.Res(R.string.tangempay_payment_account), diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/ui/components/visa/KycRejectedComponent.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/ui/components/visa/KycRejectedComponent.kt new file mode 100644 index 0000000000..5cccb5d97a --- /dev/null +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/ui/components/visa/KycRejectedComponent.kt @@ -0,0 +1,49 @@ +package com.tangem.feature.wallet.presentation.wallet.ui.components.visa + +import androidx.compose.runtime.Composable +import androidx.compose.runtime.getValue +import androidx.lifecycle.compose.collectAsStateWithLifecycle +import com.tangem.core.decompose.context.AppComponentContext +import com.tangem.core.decompose.model.getOrCreateModel +import com.tangem.core.ui.components.bottomsheets.message.MessageBottomSheetV2 +import com.tangem.core.ui.decompose.ComposableBottomSheetComponent +import com.tangem.domain.models.wallet.UserWalletId +import dagger.assisted.Assisted +import dagger.assisted.AssistedFactory +import dagger.assisted.AssistedInject + +internal class KycRejectedComponent @AssistedInject constructor( + @Assisted appComponentContext: AppComponentContext, + @Assisted params: Params, +) : ComposableBottomSheetComponent, AppComponentContext by appComponentContext { + + private val model: KycRejectedModel = getOrCreateModel(params = params) + + override fun dismiss() { + model.onDismiss() + } + + @Composable + override fun BottomSheet() { + val state by model.uiState.collectAsStateWithLifecycle() + MessageBottomSheetV2(state = state, onDismissRequest = ::dismiss) + } + + data class Params( + val callbacks: KycRejectedCallbacks, + val walletId: UserWalletId, + val customerId: String, + val onDismiss: () -> Unit, + ) + + @AssistedFactory + interface Factory { + fun create(appComponentContext: AppComponentContext, params: Params): KycRejectedComponent + } +} + +internal interface KycRejectedCallbacks { + fun onClickYourProfile(userWalletId: UserWalletId) + fun onClickGoToSupport(customerId: String) + fun onClickHideKyc(userWalletId: UserWalletId) +} \ No newline at end of file diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/ui/components/visa/KycRejectedModel.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/ui/components/visa/KycRejectedModel.kt new file mode 100644 index 0000000000..40e010fd56 --- /dev/null +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/ui/components/visa/KycRejectedModel.kt @@ -0,0 +1,77 @@ +package com.tangem.feature.wallet.presentation.wallet.ui.components.visa + +import androidx.compose.runtime.Stable +import androidx.compose.ui.text.style.TextDecoration +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.res.R +import com.tangem.core.ui.components.bottomsheets.message.* +import com.tangem.core.ui.extensions.combinedReference +import com.tangem.core.ui.extensions.resourceReference +import com.tangem.core.ui.extensions.stringReference +import com.tangem.core.ui.extensions.styledResourceReference +import com.tangem.core.ui.message.bottomSheetMessage +import com.tangem.core.ui.res.TangemTheme +import com.tangem.utils.coroutines.CoroutineDispatcherProvider +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import javax.inject.Inject + +@Stable +@ModelScoped +internal class KycRejectedModel @Inject constructor( + paramsContainer: ParamsContainer, + override val dispatchers: CoroutineDispatcherProvider, +) : Model() { + + private val params = paramsContainer.require() + + val uiState: StateFlow + field = MutableStateFlow(getInitialState()) + + private fun getInitialState(): MessageBottomSheetUMV2 { + return bottomSheetMessage { + infoBlock { + icon(com.tangem.core.ui.R.drawable.ic_heart_broken_32) { + type = MessageBottomSheetUMV2.Icon.Type.Warning + backgroundType = MessageBottomSheetUMV2.Icon.BackgroundType.Warning + } + title = resourceReference(R.string.tangempay_kyc_rejected) + body = combinedReference( + resourceReference(R.string.tangempay_kyc_rejected_description), + stringReference(" "), + styledResourceReference( + id = R.string.tangempay_kyc_rejected_description_span, + spanStyleReference = { + TangemTheme.typography.body2.copy(TangemTheme.colors.text.accent).toSpanStyle() + .copy(textDecoration = TextDecoration.None) + }, + onClick = { + params.callbacks.onClickYourProfile(userWalletId = params.walletId) + onDismiss() + }, + ), + ) + } + primaryButton { + text = resourceReference(R.string.tangempay_go_to_support) + onClick = { + params.callbacks.onClickGoToSupport(customerId = params.customerId) + onDismiss() + } + } + secondaryButton { + text = resourceReference(R.string.tangempay_kyc_rejected_button_text) + onClick = { + params.callbacks.onClickHideKyc(userWalletId = params.walletId) + onDismiss() + } + } + }.messageBottomSheetUMV2 + } + + fun onDismiss() { + params.onDismiss() + } +} \ No newline at end of file