diff --git a/app/src/main/java/com/tangem/tap/features/welcome/model/WelcomeModel.kt b/app/src/main/java/com/tangem/tap/features/welcome/model/WelcomeModel.kt index 143654b18d..fd312671d9 100644 --- a/app/src/main/java/com/tangem/tap/features/welcome/model/WelcomeModel.kt +++ b/app/src/main/java/com/tangem/tap/features/welcome/model/WelcomeModel.kt @@ -14,6 +14,7 @@ import com.tangem.tap.features.welcome.redux.WelcomeAction import com.tangem.tap.features.welcome.redux.WelcomeState import com.tangem.tap.features.welcome.ui.WelcomeScreenState import com.tangem.tap.features.welcome.ui.model.WarningModel +import com.tangem.tap.mainScope import com.tangem.tap.store import com.tangem.utils.coroutines.CoroutineDispatcherProvider import kotlinx.coroutines.flow.MutableStateFlow @@ -39,7 +40,7 @@ internal class WelcomeModel @Inject constructor( val state: MutableStateFlow = MutableStateFlow(initialState) init { - store.dispatch(WelcomeAction.SetCoroutineScope(modelScope)) + store.dispatch(WelcomeAction.SetCoroutineScope(mainScope)) subscribeToStoreChanges() initGlobalState() diff --git a/app/src/main/java/com/tangem/tap/features/welcome/ui/WelcomeFragment.kt b/app/src/main/java/com/tangem/tap/features/welcome/ui/WelcomeFragment.kt deleted file mode 100644 index 968b3776fa..0000000000 --- a/app/src/main/java/com/tangem/tap/features/welcome/ui/WelcomeFragment.kt +++ /dev/null @@ -1,85 +0,0 @@ -package com.tangem.tap.features.welcome.ui - -import androidx.activity.compose.BackHandler -import androidx.compose.foundation.background -import androidx.compose.foundation.layout.Box -import androidx.compose.foundation.layout.fillMaxWidth -import androidx.compose.foundation.layout.padding -import androidx.compose.foundation.layout.systemBarsPadding -import androidx.compose.material3.SnackbarHost -import androidx.compose.material3.SnackbarHostState -import androidx.compose.runtime.* -import androidx.compose.ui.Alignment -import androidx.compose.ui.Modifier -import androidx.compose.ui.platform.LocalLifecycleOwner -import androidx.hilt.navigation.compose.hiltViewModel -import androidx.lifecycle.compose.collectAsStateWithLifecycle -import com.tangem.core.analytics.Analytics -import com.tangem.core.ui.UiDependencies -import com.tangem.core.ui.res.TangemTheme -import com.tangem.core.ui.screen.ComposeFragment -import com.tangem.tap.common.analytics.events.SignIn -import com.tangem.tap.common.extensions.eraseContext -import com.tangem.tap.features.details.ui.cardsettings.resolveReference -import com.tangem.tap.features.welcome.ui.components.WarningDialog -import com.tangem.tap.features.welcome.ui.components.WelcomeScreenContent -import dagger.hilt.android.AndroidEntryPoint -import javax.inject.Inject - -@AndroidEntryPoint -internal class WelcomeFragment : ComposeFragment() { - - @Inject - override lateinit var uiDependencies: UiDependencies - - override fun onStart() { - super.onStart() - Analytics.eraseContext() - Analytics.send(SignIn.ScreenOpened()) - } - - @Composable - override fun ScreenContent(modifier: Modifier) { - val viewModel = hiltViewModel() - LocalLifecycleOwner.current.lifecycle.addObserver(viewModel) - - val state by viewModel.state.collectAsStateWithLifecycle() - val snackbarHostState = remember { SnackbarHostState() } - val errorMessage by rememberUpdatedState(newValue = state.error?.resolveReference()) - val warning by rememberUpdatedState(newValue = state.warning) - - BackHandler { - requireActivity().finish() - } - - Box( - modifier = modifier - .background(TangemTheme.colors.background.primary) - .systemBarsPadding(), - ) { - WelcomeScreenContent( - showUnlockProgress = state.showUnlockWithBiometricsProgress, - showScanCardProgress = state.showUnlockWithCardProgress, - onUnlockClick = viewModel::unlockWallets, - onScanCardClick = viewModel::scanCard, - ) - - SnackbarHost( - modifier = Modifier - .align(Alignment.BottomCenter) - .padding(vertical = TangemTheme.dimens.spacing16) - .fillMaxWidth(), - hostState = snackbarHostState, - ) - } - - WarningDialog(warning) - - LaunchedEffect(key1 = errorMessage) { - errorMessage?.let { - snackbarHostState.showSnackbar(it) - viewModel.closeError() - } - } - } -} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/welcome/ui/WelcomeViewModel.kt b/app/src/main/java/com/tangem/tap/features/welcome/ui/WelcomeViewModel.kt deleted file mode 100644 index 592678f735..0000000000 --- a/app/src/main/java/com/tangem/tap/features/welcome/ui/WelcomeViewModel.kt +++ /dev/null @@ -1,134 +0,0 @@ -package com.tangem.tap.features.welcome.ui - -import android.os.Bundle -import androidx.lifecycle.* -import com.tangem.common.core.TangemError -import com.tangem.common.routing.AppRoute -import com.tangem.common.routing.bundle.unbundle -import com.tangem.common.routing.entity.SerializableIntent -import com.tangem.core.analytics.Analytics -import com.tangem.domain.wallets.legacy.UserWalletsListError -import com.tangem.tap.common.analytics.events.SignIn -import com.tangem.tap.common.redux.global.GlobalAction -import com.tangem.tap.features.details.ui.cardsettings.TextReference -import com.tangem.tap.features.welcome.redux.WelcomeAction -import com.tangem.tap.features.welcome.redux.WelcomeState -import com.tangem.tap.features.welcome.ui.model.WarningModel -import com.tangem.tap.store -import dagger.hilt.android.lifecycle.HiltViewModel -import kotlinx.coroutines.flow.MutableStateFlow -import kotlinx.coroutines.flow.StateFlow -import kotlinx.coroutines.flow.update -import org.rekotlin.StoreSubscriber -import javax.inject.Inject - -@HiltViewModel -internal class WelcomeViewModel @Inject constructor( - savedStateHandle: SavedStateHandle, -) : ViewModel(), - StoreSubscriber, - DefaultLifecycleObserver { - - private val initialIntent: SerializableIntent? = savedStateHandle.get(AppRoute.Welcome.INITIAL_INTENT_KEY) - ?.unbundle(SerializableIntent.serializer()) - - private val stateInternal = MutableStateFlow(WelcomeScreenState()) - val state: StateFlow = stateInternal - - override fun onCreate(owner: LifecycleOwner) { - store.dispatch(WelcomeAction.SetCoroutineScope(viewModelScope)) - - subscribeToStoreChanges() - initGlobalState() - - val welcomeAction = if (initialIntent != null) { - WelcomeAction.ProceedWithIntent(initialIntent.toIntent()) - } else { - WelcomeAction.ProceedWithBiometrics() - } - - store.dispatch(welcomeAction) - } - - fun unlockWallets() { - Analytics.send(SignIn.ButtonBiometricSignIn()) - store.dispatch(WelcomeAction.ProceedWithBiometrics()) - } - - fun scanCard() { - Analytics.send(SignIn.ButtonCardSignIn()) - store.dispatch(WelcomeAction.ProceedWithCard) - } - - fun closeError() { - store.dispatch(WelcomeAction.CloseError) - } - - // TODO: Refactor errors handling - override fun newState(state: WelcomeState) { - val warning = createWarningIfNeeded(state.error) - - stateInternal.update { prevState -> - prevState.copy( - showUnlockWithBiometricsProgress = state.isUnlockWithBiometricsInProgress, - showUnlockWithCardProgress = state.isUnlockWithCardInProgress, - warning = warning, - error = state.error - ?.takeIf { !it.silent && warning == null } - ?.let { e -> - e.messageResId?.let { TextReference.Res(it) } - ?: TextReference.Str(e.customMessage) - }, - ) - } - } - - override fun onDestroy(owner: LifecycleOwner) { - store.dispatch(WelcomeAction.ClearCoroutineScope) - store.unsubscribe(this) - super.onDestroy(owner) - } - - private fun createWarningIfNeeded(error: TangemError?): WarningModel? { - return when (error) { - is UserWalletsListError.BiometricsAuthenticationLockout -> WarningModel.BiometricsLockoutWarning( - isPermanent = error.isPermanent, - onDismiss = this::dismissWarning, - ) - is UserWalletsListError.AllKeysInvalidated, - is UserWalletsListError.NoUserWalletSelected, - -> WarningModel.KeyInvalidatedWarning( - onDismiss = this::dismissWarning, - ) - is UserWalletsListError.BiometricsAuthenticationDisabled -> WarningModel.BiometricsDisabledWarning( - onDismiss = this::clearUserWallets, - ) - else -> null - } - } - - private fun dismissWarning() { - stateInternal.update { prevState -> - prevState.copy( - warning = null, - ) - } - closeError() - } - - private fun clearUserWallets() { - store.dispatch(WelcomeAction.ClearUserWallets) - } - - private fun subscribeToStoreChanges() { - store.subscribe(this) { appState -> - appState.skip { old, new -> old.welcomeState == new.welcomeState } - .select { it.welcomeState } - } - } - - private fun initGlobalState() { - store.dispatch(GlobalAction.RestoreAppCurrency) - store.dispatch(GlobalAction.ExchangeManager.Init) - } -} \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/routing/utils/ChildFactory.kt b/app/src/main/java/com/tangem/tap/routing/utils/ChildFactory.kt index 31a4ba6b7a..56711d9800 100644 --- a/app/src/main/java/com/tangem/tap/routing/utils/ChildFactory.kt +++ b/app/src/main/java/com/tangem/tap/routing/utils/ChildFactory.kt @@ -37,7 +37,6 @@ import com.tangem.tap.features.onboarding.products.twins.ui.OnboardingTwinsFragm import com.tangem.tap.features.onboarding.products.wallet.ui.OnboardingWalletFragment import com.tangem.tap.features.saveWallet.ui.SaveWalletBottomSheetFragment import com.tangem.tap.features.welcome.component.WelcomeComponent -import com.tangem.tap.features.welcome.ui.WelcomeFragment import com.tangem.tap.routing.component.RoutingComponent.Child import com.tangem.tap.routing.toggle.RoutingFeatureToggles import com.tangem.utils.Provider @@ -614,7 +613,13 @@ internal class ChildFactory @Inject constructor( ) } is AppRoute.Welcome -> { - route.asFragmentChild(Provider { WelcomeFragment() }) + route.asComponentChild( + contextProvider = contextProvider(route, contextFactory), + params = WelcomeComponent.Params( + intent = route.intent, + ), + componentFactory = welcomeComponentFactory, + ) } is AppRoute.TesterMenu -> { Child.LegacyIntent(testerRouter.getEntryIntent()) diff --git a/core/res/src/main/res/values-de/strings.xml b/core/res/src/main/res/values-de/strings.xml index 4ff77a5e42..b7a04e5add 100644 --- a/core/res/src/main/res/values-de/strings.xml +++ b/core/res/src/main/res/values-de/strings.xml @@ -126,6 +126,7 @@ Entfernen Deaktiviert + Trennen Erledigt Aktivieren Aktiviert @@ -498,6 +499,10 @@ Rufe dies auf oder tippe auf die Suchleiste, um Token direkt vom Markt hinzuzufügen Token hinzufügen NFC ist auf deinem Gerät nicht verfügbar + + %d Stück + %d Stücke + %1$d NFTs in der %2$d Sammlung Tippe hier, um das erste NFT zu erhalten NFT-Sammlungen @@ -1011,6 +1016,7 @@ Verfügbar für %d Tage Guthaben und Limits + Zugangscode Bitte wähle die Wallet aus, mit der Du den Registrierungsprozess gestartet hast, um die Transaktion zur Erstellung Deines Kontos auf der Blockchain zu signieren Möchtest Du den Vorgang wirklich beenden? Du kannst später dort fortfahren, wo Du aufgehört hast. Das wird nicht lange dauern. Wir richten gerade Dein Konto ein. @@ -1157,6 +1163,12 @@ Dies ist eine Testnet-Karte. Sie kann keine Transaktionen verarbeiten und sollte nur zu Test- und Entwicklungszwecken verwendet werden. Nur für Testzwecke Der Kontostand ist möglicherweise veraltet. Aktualisiere bittre die Seite. + Verbindungen + Alle trennen + Alle dApps trennen + Neue Verbindung + Verbinde Deine Wallet mit einer anderen dApp + Keine Sitzungen Verwerfen Du hast eine unterbrochene Sicherung. Möchtest du diese fortsetzen? Ja, fortsetzen diff --git a/core/res/src/main/res/values-es/strings.xml b/core/res/src/main/res/values-es/strings.xml index 7446797c14..abe6273ee4 100644 --- a/core/res/src/main/res/values-es/strings.xml +++ b/core/res/src/main/res/values-es/strings.xml @@ -126,6 +126,7 @@ Suprimir Desactivado + Desconectar Listo Activar Activado @@ -139,6 +140,7 @@ Mercado Lento Velocidad y tarifa + Finalizar Sincronizar direcciones Ir al proveedor Ir al token @@ -158,6 +160,7 @@ Ninguna dirección Ahora OK + Abrir en el navegador Tarjeta principal Anillo primario Frase de contraseña @@ -181,6 +184,7 @@ Enviar El servidor no está disponible, por favor inténtelo de nuevo más tarde Compartir + Compartir enlace Firme Firme y envíe Stake @@ -272,6 +276,8 @@ Intercambio por %s Visite el sitio web del proveedor para reembolsar su dinero Operación fallida por el proveedor + Su intercambio está tardando más de lo esperado. Por favor, consulte al soporte del proveedor para obtener ayuda. + Tiempo de transacción prolongado El monto de la transacción fue reembolsado en %1$s a su billetera debido a OKX o reglas puente. %2$s El monto fue reembolsado en %1$s (red %2$s) Visite el sitio web del proveedor para la verificación @@ -759,6 +765,8 @@ incluida una tarifa de red de %1$s La transacción se firmó con éxito y se envió al nodo blockchain. El saldo de la billetera se actualizará después de un tiempo. %1$s es un activo en la red Tron. Para calcular la tarifa y realizar una transacción, deba depositar algo de Tron (TRX) en su cuenta. + Es necesario una etiqueta de destino (memo) para completar esta transacción para la dirección especificada. + Etiqueta de destino obligatoria Transacción enviada Escanee la tarjeta/anillo que quiere configurar Olvidar la billetera @@ -780,6 +788,7 @@ %s beneficio estimado Calificación de mercado Métrica + Según las reglas de la red %1$s, se pueden reclamar recompensas desde %2$s. Las cantidades a continuación se acreditarán en su cuenta al deshacer el staking. Mínimo requerido No hay recompensas para reclamar Reclamo de recompensa @@ -817,11 +826,16 @@ Saldo de staking bajo Un mínimo de %1$s %2$s es necesario para añadir más staking. Por favor recargue su saldo. No tiene suficiente %s + Saldo insuficiente para Staking + Se requiere un mínimo de 3 ADA para hacer más staking. Por favor, recargue su saldo. + No hay suficiente ADA + La cantidad mínima requerida para hacer staking debe ser superior a 5 ADA. Recargue su saldo para continuar. El staking no está disponible actualmente debido a las condiciones de la red. Inténtelo de nuevo más tarde. El staking en la red %1$s con un nuevo validador transferirá automáticamente todos los fondos previamente en staking a este validador. Reinvierta las recompensas obtenidas en el monto apostado, aumentando las ganancias potenciales. 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 cantidad para cubrir las tarifas de la red por unstaking o reclamo de recompensas. + Para empezar a hacer staking en TON, realice primero una transacción de salida de cualquier importe - esto activará su billetera. Desbloquee su dinero para retirarlo del proceso de staking. El desbloqueo demora %s minuto. Sus fondos estarán disponibles para su uso después del período de desvinculación de 21 días. La recompensa se retirará junto con los fondos de desvinculación. Sus fondos estarán disponibles para su uso después del período de desvinculación de %s. @@ -850,6 +864,7 @@ Recompensas El stake está bloqueado Hacer más staking + Al hacer staking de %1$s, se realiza sobre todo su saldo de %2$s. Cualquier %2$s adicional que deposite en su billetera Tangem también se pondrá en staking automáticamente. Monto del staking Ud hace el staking de %1$s y recibirá %2$s Toque para desbloquear @@ -884,6 +899,8 @@ Descubra Tangem Intercambie, compre NFT, haga préstamos y depósitos en más de 100 servicios descentralizados diferentes Compatible con Web 3.0 + Se requiere una transacción entrante de al menos %1$s para proceder + Fondos insuficientes La red cobrará una tarifa de aprobación de token para verificar que está autorizando el uso de su token para el swap. Intercambie más tokens a mejores tasas directamente en su billetera. ¡Nuevo proveedor de intercambio disponible! @@ -919,10 +936,12 @@ Cancelar Esta operación no está disponible actualmente. Por favor, inténtalo de nuevo más tarde. Comprar %s no está disponible con los proveedores actuales pero estamos trabajando para agregar más opciones. + La acción no está disponible para tokens personalizados. No tiene fondos para vender. Recargue su cuenta para poder vender fondos desde ella. No tienes fondos para enviar. Recarga tu cuenta para poder enviar fondos desde ella. Los datos aún no se han cargado. Esto puede tardar unos segundos. Por favor, inténtelo de nuevo más tarde. El servicio de intercambio %s no está compatible con los proveedores actuales pero estamos trabajando para agregar más opciones. + Es posible que el saldo mostrado esté desactualizado debido al almacenamiento en caché. La venta de fondos estará disponible una vez que la(s) transacción(es) pendiente(s) en la red %s se complete El envío de fondos estará disponible una vez que se completen las transacciones pendientes en la red %s. Vender %s no es compatible con los proveedores actuales, pero estamos trabajando para agregar más opciones. @@ -969,6 +988,7 @@ Tangem Twin Esta acción es irreversible. No tendrá acceso la billetera antigua. Toque la tarjeta gemela con el número %s y no la retira hasta el final de la operación + Hemos encontrado un error. Código de error: %s. Póngase en contacto con nuestro servicio de asistencia. Use %s o escanee una tarjeta/anillo para tener acceso a su billetera Error de conexión: Esta dApp utiliza la versión 1.0 de Wallet Connect, que no es compatible. Asegúrese de que la dApp sea compatible con la versión 2.0 de Wallet Connect para conectarse correctamente. Manténgase actualizado con las últimas funciones y noticias @@ -1112,6 +1132,7 @@ No se han podido actualizar los saldos de algunos tokens Esta es una tarjeta de Testnet. No puede procesar transacciones y solo deba usarse para pruebas y desarrollo. Solo para fines de prueba + El saldo podría estar desactualizado. Actualice la página. Ignorar Tiene un backup interrumpido. ¿Quiere reanudarlo? Sí, reanudar diff --git a/core/res/src/main/res/values-fr/strings.xml b/core/res/src/main/res/values-fr/strings.xml index db80887fdb..01f05ff01c 100644 --- a/core/res/src/main/res/values-fr/strings.xml +++ b/core/res/src/main/res/values-fr/strings.xml @@ -126,6 +126,7 @@ Supprimer Désactivé + Se déconnecter Exécuté Activer Activé diff --git a/core/res/src/main/res/values-ja/strings.xml b/core/res/src/main/res/values-ja/strings.xml index d0474aa52e..9b67c45675 100644 --- a/core/res/src/main/res/values-ja/strings.xml +++ b/core/res/src/main/res/values-ja/strings.xml @@ -123,6 +123,7 @@ 削除 無効 + 切断 完了 有効にする 有効 @@ -1009,6 +1010,7 @@ %d日間利用可能 残高と限度額 + アクセスコード 本当に終了してもよろしいですか?中断したところから後で続行できます。 長くはかかりません。アカウントを設定しています。 長くはかかりません。アクティベーションを完了しています。 @@ -1151,6 +1153,13 @@ これはテストネットカードです。取引処理はできませんので、テストおよび開発目的でのみご利用ください。 テスト目的のみ 残高が古い可能性があります。ページを更新してください。 + 接続 + すべての接続を解除する + すべてのdAppsの接続解除に関するテキスト + すべてのdAppを接続解除する + 新しい接続 + ウォレットを別のdAppに接続する + セッションなし 破棄 バックアップが中断されました。再開しますか? はい、再開します diff --git a/core/res/src/main/res/values-ru/strings.xml b/core/res/src/main/res/values-ru/strings.xml index 9e98a332d6..de090f81f6 100644 --- a/core/res/src/main/res/values-ru/strings.xml +++ b/core/res/src/main/res/values-ru/strings.xml @@ -132,6 +132,7 @@ Удалить Отключено + Отключить Готово Включить Включено @@ -145,6 +146,7 @@ По рынку Медленно Скорость и комиссия + Завершить Синхронизировать адреса К провайдеру Перейти в токен @@ -164,6 +166,7 @@ Нет адреса Сейчас OK + Открыть в браузере Основная карта Основное кольцо Парольная фраза @@ -187,6 +190,7 @@ Отправить Сервер недоступен, повторите попытку позднее Поделиться + Поделиться ссылкой Подписать Подписать и отправить Застейкать @@ -278,6 +282,7 @@ Обмен через %s Чтобы вернуть ваши деньги, посетите сайт провайдера Операция не выполнена провайдером + Ваш обмен занимает больше времени, чем ожидалось. Пожалуйста, обратитесь в службу поддержки провайдера для уточнения. Отправленные средства были возвращены в %1$s на ваш кошелек в соответствии с правилами OKX или моста обмена. %2$s Сумма была возвращена в %1$s (%2$s сети) Посетите сайт провайдера для проверки @@ -779,6 +784,7 @@ включая комиссию сети в размере %1$s Транзакция успешно подписана и отправлена в блокчейн. Баланс будет обновлен через некоторое время %1$s — это монета в сети Tron. Чтобы рассчитать комиссию и совершить транзакцию, вам необходимо внести немного Tron (TRX) на свой адрес. + Для завершения транзакции на указанный адрес необходим тег назначения (мемо). Транзакция отправлена Подготовьтесь к сканированию кольца или карты, которую вы хотите настроить. Забыть кошелек @@ -837,6 +843,10 @@ Низкий баланс стейкинга Для рестейкинга необходимо %1$s%2$s. Пожалуйста, пополните баланс. Недостаточно %s + Недостаточный баланс для стейкинга + Для рестейкинга необходимо 3 ADA. Пожалуйста, пополните баланс. + Недостаточно ADA + Минимальная сумма для стейкинга должна быть больше, чем 5 ADA. Пожалуйста, пополните баланс, чтобы приступить к стейкингу. Стейкинг временно недоступен из-за проблем в сети. Пожалуйста, попробуйте позже. Стейкинг в сети %1$s с новым валидатором автоматически переведет ваши текущие застейканные средства на него. Реинвестируйте свои заработанные награды в вашу застейканную сумму, увеличивая потенциальный доход @@ -850,6 +860,7 @@ Стейкинг в сети Tron с новым валидатором автоматически переведет ваши текущие застейканные средства на него. Подготовка Доступно для вывода + Повторно застейкать Сменить валидатора Застейкать вознаграждения Отозвать @@ -870,6 +881,7 @@ Вознаграждения Стейкинг закрыт Застейкать еще + При стейкинге %1$s используется весь ваш баланс в %2$s. Любой дополнительный %2$s депозит будет автоматически застейкан. Застейканная сумма Вы стейкаете %1$s и будете получать награду %2$s Нажмите для разблокировки @@ -941,10 +953,12 @@ Отменить Выбранная операция в данный момент недоступна. Попробуйте позже. Покупка %s в данный момент не поддерживается ни одним провайдером. Мы работаем над добавлением новых возможностей. Следите за нашими новостями. + Действие недоступно для кастомных токенов. У вас нет средств для продажи. Пополните счет, чтобы иметь возможность продать с него средства. У вас нет средств для отправки. Пополните счет, чтобы иметь возможность отправить с него средства. Данные в процессе загрузки. Это может занять несколько секунд. Пожалуйста, попробуйте позже. Обмен %s в данный момент не поддерживается ни одним провайдером. Мы работаем над добавлением новых возможностей. Следите за нашими новостями. + Отображаемый баланс мог устареть из-за кеширования. Продажа средств станет доступной после завершения транзакции(-ий) в сети %s Отправка средств станет доступной после завершения транзакции(-ий) в сети %s Продажа %s в данный момент не поддерживается ни одним провайдером. Мы работаем над добавлением новых возможностей. Следите за нашими новостями. @@ -1137,6 +1151,7 @@ Некоторые балансы токенов не удалось обновить Это Testnet карта. Он не может обрабатывать транзакции и используется только в целях тестирования и разработки. Только для целей тестирования + Возможно, баланс устарел. Обновите страницу. Отказаться Вы не закончили резервное копирование. Хотите продолжить? Да, возобновить 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 595d9519f2..4b6a67ab8c 100644 --- a/core/res/src/main/res/values-uk-rUA/strings.xml +++ b/core/res/src/main/res/values-uk-rUA/strings.xml @@ -132,6 +132,7 @@ Видалити Вимкнуто + Від\'єднати Готово Увімкнути Увімкнено @@ -145,6 +146,7 @@ За ринком Повільно Швидкість та комісія + Завершити Синхронізувати адреси Перейти до провайдера Перейти до токену @@ -164,6 +166,7 @@ Немає адреси Зараз ОК + Відкрити в браузері Основна картка Основне кільце Парольна фраза @@ -187,6 +190,7 @@ Надіслати Сервер недоступний, спробуйте пізніше Поширити + Поділитися посиланням Підписати Підписати та надіслати Застейкати @@ -278,6 +282,8 @@ Обмін через %s Щоб повернути ваші кошти, відвідайте сайт провайдера Операція не виконана провайдером + Ваш обмін триває довше, ніж очікувалося. Будь ласка, зверніться до служби підтримки постачальника послуг, для уточнення. + Тривалий час транзакції Сума транзакції була повернута в %1$s на ваш гаманець відповідно до правил OKX або мосту обміну. %2$s Сума була повернута в %1$s (%2$s мережі) Відвідайте сайт провайдера для перевірки @@ -779,6 +785,8 @@ включно з комісією мережі %1$s Транзакція успішно підписана і відправлена до блокчейну. Баланс гаманця буде оновлено через деякий час %1$s — це монета у мережі Tron. Щоб розрахувати комісію та здійснити транзакцію, вам необхідно внести певну кількість Tron (TRX) на свій рахунок. + Тег призначення (memo) потрібен для завершення цієї транзакції для вказаної адреси. + Тег призначення обов\'язковий Трансакцію надіслано Підготуйтеся до сканування кільця або картки, яку ви хочете налаштувати. Забути гаманець @@ -800,6 +808,7 @@ ~ прибуток за %s Рейтинг ринку Метрики + Згідно з %1$s правила мережі, отримання можливі з %2$s. Суми нижче будуть зараховані на ваш рахунок після скасування стейкінгу. Мінімальні вимоги Немає винагород, до отримання Отримати винагороду @@ -837,11 +846,16 @@ Низький баланс стейкінгу Мінімум %1$s %2$s потрібно для рестейкінгу. Будь ласка, поповніть баланс. Недостатньо %s + Недостатній баланс для стейкінгу + Мінімум 3 ADA необхідно для рестейкінгу. Будь ласка поповніть свій баланс. + Недостатньо ADA + Мінімальна сума, необхідна для стекінгу, має перевищувати 5 ADA. Будь ласка, поповніть свій баланс, щоб почати cтейкінг. Стейкінг тимчасово недоступний через проблеми в мережі. Будь ласка, спробуйте пізніше. Стейкінг в мережі %1$s з новим валідатором автоматично переведе всі раніше застейкані кошти до цього валідатора Реінвестуйте зароблені винагороди у суму стейкінгу, щоб збільшити потенційний прибуток. Рестейк дозволяє вам перемістити ваші кошти від одного валідатора до іншого без необхідності виводити кошти зі стейкінгу Ви збираєтеся застейкати весь свій баланс. Ми рекомендуємо залишити невелику суму, щоб покрити комісію мережі за зняття коштів або отримання винагороди. + Щоб почати стейкінг в TON, спочатку здійсніть вихідну транзакцію на будь-яку суму — це активує ваш гаманець. Розблокуйте свої кошти, щоб вивести їх зі стейкінгу. Розблокування займе %s. Ваші кошти будуть доступні для використання після закінчення 21-денного періоду розблокування. Винагорода буде отримана разом з вашими незастейканими коштами. Ваші кошти будуть доступні після %s періоду розблокування. @@ -870,6 +884,7 @@ Винагороди Стейкінг закрито Застейкати більше + При стейкінгу %1$s, весь ваш %2$s Баланс застейкний. Будь-які додаткові %2$s поповнены на Ваш гаманець Tangem буде також автоматично застейкано. Застейканий залишок Ви стейкаєте %1$s і будете отримуватиме винагороду %2$s Натисніть, щоб розблокувати @@ -904,6 +919,8 @@ Зустрічайте Tangem Обмінюйте, купуйте NFT, отримуйте позики та робіть депозити у понад 100 різних децентралізованих сервісах Web 3.0 сумісність + Для відправки потрібна вхідна транзакція на суму не менше %1$s + Недостатньо коштів Мережа стягує комісію за схвалення токену за підтвердження, що саме ви дозволяєте використовувати ваш токен для обміну. Обмінюйте більше токенів за вигіднішим курсом прямо у своєму гаманці. З\'явився новий провайдер обмінів! @@ -939,10 +956,12 @@ Скасувати Обрана операція наразі недоступна. Спробуйте пізніше. Наразі купівля монети %s недоступна. Слідкуйте за нашими оновленнями. + Дія недоступна для спеціальних токенів. У вас немає коштів для продажу. Поповніть рахунок, щоб мати змогу продати з нього кошти. У вас немає коштів для відправлення. Поповніть рахунок, щоб мати змогу надіслати з нього кошти. Дані ще не завантажені. Це може зайняти кілька секунд. Будь ласка, спробуйте пізніше. Наразі обмін монети %s недоступний. Слідкуйте за нашими оновленнями. + Відображуваний баланс може бути застарілим через кешування. Продаж коштів стане доступним після завершення транзакції(-ій) в мережі %s Надсилання коштів стане доступним після завершення транзакції(-ій) в мережі %s Наразі продаж %s недоступний. Слідкуйте за нашими оновленнями. @@ -989,6 +1008,7 @@ Tangem Twin Ця дія є незворотною. Ви не матимете доступу до старого гаманця. Прикладіть twin-картку з номером %s та не прибирайте її до завершення операції + Виникла помилка. Код помилки: %s. Спробуйте, будь ласка, знову. Якщо проблема знову виникає — зверніться до нашої служби підтримки. Використовуйте %s або відскануйте картку/кільце, щоб отримати доступ до свого гаманця Не вдалося встановити з\'єднання: Цей dApp використовує Wallet Connect версії 1.0, яка не підтримується. Будь ласка, переконайтеся, що dApp підтримує Wallet Connect версії 2.0 для успішного підключення. Будьте в курсі останніх функцій та новин @@ -1134,6 +1154,7 @@ Деякі баланси токенів не вдалося оновити Це картка Testnet. Вона не може обробляти транзакції і повинна використовуватися лише для тестування та розробки. Лише для цілей тестування + Баланс може бути застарілим. Оновіть сторінку. Відмовитися Ви не завершили резервне копіювання. Бажаєте продовжити? Так, поновити diff --git a/core/res/src/main/res/values-zh-rTW/strings.xml b/core/res/src/main/res/values-zh-rTW/strings.xml index 81c9546a39..814be67145 100644 --- a/core/res/src/main/res/values-zh-rTW/strings.xml +++ b/core/res/src/main/res/values-zh-rTW/strings.xml @@ -53,6 +53,7 @@ 創造 刪除 禁用 + 斷開連接 完成 允許 啟用 diff --git a/core/res/src/main/res/values/strings.xml b/core/res/src/main/res/values/strings.xml index 97946b962c..9966613b6c 100644 --- a/core/res/src/main/res/values/strings.xml +++ b/core/res/src/main/res/values/strings.xml @@ -842,7 +842,7 @@ Low staked balance A minimum of %1$s %2$s is required for restaking. Please top up your balance. Not enough %s - Insufficient Balance for Staking + Insufficient Balance for Staking A minimum of 3 ADA is required for restaking. Please top up your balance. Not enough ADA The minimum amount required for staking must exceed 5 ADA. Please top up your balance to start staking. diff --git a/features/qr-scanning/impl/src/main/java/com/tangem/feature/qrscanning/model/QrScanningModel.kt b/features/qr-scanning/impl/src/main/java/com/tangem/feature/qrscanning/model/QrScanningModel.kt index ce3750e0c0..b120a8bd59 100644 --- a/features/qr-scanning/impl/src/main/java/com/tangem/feature/qrscanning/model/QrScanningModel.kt +++ b/features/qr-scanning/impl/src/main/java/com/tangem/feature/qrscanning/model/QrScanningModel.kt @@ -1,5 +1,7 @@ package com.tangem.feature.qrscanning.model +import android.os.Handler +import android.os.Looper import androidx.compose.runtime.Stable import com.tangem.common.routing.AppRouter import com.tangem.core.decompose.di.ModelScoped @@ -85,7 +87,22 @@ internal class QrScanningModel @Inject constructor( override fun onDestroy() { super.onDestroy() - // don't forget enable reader mode after scan complete - cardSdkProvider.sdk.forceEnableReaderMode() + forceEnableReaderModeDelayed() + } + + private fun forceEnableReaderModeDelayed() { + // we need to delay task because some devices can't enable until navigation completes + Handler(Looper.getMainLooper()) + .postDelayed( + { + // don't forget enable reader mode after scan complete + cardSdkProvider.sdk.forceEnableReaderMode() + }, + DELAY_BEFORE_CALL_ENABLE_NFC, + ) + } + + private companion object { + const val DELAY_BEFORE_CALL_ENABLE_NFC = 1000L } } \ No newline at end of file diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/analytics/SendAnalyticEvents.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/analytics/SendAnalyticEvents.kt index 03fb73beab..16070eefb1 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/analytics/SendAnalyticEvents.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/analytics/SendAnalyticEvents.kt @@ -151,6 +151,7 @@ internal enum class EnterAddressSource { QRCode, PasteButton, RecentAddress, + MyWallet, } internal enum class SelectedCurrencyType(val value: String) { diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/model/SendModel.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/model/SendModel.kt index 2c8301e565..5cc5ccdcee 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/model/SendModel.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/model/SendModel.kt @@ -729,7 +729,7 @@ internal class SendModel @Inject constructor( val memo = uiState.value.getRecipientState(stateRouter.isEditState)?.memoTextField?.value val isValidMemo = validateMemo(memo) - val isRecent = type == EnterAddressSource.RecentAddress + val isRecent = type == EnterAddressSource.RecentAddress || type == EnterAddressSource.MyWallet if (isRecent && isValidAddress && isValidMemo) onNextClick(stateRouter.isEditState) } // endregion diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/recipient/SendRecipientContent.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/recipient/SendRecipientContent.kt index 4838a3a3e3..d16ff2d06c 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/recipient/SendRecipientContent.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/recipient/SendRecipientContent.kt @@ -28,11 +28,11 @@ import com.tangem.core.ui.res.TangemThemePreview import com.tangem.features.send.impl.R import com.tangem.features.send.impl.presentation.analytics.EnterAddressSource import com.tangem.features.send.impl.presentation.domain.SendRecipientListContent +import com.tangem.features.send.impl.presentation.model.SendClickIntents import com.tangem.features.send.impl.presentation.state.SendStates import com.tangem.features.send.impl.presentation.state.fields.SendTextField import com.tangem.features.send.impl.presentation.state.previewdata.RecipientStatePreviewData import com.tangem.features.send.impl.presentation.state.previewdata.SendClickIntentsStub -import com.tangem.features.send.impl.presentation.model.SendClickIntents import kotlinx.collections.immutable.ImmutableList private const val ADDRESS_FIELD_KEY = "ADDRESS_FIELD_KEY" @@ -81,6 +81,7 @@ internal fun SendRecipientContent( clickIntents = clickIntents, isLast = recipients.any { !it.isVisible }, isBalanceHidden = isBalanceHidden, + type = EnterAddressSource.MyWallet, ) listHeaderItem( titleRes = R.string.send_recent_transactions, @@ -92,6 +93,7 @@ internal fun SendRecipientContent( clickIntents = clickIntents, isLast = true, isBalanceHidden = isBalanceHidden, + type = EnterAddressSource.RecentAddress, ) } } @@ -192,6 +194,7 @@ private fun LazyListScope.listItem( clickIntents: SendClickIntents, isLast: Boolean, isBalanceHidden: Boolean, + type: EnterAddressSource, ) { items( count = list.size, @@ -208,10 +211,7 @@ private fun LazyListScope.listItem( subtitleEndOffset = item.subtitleEndOffset, subtitleIconRes = item.subtitleIconRes, onClick = { - clickIntents.onRecipientAddressValueChange( - title, - EnterAddressSource.RecentAddress, - ) + clickIntents.onRecipientAddressValueChange(title, type) }, isLoading = item.isLoading, modifier = Modifier