diff --git a/app/src/main/java/com/tangem/tap/MainActivity.kt b/app/src/main/java/com/tangem/tap/MainActivity.kt index 20808b8396..8e0a528fca 100644 --- a/app/src/main/java/com/tangem/tap/MainActivity.kt +++ b/app/src/main/java/com/tangem/tap/MainActivity.kt @@ -27,7 +27,6 @@ import com.arkivanov.essenty.lifecycle.asEssentyLifecycle import com.google.android.material.snackbar.BaseTransientBottomBar import com.google.android.material.snackbar.Snackbar import com.tangem.common.routing.AppRoute -import com.tangem.common.routing.AppRouter import com.tangem.common.routing.entity.SerializableIntent import com.tangem.core.analytics.api.AnalyticsEventHandler import com.tangem.core.decompose.context.AppComponentContext @@ -181,9 +180,6 @@ class MainActivity : AppCompatActivity(), SnackbarHandler, ActivityResultCallbac @Inject internal lateinit var routingComponentFactory: RoutingComponent.Factory - @Inject - internal lateinit var appRouter: AppRouter - @Inject lateinit var pushNotificationsRouter: PushNotificationsRouter @@ -512,7 +508,9 @@ class MainActivity : AppCompatActivity(), SnackbarHandler, ActivityResultCallbac } private fun navigateToInitialScreenIfNeeded(intentWhichStartedActivity: Intent?) { - val backStack = appRouter.stack + val backStack = appRouterConfig.stack ?: emptyList() + // TODO move inital navigation to navigation component ([REDACTED_JIRA]) + val isOnlyInitialRoute = backStack.all { it is AppRoute.Initial } val isOnInitialScreen = backStack.all { it is AppRoute.Welcome || it is AppRoute.Home } val isNotScannedBefore = store.state.globalState.scanResponse == null val isOnboardingServiceNotActive = !store.state.globalState.onboardingState.onboardingStarted @@ -524,6 +522,7 @@ class MainActivity : AppCompatActivity(), SnackbarHandler, ActivityResultCallbac backStack.isEmpty() -> { navigateToInitialScreen(intentWhichStartedActivity) } + isOnlyInitialRoute -> navigateToInitialScreen(intentWhichStartedActivity) else -> Unit } } diff --git a/app/src/main/java/com/tangem/tap/common/extensions/Blockchain.kt b/app/src/main/java/com/tangem/tap/common/extensions/Blockchain.kt index a0cf53059d..08c1b72a81 100644 --- a/app/src/main/java/com/tangem/tap/common/extensions/Blockchain.kt +++ b/app/src/main/java/com/tangem/tap/common/extensions/Blockchain.kt @@ -3,15 +3,16 @@ package com.tangem.tap.common.extensions import com.tangem.blockchain.common.Blockchain import com.tangem.common.extensions.remove -fun Blockchain.getNetworkName(): String { +fun Blockchain.getNetworkStandardName(): String { return when (this) { Blockchain.Ethereum, Blockchain.EthereumTestnet -> "ERC20" Blockchain.BSC, Blockchain.BSCTestnet -> "BEP20" Blockchain.Binance, Blockchain.BinanceTestnet -> "BEP2" Blockchain.Tron, Blockchain.TronTestnet -> "TRC20" + Blockchain.TON -> "TON" else -> "" } } -val Blockchain.fullNameWithoutTestnet - get() = this.fullName.remove(" Testnet") \ No newline at end of file +val Blockchain.networkNameWithoutTestnet + get() = this.getNetworkName().remove(" Testnet") \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/customtoken/impl/presentation/routers/DefaultCustomTokenRouter.kt b/app/src/main/java/com/tangem/tap/features/customtoken/impl/presentation/routers/DefaultCustomTokenRouter.kt index 858d49c31c..348c3492ce 100644 --- a/app/src/main/java/com/tangem/tap/features/customtoken/impl/presentation/routers/DefaultCustomTokenRouter.kt +++ b/app/src/main/java/com/tangem/tap/features/customtoken/impl/presentation/routers/DefaultCustomTokenRouter.kt @@ -25,7 +25,7 @@ internal class DefaultCustomTokenRouter : CustomTokenRouter { val alert = AppDialog.SimpleOkDialogRes( headerId = R.string.common_warning, messageId = R.string.alert_manage_tokens_unsupported_curve_message, - args = listOf(blockchain.fullName), + args = listOf(blockchain.getNetworkName()), ) store.dispatchDialogShow(alert) } diff --git a/app/src/main/java/com/tangem/tap/features/customtoken/impl/presentation/viewmodels/AddCustomTokenViewModel.kt b/app/src/main/java/com/tangem/tap/features/customtoken/impl/presentation/viewmodels/AddCustomTokenViewModel.kt index df99426334..0fadd8ea5b 100644 --- a/app/src/main/java/com/tangem/tap/features/customtoken/impl/presentation/viewmodels/AddCustomTokenViewModel.kt +++ b/app/src/main/java/com/tangem/tap/features/customtoken/impl/presentation/viewmodels/AddCustomTokenViewModel.kt @@ -190,7 +190,7 @@ internal class AddCustomTokenViewModel @Inject constructor( ) DerivationPathSelectorType.BLOCKCHAIN -> SelectorItem.TitleWithSubtitle( title = TextReference.Str(derivationPath), - subtitle = TextReference.Str(blockchain.fullName), + subtitle = TextReference.Str(blockchain.getNetworkName()), blockchain = blockchain, ) } @@ -204,7 +204,7 @@ internal class AddCustomTokenViewModel @Inject constructor( ) } else { SelectorItem.Title( - title = TextReference.Str(blockchain.fullName), + title = TextReference.Str(blockchain.getNetworkName()), blockchain = blockchain, ) } @@ -501,7 +501,7 @@ internal class AddCustomTokenViewModel @Inject constructor( return buildSet { if (!isSupportedToken && !isContractAddressFieldEmpty) { - add(AddCustomTokenWarning.UnsupportedToken(networkSelectorValue.fullName)) + add(AddCustomTokenWarning.UnsupportedToken(networkSelectorValue.getNetworkName())) } if (isCustomTokenAlreadyAdded()) { add(AddCustomTokenWarning.TokenAlreadyAdded) diff --git a/app/src/main/java/com/tangem/tap/features/details/ui/securitymode/SecurityModeViewModel.kt b/app/src/main/java/com/tangem/tap/features/details/ui/securitymode/SecurityModeViewModel.kt index 5f0d54717e..a97cb68bfe 100644 --- a/app/src/main/java/com/tangem/tap/features/details/ui/securitymode/SecurityModeViewModel.kt +++ b/app/src/main/java/com/tangem/tap/features/details/ui/securitymode/SecurityModeViewModel.kt @@ -1,25 +1,18 @@ package com.tangem.tap.features.details.ui.securitymode -import android.os.Bundle -import androidx.lifecycle.SavedStateHandle import androidx.lifecycle.ViewModel import androidx.lifecycle.viewModelScope -import arrow.core.getOrElse import com.tangem.common.CompletionResult import com.tangem.common.core.TangemSdkError -import com.tangem.common.routing.AppRoute import com.tangem.common.routing.AppRouter -import com.tangem.common.routing.bundle.unbundle import com.tangem.core.analytics.Analytics import com.tangem.domain.common.util.cardTypesResolver -import com.tangem.domain.wallets.models.UserWallet -import com.tangem.domain.wallets.models.UserWalletId -import com.tangem.domain.wallets.usecase.GetUserWalletUseCase import com.tangem.tap.common.analytics.events.AnalyticsParam import com.tangem.tap.common.analytics.events.Settings import com.tangem.tap.common.extensions.dispatchNavigationAction import com.tangem.tap.domain.sdk.TangemSdkManager import com.tangem.tap.features.details.redux.SecurityOption +import com.tangem.tap.features.details.ui.cardsettings.domain.CardSettingsInteractor import com.tangem.tap.features.details.ui.common.utils.getAllowedSecurityOptions import com.tangem.tap.features.details.ui.common.utils.getCurrentSecurityOption import com.tangem.tap.store @@ -31,24 +24,18 @@ import javax.inject.Inject @HiltViewModel internal class SecurityModeViewModel @Inject constructor( - private val getUserWalletUseCase: GetUserWalletUseCase, private val tangemSdkManager: TangemSdkManager, - savedStateHandle: SavedStateHandle, + private val cardSettingsInteractor: CardSettingsInteractor, ) : ViewModel() { - private val userWalletId = savedStateHandle.get(AppRoute.DetailsSecurity.USER_WALLET_ID_KEY) - ?.unbundle(UserWalletId.serializer()) - ?: error("UserWalletId is required for SecurityModeViewModel") + private val scannedScanResponse = cardSettingsInteractor.scannedScanResponse.value + ?: error("Scan response is null") - val screenState = MutableStateFlow( - value = getInitialState(), - ) + val screenState = MutableStateFlow(value = getInitialState()) private fun getInitialState(): SecurityModeScreenState { - val userWallet = getUserWallet() - val scanResponse = userWallet.scanResponse - val card = scanResponse.card - val cardTypesResolver = scanResponse.cardTypesResolver + val card = scannedScanResponse.card + val cardTypesResolver = scannedScanResponse.cardTypesResolver val currentSecurityOption = getCurrentSecurityOption(card) val allowedSecurityOptions = getAllowedSecurityOptions(card, cardTypesResolver, currentSecurityOption) @@ -66,14 +53,13 @@ internal class SecurityModeViewModel @Inject constructor( screenState.update { state -> state.copy( selectedSecurityMode = securityOption, - isSaveChangesEnabled = securityOption != getCurrentSecurityOption(getUserWallet().scanResponse.card), + isSaveChangesEnabled = securityOption != getCurrentSecurityOption(scannedScanResponse.card), ) } } private fun saveChanges() { - val userWallet = getUserWallet() - val cardId = userWallet.cardId + val cardId = scannedScanResponse.card.cardId val selectedOption = screenState.value.selectedSecurityMode viewModelScope.launch { @@ -83,6 +69,15 @@ internal class SecurityModeViewModel @Inject constructor( SecurityOption.AccessCode -> tangemSdkManager.setAccessCode(cardId) } + cardSettingsInteractor.update { + it.copy( + card = it.card.copy( + isAccessCodeSet = selectedOption == SecurityOption.AccessCode, + isPasscodeSet = selectedOption == SecurityOption.PassCode, + ), + ) + } + val paramValue = AnalyticsParam.SecurityMode.from(selectedOption) when (result) { is CompletionResult.Success -> { @@ -100,10 +95,4 @@ internal class SecurityModeViewModel @Inject constructor( } } } - - private fun getUserWallet(): UserWallet { - return getUserWalletUseCase(userWalletId).getOrElse { - error("Unable to get user wallet $userWalletId: $it") - } - } } \ No newline at end of file diff --git a/app/src/main/java/com/tangem/tap/features/tokens/impl/presentation/router/DefaultTokensListRouter.kt b/app/src/main/java/com/tangem/tap/features/tokens/impl/presentation/router/DefaultTokensListRouter.kt index 987034d99b..d9142d235c 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/impl/presentation/router/DefaultTokensListRouter.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/impl/presentation/router/DefaultTokensListRouter.kt @@ -51,7 +51,7 @@ internal class DefaultTokensListRouter : TokensListRouter { val alert = AppDialog.SimpleOkDialogRes( headerId = R.string.common_warning, messageId = R.string.alert_manage_tokens_unsupported_curve_message, - args = listOf(blockchain.fullName), + args = listOf(blockchain.getNetworkName()), ) store.dispatchDialogShow(alert) } diff --git a/app/src/main/java/com/tangem/tap/features/tokens/impl/presentation/viewmodels/TokensListViewModel.kt b/app/src/main/java/com/tangem/tap/features/tokens/impl/presentation/viewmodels/TokensListViewModel.kt index 6e471d192d..736278526e 100644 --- a/app/src/main/java/com/tangem/tap/features/tokens/impl/presentation/viewmodels/TokensListViewModel.kt +++ b/app/src/main/java/com/tangem/tap/features/tokens/impl/presentation/viewmodels/TokensListViewModel.kt @@ -24,8 +24,8 @@ import com.tangem.domain.tokens.AddCryptoCurrenciesUseCase import com.tangem.domain.tokens.GetCryptoCurrenciesUseCase import com.tangem.domain.tokens.TokenWithBlockchain import com.tangem.domain.wallets.usecase.GetSelectedWalletSyncUseCase -import com.tangem.tap.common.extensions.fullNameWithoutTestnet -import com.tangem.tap.common.extensions.getNetworkName +import com.tangem.tap.common.extensions.networkNameWithoutTestnet +import com.tangem.tap.common.extensions.getNetworkStandardName import com.tangem.tap.features.customtoken.impl.presentation.models.SupportBlockchainType import com.tangem.tap.features.tokens.impl.domain.TokensListInteractor import com.tangem.tap.features.tokens.impl.domain.models.Token @@ -185,7 +185,7 @@ internal class TokensListViewModel @Inject constructor( private fun createManageNetworkContent(network: Network): NetworkItemState.ManageContent { return NetworkItemState.ManageContent( - name = network.blockchain.fullNameWithoutTestnet.uppercase(), + name = network.blockchain.networkNameWithoutTestnet.uppercase(), protocolName = getNetworkProtocolName(network), iconResId = mutableIntStateOf(value = getNetworkIconResId(network.address, network.blockchain)), isMainNetwork = isMainNetwork(network), @@ -214,7 +214,7 @@ internal class TokensListViewModel @Inject constructor( private fun createReadNetworkContent(network: Network): NetworkItemState.ReadContent { return NetworkItemState.ReadContent( - name = network.blockchain.fullNameWithoutTestnet.uppercase(), + name = network.blockchain.networkNameWithoutTestnet.uppercase(), protocolName = getNetworkProtocolName(network), iconResId = mutableIntStateOf(value = getNetworkIconResId(network.address, network.blockchain)), isMainNetwork = isMainNetwork(network), @@ -227,7 +227,7 @@ internal class TokensListViewModel @Inject constructor( return if (network.address == null) { MAIN_NETWORK_LABEL } else { - network.blockchain.getNetworkName().uppercase() + network.blockchain.getNetworkStandardName().uppercase() } } @@ -361,7 +361,7 @@ internal class TokensListViewModel @Inject constructor( router.openUnableHideMainTokenAlert( tokenName = blockchain.name, tokenSymbol = blockchain.currency, - networkName = blockchain.fullName, + networkName = blockchain.getNetworkName(), ) } else if (isAddedOnMainScreen) { router.openRemoveWalletAlert( @@ -431,7 +431,7 @@ internal class TokensListViewModel @Inject constructor( } else { when (isUnsupportedToken(token.blockchain)) { SupportTokensState.NetworkTokensUnsupported -> { - router.openNetworkTokensNotSupportAlert(token.blockchain.fullName) + router.openNetworkTokensNotSupportAlert(token.blockchain.getNetworkName()) } SupportTokensState.SupportedToken -> { analyticsSender.sendWhenTokenAdded(token.token) diff --git a/app/src/main/java/com/tangem/tap/routing/impl/DefaultRoutingComponent.kt b/app/src/main/java/com/tangem/tap/routing/impl/DefaultRoutingComponent.kt index e766371cb7..c3cd524d98 100644 --- a/app/src/main/java/com/tangem/tap/routing/impl/DefaultRoutingComponent.kt +++ b/app/src/main/java/com/tangem/tap/routing/impl/DefaultRoutingComponent.kt @@ -44,7 +44,7 @@ internal class DefaultRoutingComponent @AssistedInject constructor( private fun getInitialRoute(): AppRoute = AppRoute.Initial private fun child(route: AppRoute, context: ComponentContext): Child { - return childFactory.createChild(route, { childByContext(context) }) + return childFactory.createChild(route) { childByContext(context) } } @AssistedFactory diff --git a/app/src/test/kotlin/com/tangem/tap/domain/card/CryptoCurrenciesMocks.kt b/app/src/test/kotlin/com/tangem/tap/domain/card/CryptoCurrenciesMocks.kt index aadeccf980..6cb075061a 100644 --- a/app/src/test/kotlin/com/tangem/tap/domain/card/CryptoCurrenciesMocks.kt +++ b/app/src/test/kotlin/com/tangem/tap/domain/card/CryptoCurrenciesMocks.kt @@ -58,7 +58,7 @@ internal class CryptoCurrenciesMocks(private val scanResponse: ScanResponse) { network = Network( id = Network.ID(value = blockchain.id), backendId = "NEVER-MIND", - name = blockchain.fullName, + name = blockchain.getNetworkName(), currencySymbol = "NEVER-MIND", derivationPath = Network.DerivationPath.Custom( value = derivationBlockchain.derivationPath( diff --git a/common/ui/src/main/java/com/tangem/common/ui/bottomsheet/permission/GiveTxPermisssionBottomSheet.kt b/common/ui/src/main/java/com/tangem/common/ui/bottomsheet/permission/GiveTxPermisssionBottomSheet.kt index f59c494895..ba65ad6d9c 100644 --- a/common/ui/src/main/java/com/tangem/common/ui/bottomsheet/permission/GiveTxPermisssionBottomSheet.kt +++ b/common/ui/src/main/java/com/tangem/common/ui/bottomsheet/permission/GiveTxPermisssionBottomSheet.kt @@ -28,13 +28,14 @@ import com.tangem.common.ui.R import com.tangem.common.ui.bottomsheet.permission.state.* import com.tangem.core.ui.components.* import com.tangem.core.ui.components.appbar.models.TopAppBarButtonUM -import com.tangem.core.ui.components.atoms.text.EllipsisText import com.tangem.core.ui.components.bottomsheets.TangemBottomSheet import com.tangem.core.ui.components.bottomsheets.TangemBottomSheetConfig import com.tangem.core.ui.components.containers.FooterContainer +import com.tangem.core.ui.components.inputrow.InputRowDefault import com.tangem.core.ui.extensions.TextReference import com.tangem.core.ui.extensions.resolveReference import com.tangem.core.ui.extensions.resourceReference +import com.tangem.core.ui.extensions.wrappedList import com.tangem.core.ui.res.TangemTheme import com.tangem.core.ui.res.TangemThemePreview import kotlinx.collections.immutable.ImmutableList @@ -136,33 +137,13 @@ private fun ApprovalBottomSheetInfo(data: GiveTxPermissionState.ReadyForRequest) @Composable private fun FeeItem(fee: TextReference) { - Row( + InputRowDefault( + title = resourceReference(R.string.common_network_fee_title), + text = fee, modifier = Modifier - .fillMaxWidth() .clip(TangemTheme.shapes.roundedCornersXMedium) - .background(TangemTheme.colors.background.action) - .padding( - top = TangemTheme.dimens.spacing16, - bottom = TangemTheme.dimens.spacing16, - start = TangemTheme.dimens.spacing12, - end = TangemTheme.dimens.spacing16, - ), - horizontalArrangement = Arrangement.SpaceBetween, - verticalAlignment = Alignment.CenterVertically, - ) { - Text( - text = stringResource(R.string.common_network_fee_title), - color = TangemTheme.colors.text.primary1, - style = TangemTheme.typography.subtitle1, - maxLines = 1, - ) - EllipsisText( - text = fee.resolveReference(), - color = TangemTheme.colors.text.tertiary, - style = TangemTheme.typography.body1, - modifier = Modifier.padding(start = TangemTheme.dimens.spacing16), - ) - } + .background(TangemTheme.colors.background.action), + ) } @Composable @@ -193,7 +174,7 @@ private fun AmountItem( top = TangemTheme.dimens.spacing16, bottom = TangemTheme.dimens.spacing16, start = TangemTheme.dimens.spacing12, - end = TangemTheme.dimens.spacing16, + end = TangemTheme.dimens.spacing12, ), horizontalArrangement = Arrangement.SpaceBetween, verticalAlignment = Alignment.CenterVertically, @@ -204,6 +185,7 @@ private fun AmountItem( style = TangemTheme.typography.subtitle1, maxLines = 1, ) + SpacerWMax() Text( text = stringResource( when (approveType) { @@ -215,6 +197,12 @@ private fun AmountItem( style = TangemTheme.typography.body1, maxLines = 1, ) + Icon( + painter = rememberVectorPainter(ImageVector.vectorResource(id = R.drawable.ic_chevron_24)), + contentDescription = null, + tint = TangemTheme.colors.icon.informative, + modifier = Modifier.padding(start = TangemTheme.dimens.spacing2), + ) } DropdownSelector( isExpanded = isExpandSelector, @@ -303,6 +291,7 @@ private fun DropdownSelector( @Composable @Preview(showBackground = true) @Preview(showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES) +@Preview(showBackground = true, locale = "ru") private fun Preview_GiveTxPermissionBottomSheet() { TangemThemePreview { GiveTxPermissionBottomSheet( @@ -321,12 +310,12 @@ private val previewData = GiveTxPermissionBottomSheetConfig( amount = "1", walletAddress = "", spenderAddress = "", - fee = TextReference.Str("2,14$"), - approveType = ApproveType.UNLIMITED, + fee = TextReference.Str("0.1233 BTC (2,14$)"), + approveType = ApproveType.LIMITED, approveButton = ApprovePermissionButton(true) {}, cancelButton = CancelPermissionButton(true), - onChangeApproveType = { ApproveType.UNLIMITED }, - subtitle = resourceReference(R.string.give_permission_staking_subtitle), + onChangeApproveType = { ApproveType.LIMITED }, + subtitle = resourceReference(R.string.give_permission_staking_subtitle, wrappedList("1")), dialogText = resourceReference(R.string.give_permission_staking_footer), ), onCancel = {}, diff --git a/core/res/src/main/res/values-de/strings.xml b/core/res/src/main/res/values-de/strings.xml index 0123a1dfdd..6d99e6bd52 100644 --- a/core/res/src/main/res/values-de/strings.xml +++ b/core/res/src/main/res/values-de/strings.xml @@ -46,7 +46,7 @@ Deaktiviere diese Option, wenn du nicht möchtest, dass diese Karte zum Zurücksetzen von Zugangscodes auf anderen Karten in dieser Wallets verwendet wird. Bitte beachte, dass du dann auch den Zugangscode auf dieser Karte nicht zurücksetzen kannst. Ermöglicht die Verwendung dieser Karte zum Zurücksetzen des Zugangscodes auf anderen Karten in dieser Brieftasche - Zugangscodes wiederherstellen + Zugangspin resetten Zurücksetzen Möchtest du das wirklich tun? Zugangscode ändern @@ -653,6 +653,7 @@ Effektiver Jahreszins Verfügbar Durchschnittliche Belohnungsquote + Was sit Staking? %s geschätzter Profit Marktbewertung Metriken @@ -668,10 +669,9 @@ Der Zeitraum, den du nach der Beantragung der Abhebung von Geldern aus dem Staking warten musst, bevor die Token verfügbar werden. Aufwärmphase Die zugewiesene Zeit für die Aktivierung der Teilnahme am Staking. - Stake %s Migrieren Natives Staking - Mit Staking kannst du %1s verdienen. Deine Staking-Belohnungen kommen alle ~%2s Tage. + Mit Staking kannst du %1$s verdienen. Deine Staking-Belohnungen kommen alle ~%2$s Tage. Verdiene Staking-Belohnungen Die Belohnungen werden sofort nach dem unstaken gestoppt. Der unstakingprozess dauert %s. Erneut binden @@ -679,14 +679,26 @@ Belohnungen erneut staken Widerrufen Neuwahl + automatisch + händisch + Block + Tag + Epoche + Ära + Stunde + Monat + Woche Belohnungen Stake gesperrt Mehr staken + Stake %s + Staking beenden%s gelocktes unlocken Unstaken Prüfe, was nicht eingesetzt wurde, um dein Vermögen zu beanspruchen Staking beenden Validator/ Prüfer + Validatoren Abstimmung Abstimmung gesperrt Zurückziehen @@ -822,7 +834,7 @@ Aktivierungsfehler Laut den Entwicklern des BNB-Netzes wird die Unterstützung für den BEP-2-Standard im Juni 2024 enden. Um den Verlust von Vermögenswerten mit diesem Standard zu vermeiden, konvertiere bitte in den BEP-20 Standard. Nutze gerne unseren Swap-Service, um sie auf das BNB Smart Chain Netzwerk zu übertragen. BNB Beacon Chain wird abgeschaltet - verbesserungswürdig + ausbaufähig Gefällt mir OK, habe ich verstanden! Echt toll! diff --git a/core/res/src/main/res/values-fr/strings.xml b/core/res/src/main/res/values-fr/strings.xml index 071924cd18..3c55b9ec8c 100644 --- a/core/res/src/main/res/values-fr/strings.xml +++ b/core/res/src/main/res/values-fr/strings.xml @@ -594,7 +594,7 @@ Période d\'échauffement Le temps imparti pour activer la participation au staking. Native staking - Le staking vous permet d\'en gagner %1s. Vos récompenses de staking arrivent tous les ~%2s jours. + Le staking vous permet d\'en gagner %1$s. Vos récompenses de staking arrivent tous les ~%2$s jours. Gagnez des récompenses de staking Récompenses Staker plus diff --git a/core/res/src/main/res/values-ja/strings.xml b/core/res/src/main/res/values-ja/strings.xml index d9c7168c7a..d5d7502641 100644 --- a/core/res/src/main/res/values-ja/strings.xml +++ b/core/res/src/main/res/values-ja/strings.xml @@ -657,10 +657,9 @@ ステーキングから資金の引き出しを要求した後、トークンが利用可能になるまでの待機期間。 ウォームアップ期間 ステーキングへの参加を有効にするために割り当てられた時間。 - %sをステーキングする 移行 ネイティブステーキング - ステーキングにより%1sを獲得できます。ステーキング報酬は ~ %2s日ごとに届きます。 + ステーキングにより%1$sを獲得できます。ステーキング報酬は ~ %2$s日ごとに届きます。 ステーキング報酬を獲得 ステーキング解除後、報酬の獲得はすぐに停止します。ステーキング解除プロセスには%sかかります。 再結束 @@ -668,9 +667,20 @@ 報酬をステーキングする 取り消す 再投票 + 自動 + 手動 + ブロック + + エポック + 時代 + + + 報酬 ステーキングはロックされています もっとステーキングする + %sをステーキングする + %sのステーキング解除 ステーキング解除はロックされています スタックされていない 資産を請求するために、unstakedを確認してください diff --git a/core/res/src/main/res/values-ru/strings.xml b/core/res/src/main/res/values-ru/strings.xml index f9f2f33750..f7c6ecf61c 100644 --- a/core/res/src/main/res/values-ru/strings.xml +++ b/core/res/src/main/res/values-ru/strings.xml @@ -38,6 +38,7 @@ Слишком много попыток Вы отключили биометрическую аутентификацию на вашем телефоне и не сможете сохранять кошельки в приложении. Для сохранения кошельков, пожалуйста, включите функцию биометрической аутентификации в настройках телефона. Начать резервное копирование + С помощью банковской карты или банковского аккаунта %d карта %d карты @@ -134,7 +135,7 @@ Переименовать Сохранить Сохранить изменения - Искать + Поиск на маркете Поиск токенов Seed-фраза Выберите действие @@ -268,6 +269,7 @@ Токены не найдены. Пожалуйста, попробуйте другой запрос ID: %s ID транзакции скопирован + С другой валютой в вашем кошельке Информация ниже не является обязательной. Вы можете стереть её, если хотите. Расскажите, каких функций вам не хватает, и мы постараемся вам помочь. Скажите, пожалуйста, какая у вас карта? @@ -278,7 +280,7 @@ Обращение в поддержку Обращение в поддержку Tangem Не могу отправить транзакцию - Текущая транзакция + Транзакция Комиссия сети за одобрение токена будет взиматься за подтверждение того, что именно вы разрешаете использовать ваш токен для обмена. Укажите лимит доступа к выбранному токену Количество %s @@ -334,9 +336,50 @@ Голосовать Выберите кошелек Кошелёк не поддерживает более одной сети - Чтобы создать адреса для выбранных сетей, необходимо отсканировать свой кошелек Tangem. + Чтобы купить, обменять или получить данный токен вам нужно добавить его к себе в портфель + Этот актив недоступен + Добавить в портфель + Доступные сети + Мой портфель + Рынок + Чтобы создать адреса для выбранных сетей, отсканируйте вашу карту Tangem кошелька + Результат + Токены с капитализацией меньше 100к + Показать токены + Нет результата + Выберите кошелек + 1мин + 1год + 24ч + + + Все + Опытные покупатели + Рейтинг + Сортировать по + Лидеры роста + Лидеры падения + В тренде + Сайт блокчейна + Разница между объемом покупателей и продавцов + Высокий + Держатели + Изменение количества держателей токенов в течение выбранного периода времени + Инсайты Ссылки + Ликвидность + Изменение объема ликвидности, доступной для токена в течение указанного периода времени. + Низкий + Рыночная капитализация + Общая рыночная стоимость криптовалюты, рассчитываемая путем умножения текущей цены монеты на общее количество монет в обращении. + Рыночный рейтинг Метрики + Официальные ссылки + Репозиторий + Оценка безопасности + Социальные + Объем торгов (24ч) + Общая сумма криптовалюты, которая была продана за последние 24 часа, показывающая уровень активности и ликвидности на рынке. Вам необходимо установить единый код доступа для защиты всех ваших карт Защита Позже вы сможете установить индивидуальный код доступа для каждой карты @@ -441,6 +484,7 @@ Доступ к камере запрещен %1$s (%2$s) в сети %3$s Отправляйте только %s на этот адрес. Использование другой сети может привести к утрате средств. + Покажи QR-код или поделись своим адресом Участвовать Не удалось загрузить информацию по реферальной программе. Пожалуйста, попробуйте позже. Не удалось загрузить информацию по реферальной программе. Код ошибки: %s. Пожалуйста, попробуйте позже. @@ -604,10 +648,9 @@ Период, который необходимо подождать после запроса на вывод средств из стейкинга, прежде чем токены станут доступны. Период прогрева Время, необходимое для начала процесса стейкинга и активации процесса начисления наград - Застейкать %s Переместить Нативный стейкинг - Стейкинг дает возможность вам получать %1s. Награда будет зачисляться каждый %2s + Стейкинг дает возможность вам получать %1$s. Награда будет зачисляться каждый %2$s Получите награду за стейкинг Награда перестанет начисляться сразу после завершения стейкинга. Процесс завершения длится %s. Повторный стейкинг @@ -616,6 +659,7 @@ Переголосовать Вознаграждения Застейкать еще + Застейкать %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 14a8373849..bdb802eb7e 100644 --- a/core/res/src/main/res/values-uk-rUA/strings.xml +++ b/core/res/src/main/res/values-uk-rUA/strings.xml @@ -2,7 +2,7 @@ Оберіть мережу Додати токен - Керування токенами + Токени Надсилайте тільки %1$s (%2$s) в мережі %3$s на цю адресу. Використання іншої мережі може призвести до втрати коштів. Як сканувати Звернутися в підтримку @@ -659,10 +659,12 @@ Активний Щоб вивести активи зі стейкінгу, натисніть тут. Сума для стейкінгу має бути не менше %s + Зняти кошти Річний відсоток, який ви можете отримати, беручи участь у стейкінгу. APR Доступно Середня ставка винагороди + Що таке стейкінг? ~ прибуток за %s Рейтинг ринку Метрики @@ -678,15 +680,38 @@ Період, який ви повинні чекати після запиту на виведення коштів зі стейкінгу, перш ніж токени стануть доступними. Період блокування Відведений час для активації участі в стейкінгу. - Стейкінг %s + Перемістити Нативний стейкінг - Стейкінг дозволяє заробляти %1s. Ваші винагороди за стейкінг надходять кожні ~%2s днів. + Стейкінг дозволяє заробляти %1$s. Ваші винагороди за стейкінг надходять кожні ~%2$s днів. Отримуйте винагороду за стейкінг + Винагороди припиняють нараховуватися одразу після того, як ви знімаєте ставку. Процес зняття займає %s. + Зʼєднати ще раз + Повторно застейкати + Застейкати винагороди + Відкликати + Переголосувати + Автоматично + Вручну + Блок + День + Епоха + Ера + Година + Місяць + Тиждень Винагороди + Застейкати Застейкати більше - Не застейканий + Застейкати %s + Зняти зі стейкінгу %s + Розблокувати + Скасовано зі стейкінгу Перевірити незастейкані, щоб отримати свої активи + Зняти зі стейкінгу Валідатор + Проголосувати + Голос заблоковано + Зняти Тримайте свою криптовалюту в безпеці. Приватні ключі надійно зберігаються на картці. Революційний апаратний гаманець До трьох карток з одним гаманцем @@ -886,7 +911,7 @@ Так, поновити Відмовитися Якщо зараз відмовитися, то доведеться скинути картки до заводських налаштувань, щоб почати спочатку - Відновити резервне копіювання + Відновити бекап Це незворотна дія Увійдіть за допомогою %s Сканувати картку diff --git a/core/res/src/main/res/values/strings.xml b/core/res/src/main/res/values/strings.xml index b277ef22a8..5a4b8c08bb 100644 --- a/core/res/src/main/res/values/strings.xml +++ b/core/res/src/main/res/values/strings.xml @@ -133,7 +133,7 @@ Rename Save Save changes - Search + Search through the market Search tokens Seed phrase Select action @@ -278,7 +278,7 @@ Feedback Tangem feedback Can\'t send a transaction - Current transaction + Transaction The network will charge a token approval fee to verify that you are authorizing the use of your token for the swap. Specify the approve limit for the selected token Amount %s @@ -334,14 +334,14 @@ Upvote Choose wallet The wallet doesn\'t support more than one network - To start buying, exchanging or receiving this asset, add this token to at least 1 network + To buy, exchange, or receive this asset, add it to your portfolio This asset is not available Add to portfolio Add token Available networks My portfolio Market - To generate addresses for selected networks, you must scan your Tangem Wallet card. + To generate addresses for selected networks, you must scan your Tangem Wallet card Unable to load the data… Quick actions Result @@ -361,7 +361,7 @@ Rating Sort By Top Gainers - Top losers + Top Losers Trending About %s @@ -656,7 +656,7 @@ Minimum Requirement No rewards to claim Reward claiming - A way to receive staking rewards. It can be claimed automatically or manually. + Method of receiving staking rewards.\nIt can be either automatic, where the reward is credited to your address, or manual, where you need to withdraw the reward by creating a transaction to receive it. Reward schedule This is a schedule that determines when participants in staking receive their rewards. Rewards to claim: %s @@ -665,10 +665,9 @@ The period you must wait after requesting to withdraw funds from staking before the tokens become available. Warmup period The allocated time for activating participation in staking. - Stake %s Migrate Native staking - Staking allow you to earn %1s. Your staking rewards arrive every ~%2s days. + Staking allow you to earn %1$s. Your staking rewards arrive every ~%2$s days. Earn staking rewards Rewards stop accruing immediately after you unstake. The unstaking process takes %s. Rebond @@ -676,14 +675,26 @@ Restake rewards Revoke Revote + Auto + Manual + Block + Day + Epoch + Era + Hour + Month + Week Rewards Stake locked Stake more + Stake %s + Unstake %s Unlock locked Unstaked Check unstaked to claim your assets Unstaking Validator + Validators Vote Vote locked Withdraw diff --git a/data/tokens/src/main/kotlin/com/tangem/data/tokens/paging/CoinsResponseConverter.kt b/data/tokens/src/main/kotlin/com/tangem/data/tokens/paging/CoinsResponseConverter.kt index 17e39d7f0d..a1a8018cab 100644 --- a/data/tokens/src/main/kotlin/com/tangem/data/tokens/paging/CoinsResponseConverter.kt +++ b/data/tokens/src/main/kotlin/com/tangem/data/tokens/paging/CoinsResponseConverter.kt @@ -32,7 +32,7 @@ internal object CoinsResponseConverter : Converter> { Token.Network( networkId = network.networkId, standardType = getNetworkStandardType(blockchain).name, - name = blockchain.fullName, + name = blockchain.getNetworkName(), address = network.contractAddress, iconUrl = getIconUrl(network.networkId, value.imageHost), decimalCount = network.decimalCount?.toInt(), diff --git a/data/tokens/src/main/kotlin/com/tangem/data/tokens/utils/NetworkOperations.kt b/data/tokens/src/main/kotlin/com/tangem/data/tokens/utils/NetworkOperations.kt index 251a2b420f..c7986bd414 100644 --- a/data/tokens/src/main/kotlin/com/tangem/data/tokens/utils/NetworkOperations.kt +++ b/data/tokens/src/main/kotlin/com/tangem/data/tokens/utils/NetworkOperations.kt @@ -24,7 +24,7 @@ internal fun getNetwork( return Network( id = Network.ID(blockchain.id), backendId = blockchain.toNetworkId(), - name = blockchain.fullName, + name = blockchain.getNetworkName(), isTestnet = blockchain.isTestnet(), derivationPath = getNetworkDerivationPath(blockchain, extraDerivationPath, derivationStyleProvider), currencySymbol = blockchain.currency, diff --git a/data/tokens/src/main/kotlin/com/tangem/data/tokens/utils/ResponseCryptoCurrenciesFactory.kt b/data/tokens/src/main/kotlin/com/tangem/data/tokens/utils/ResponseCryptoCurrenciesFactory.kt index 909d818b47..0ad1df2428 100644 --- a/data/tokens/src/main/kotlin/com/tangem/data/tokens/utils/ResponseCryptoCurrenciesFactory.kt +++ b/data/tokens/src/main/kotlin/com/tangem/data/tokens/utils/ResponseCryptoCurrenciesFactory.kt @@ -105,6 +105,7 @@ class ResponseCryptoCurrenciesFactory { Blockchain.BaseTestnet, Blockchain.Telos, Blockchain.Cronos, + Blockchain.TON, Blockchain.Cyber, -> this.fullName else -> responseToken.name diff --git a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/GetCurrencyWarningsUseCase.kt b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/GetCurrencyWarningsUseCase.kt index 29592489a4..c4e96be175 100644 --- a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/GetCurrencyWarningsUseCase.kt +++ b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/GetCurrencyWarningsUseCase.kt @@ -14,7 +14,6 @@ import com.tangem.feature.swap.domain.api.SwapRepository import com.tangem.feature.swap.domain.models.domain.LeastTokenInfo import com.tangem.lib.crypto.BlockchainUtils import com.tangem.utils.coroutines.CoroutineDispatcherProvider -import com.tangem.utils.coroutines.runCatching import com.tangem.utils.isNullOrZero import kotlinx.coroutines.flow.* import java.math.BigDecimal @@ -86,57 +85,49 @@ class GetCurrencyWarningsUseCase( currencyStatus: CryptoCurrencyStatus, ): Flow { val currency = currencyStatus.currency - val cryptoStatuses = operations.getCurrenciesStatusesSync() + val cryptoCurrencyStatuses = operations.getCurrenciesStatusesSync().getOrNull() ?: emptyList() val promoBanner = promoRepository.getOkxPromoBanner() + val pairs = swapRepository.getPairsOnly( + LeastTokenInfo( + contractAddress = (currency as? CryptoCurrency.Token)?.contractAddress ?: "0", + network = currency.network.backendId, + ), + cryptoCurrencyStatuses.map { it.currency }, + ).pairs return combine( showSwapPromoTokenUseCase().conflate(), flowOf(marketCryptoCurrencyRepository.isExchangeable(userWalletId, currency)).conflate(), ) { shouldShowSwapPromo, isExchangeable -> promoBanner ?: return@combine null - val showPromo = promoBanner.isActive && shouldShowSwapPromo - if (showPromo && isExchangeable && currencyStatus.value !is CryptoCurrencyStatus.Unreachable) { - cryptoStatuses.fold( - ifLeft = { null }, - ifRight = { cryptoCurrencyStatuses -> - val pairs = runCatching(dispatchers.io) { - swapRepository.getPairsOnly( - LeastTokenInfo( - contractAddress = (currency as? CryptoCurrency.Token)?.contractAddress ?: "0", - network = currency.network.backendId, - ), - cryptoCurrencyStatuses.map { it.currency }, - ) - }.getOrNull()?.pairs ?: emptyList() - - val filteredCurrencies = cryptoCurrencyStatuses.filterNot { - it.currency.id == currency.id + val showPromoBannerActive = promoBanner.isActive && shouldShowSwapPromo + if (showPromoBannerActive && isExchangeable && currencyStatus.value !is CryptoCurrencyStatus.Unreachable) { + val filteredCurrencies = cryptoCurrencyStatuses.filterNot { + it.currency.id == currency.id + } + val currencyPairs = pairs.filter { + it.from.network == currency.network.backendId || + it.to.network == currency.network.backendId + } + val showPromoForPair = currencyPairs.any { pair -> + val availablePair = if (currencyStatus.value.amount.isNullOrZero()) { + filteredCurrencies.filterNot { it.value.amount.isNullOrZero() } + } else { + filteredCurrencies + } + availablePair + .any { + it.currency.network.backendId == pair.to.network || + it.currency.network.backendId == pair.from.network } - val currencyPairs = pairs.filter { - it.from.network == currency.network.backendId || - it.to.network == currency.network.backendId - } - val showPromo = currencyPairs.any { pair -> - val availablePair = if (currencyStatus.value.amount.isNullOrZero()) { - filteredCurrencies.filterNot { it.value.amount.isNullOrZero() } - } else { - filteredCurrencies - } - availablePair - .any { - it.currency.network.backendId == pair.to.network || - it.currency.network.backendId == pair.from.network - } - } - if (showPromo) { - CryptoCurrencyWarning.SwapPromo( - startDateTime = promoBanner.bannerState.timeline.start, - endDateTime = promoBanner.bannerState.timeline.end, - ) - } else { - null - } - }, - ) + } + if (showPromoForPair) { + CryptoCurrencyWarning.SwapPromo( + startDateTime = promoBanner.bannerState.timeline.start, + endDateTime = promoBanner.bannerState.timeline.end, + ) + } else { + null + } } else { null } diff --git a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/send/FeeBlock.kt b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/send/FeeBlock.kt index 1c8e735b07..c43df695b9 100644 --- a/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/send/FeeBlock.kt +++ b/features/send/impl/src/main/java/com/tangem/features/send/impl/presentation/ui/send/FeeBlock.kt @@ -39,7 +39,7 @@ internal fun FeeBlock(feeState: SendStates.FeeState, isClickDisabled: Boolean, o ) { Text( text = stringResource(R.string.common_network_fee_title), - style = TangemTheme.typography.subtitle2, + style = TangemTheme.typography.subtitle1, color = TangemTheme.colors.text.secondary, ) diff --git a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/transformers/SetInitialDataStateTransformer.kt b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/transformers/SetInitialDataStateTransformer.kt index 30711535be..1f330602ec 100644 --- a/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/transformers/SetInitialDataStateTransformer.kt +++ b/features/staking/impl/src/main/java/com/tangem/features/staking/impl/presentation/state/transformers/SetInitialDataStateTransformer.kt @@ -58,7 +58,7 @@ internal class SetInitialDataStateTransformer( override fun transform(prevState: StakingUiState): StakingUiState { return prevState.copy( title = TextReference.Res( - R.string.staking_initial_info_title, + R.string.staking_title_stake, wrappedList(cryptoCurrencyStatusProvider().currency.name), ), clickIntents = clickIntents, diff --git a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractorImpl.kt b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractorImpl.kt index 369fd439ad..184a6886ca 100644 --- a/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractorImpl.kt +++ b/features/swap/domain/src/main/java/com/tangem/feature/swap/domain/SwapInteractorImpl.kt @@ -1911,7 +1911,7 @@ internal class SwapInteractorImpl @Inject constructor( } else { SwapFeeState.NotEnough( feeCurrency = fromTokenStatus.currency, - currencyName = fromTokenStatus.currency.network.name, + currencyName = fromTokenStatus.currency.name, currencySymbol = fromTokenStatus.currency.symbol, ) } diff --git a/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/SwapSuccessScreen.kt b/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/SwapSuccessScreen.kt index 335a399520..d95ec56762 100644 --- a/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/SwapSuccessScreen.kt +++ b/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/SwapSuccessScreen.kt @@ -28,6 +28,7 @@ import com.tangem.feature.swap.presentation.R fun SwapSuccessScreen(state: SwapSuccessStateHolder, onBack: () -> Unit) { Scaffold( modifier = Modifier.systemBarsPadding(), + backgroundColor = TangemTheme.colors.background.tertiary, content = { padding -> SwapSuccessScreenContent(padding = padding, state = state) }, diff --git a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/TokenDetailsSwapTransactionsStateConverter.kt b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/TokenDetailsSwapTransactionsStateConverter.kt index 15523c353c..d640fc414e 100644 --- a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/TokenDetailsSwapTransactionsStateConverter.kt +++ b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/TokenDetailsSwapTransactionsStateConverter.kt @@ -219,7 +219,6 @@ internal class TokenDetailsSwapTransactionsStateConverter( isSending = isSending, isSendingDone = isSendingDone, isRefunded = isRefunded, - hasFailed = hasFailed, ), ) } @@ -302,8 +301,8 @@ internal class TokenDetailsSwapTransactionsStateConverter( ) } - private fun sendStep(isSending: Boolean, isSendingDone: Boolean, isRefunded: Boolean, hasFailed: Boolean) = when { - hasFailed || isRefunded -> ExchangeStatusState( + private fun sendStep(isSending: Boolean, isSendingDone: Boolean, isRefunded: Boolean) = when { + isRefunded -> ExchangeStatusState( status = ExchangeStatus.Refunded, text = TextReference.Res(R.string.express_exchange_status_refunded), isActive = false, diff --git a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/ui/components/TokenInfoBlock.kt b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/ui/components/TokenInfoBlock.kt index a6d81965bb..9a7a77dd53 100644 --- a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/ui/components/TokenInfoBlock.kt +++ b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/ui/components/TokenInfoBlock.kt @@ -3,8 +3,8 @@ package com.tangem.feature.tokendetails.presentation.tokendetails.ui.components import android.content.res.Configuration import androidx.compose.foundation.background import androidx.compose.foundation.layout.* -import androidx.compose.material.Text import androidx.compose.material3.Icon +import androidx.compose.material3.Text import androidx.compose.runtime.Composable import androidx.compose.runtime.remember import androidx.compose.ui.Alignment @@ -73,17 +73,22 @@ private fun NetworkInfoText(currency: TokenInfoBlockState.Currency) { horizontalArrangement = Arrangement.spacedBy(TangemTheme.dimens.spacing4), ) { val state = extractNetwork(tokenCurrency = currency) - Text( - text = state.normalText, - style = TangemTheme.typography.caption2, - color = TangemTheme.colors.text.tertiary, - ) + + if (state.normalText.isNotBlank()) { + Text( + text = state.normalText, + style = TangemTheme.typography.caption2, + color = TangemTheme.colors.text.tertiary, + ) + } + Icon( modifier = Modifier.size(TangemTheme.dimens.size16), painter = painterResource(id = currency.networkIcon), tint = Color.Unspecified, contentDescription = null, ) + Text( text = state.boldText, style = TangemTheme.typography.caption1, @@ -94,7 +99,7 @@ private fun NetworkInfoText(currency: TokenInfoBlockState.Currency) { } } -private const val SEPARATOR = " %image% " +private const val SEPARATOR = "%image%" @Composable private fun extractNetwork(tokenCurrency: TokenInfoBlockState.Currency.Token): ExtractedTokenNetworkText { @@ -105,20 +110,20 @@ private fun extractNetwork(tokenCurrency: TokenInfoBlockState.Currency.Token): E tokenCurrency.standardName, tokenCurrency.networkName, ), - ).split(SEPARATOR) + ) } else { stringResource( id = R.string.token_details_token_type_subtitle_no_standard, formatArgs = arrayOf( tokenCurrency.networkName, ), - ).split(SEPARATOR) + ) } return remember(splitString) { ExtractedTokenNetworkText( - normalText = splitString.firstOrNull().orEmpty(), - boldText = splitString.getOrNull(1).orEmpty(), + normalText = splitString.substringBefore(delimiter = SEPARATOR, missingDelimiterValue = "").trim(), + boldText = splitString.substringAfterLast(delimiter = SEPARATOR).trim(), ) } } @@ -130,6 +135,7 @@ private data class ExtractedTokenNetworkText( @Preview @Preview(uiMode = Configuration.UI_MODE_NIGHT_YES) +@Preview(locale = "ja") @Composable private fun Preview_TokenInfoBlock( @PreviewParameter(TokenInfoStateProvider::class) diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/intents/WalletPushPermissionClickIntents.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/intents/WalletPushPermissionClickIntents.kt index 13a301f372..6043a409aa 100644 --- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/intents/WalletPushPermissionClickIntents.kt +++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/intents/WalletPushPermissionClickIntents.kt @@ -35,10 +35,11 @@ internal class WalletPushPermissionClickIntentsImplementor @Inject constructor( } override fun onNeverAskPushPermission(isUserDismissed: Boolean) { - if (!isUserDismissedDialog) return - isUserDismissedDialog = isUserDismissed + if (isUserDismissedDialog != isUserDismissed) return viewModelScope.launch { - PushNotificationAnalyticEvents.ButtonCancel(AnalyticsParam.ScreensSources.Main) + analyticsEventHandler.send( + PushNotificationAnalyticEvents.ButtonCancel(AnalyticsParam.ScreensSources.Main), + ) neverRequestPermissionUseCase(PUSH_PERMISSION) } } diff --git a/gradle/dependencies.toml b/gradle/dependencies.toml index beb5d52f7e..e7873d004f 100644 --- a/gradle/dependencies.toml +++ b/gradle/dependencies.toml @@ -88,7 +88,7 @@ markdown = "0.7.2" # endregion Other libraries # region Tangem -tangemBlockchainSdk = "develop-729" +tangemBlockchainSdk = "develop-733" #tangemBlockchainSdk = "0.0.1" # Keep it! - used for local builds tangemCardSdk = "develop-375" #tangemCardSdk = "0.0.1" # Keep it! - used for local builds ^