diff --git a/app/src/main/java/com/tangem/tap/common/redux/legacy/LegacyMiddleware.kt b/app/src/main/java/com/tangem/tap/common/redux/legacy/LegacyMiddleware.kt
index 495a45f59b..81d40b5307 100644
--- a/app/src/main/java/com/tangem/tap/common/redux/legacy/LegacyMiddleware.kt
+++ b/app/src/main/java/com/tangem/tap/common/redux/legacy/LegacyMiddleware.kt
@@ -3,6 +3,7 @@ package com.tangem.tap.common.redux.legacy
import com.tangem.domain.redux.LegacyAction
import com.tangem.tap.common.feedback.RateCanBeBetterEmail
import com.tangem.tap.common.redux.AppState
+import com.tangem.tap.common.redux.global.GlobalAction
import com.tangem.tap.store
import org.rekotlin.Middleware
@@ -14,6 +15,11 @@ internal object LegacyMiddleware {
is LegacyAction.SendEmailRateCanBeBetter -> {
store.state.globalState.feedbackManager?.sendEmail(RateCanBeBetterEmail())
}
+ is LegacyAction.StartOnboardingProcess -> {
+ store.dispatch(
+ GlobalAction.Onboarding.Start(action.scanResponse, canSkipBackup = action.canSkipBackup),
+ )
+ }
}
next(action)
}
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 0a38a59439..b1f939c0f6 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
@@ -602,11 +602,14 @@ internal class AddCustomTokenViewModel @Inject constructor(
val networkSelectorValue = uiState.form.networkSelectorField.selectedItem.blockchain
val networkId = Blockchain.fromNetworkId(networkSelectorValue.toNetworkId())?.id
- // todo after move foundToken to CryptoCurrency model, use only id
- val savedTokenId = if (token.isCustom) null else token.id.rawCurrencyId
+ val sameId = if (!token.isCustom) {
+ // todo after move foundToken to CryptoCurrency model, use only id
+ foundToken?.id == token.id.rawCurrencyId
+ } else {
+ true
+ }
- val sameId = foundToken?.id == savedTokenId
- val sameAddress = contractAddress == token.contractAddress
+ val sameAddress = contractAddress.equals(token.contractAddress, ignoreCase = true)
val sameBlockchain = networkId == token.network.id.value
val isSameDerivationPath = getDerivationPath()?.rawPath == token.network.derivationPath.value
diff --git a/app/src/main/java/com/tangem/tap/features/details/ui/details/DetailsScreenState.kt b/app/src/main/java/com/tangem/tap/features/details/ui/details/DetailsScreenState.kt
index 6675322128..5a1c6150cf 100644
--- a/app/src/main/java/com/tangem/tap/features/details/ui/details/DetailsScreenState.kt
+++ b/app/src/main/java/com/tangem/tap/features/details/ui/details/DetailsScreenState.kt
@@ -143,9 +143,9 @@ internal object TangemSocialAccounts {
SocialNetworkLink(SocialNetwork.Telegram, "https://t.me/tangem_chat"),
SocialNetworkLink(SocialNetwork.Discord, "https://discord.gg/tangem"),
SocialNetworkLink(SocialNetwork.Reddit, "https://www.reddit.com/r/Tangem/"),
- SocialNetworkLink(SocialNetwork.Instagram, "https://instagram.com/tangemcards"),
+ SocialNetworkLink(SocialNetwork.Instagram, "https://www.instagram.com/tangemwallet"),
SocialNetworkLink(SocialNetwork.GitHub, "https://github.com/tangem"),
- SocialNetworkLink(SocialNetwork.Facebook, "https://facebook.com/TangemCards/"),
+ SocialNetworkLink(SocialNetwork.Facebook, "https://www.facebook.com/tangemwallet"),
SocialNetworkLink(SocialNetwork.LinkedIn, "https://www.linkedin.com/company/tangem"),
SocialNetworkLink(SocialNetwork.YouTube, "https://youtube.com/@tangem3890"),
)
@@ -154,9 +154,9 @@ internal object TangemSocialAccounts {
SocialNetworkLink(SocialNetwork.Telegram, "https://t.me/tangem_chat_ru"),
SocialNetworkLink(SocialNetwork.Discord, "https://discord.gg/tangem"),
SocialNetworkLink(SocialNetwork.Reddit, "https://www.reddit.com/r/Tangem/"),
- SocialNetworkLink(SocialNetwork.Instagram, "https://instagram.com/tangemcards"),
+ SocialNetworkLink(SocialNetwork.Instagram, "https://www.instagram.com/tangemwallet"),
SocialNetworkLink(SocialNetwork.GitHub, "https://github.com/tangem"),
- SocialNetworkLink(SocialNetwork.Facebook, "https://facebook.com/TangemCards/"),
+ SocialNetworkLink(SocialNetwork.Facebook, "https://www.facebook.com/tangemwallet"),
SocialNetworkLink(SocialNetwork.LinkedIn, "https://www.linkedin.com/company/tangem"),
SocialNetworkLink(SocialNetwork.YouTube, "https://youtube.com/@tangem3890"),
)
diff --git a/app/src/main/java/com/tangem/tap/features/home/compose/views/HomeButtons.kt b/app/src/main/java/com/tangem/tap/features/home/compose/views/HomeButtons.kt
index 1bd1a192c6..aebf48b161 100644
--- a/app/src/main/java/com/tangem/tap/features/home/compose/views/HomeButtons.kt
+++ b/app/src/main/java/com/tangem/tap/features/home/compose/views/HomeButtons.kt
@@ -73,9 +73,9 @@ private fun OrderCardButton(onClick: () -> Unit, modifier: Modifier = Modifier)
}
private val LightBgScanCardButtonColors: ButtonColors = TangemButtonColors(
- backgroundColor = TangemColorPalette.Light2,
+ backgroundColor = TangemColorPalette.Light4,
contentColor = TangemColorPalette.Dark6,
- disabledBackgroundColor = TangemColorPalette.Light2,
+ disabledBackgroundColor = TangemColorPalette.Dark5,
disabledContentColor = TangemColorPalette.Dark6,
)
diff --git a/app/src/main/java/com/tangem/tap/features/main/MainViewModel.kt b/app/src/main/java/com/tangem/tap/features/main/MainViewModel.kt
index e919fa41ec..5725564ef4 100644
--- a/app/src/main/java/com/tangem/tap/features/main/MainViewModel.kt
+++ b/app/src/main/java/com/tangem/tap/features/main/MainViewModel.kt
@@ -50,7 +50,8 @@ internal class MainViewModel @Inject constructor(
it.isBalanceHidingNotificationEnabled && it.isBalanceHidden
}
.onEach {
- if (state.value.modalNotification?.isShow != true) {
+ if (state.value.modalNotification?.isShow != true && !it.isUpdateFromToast) {
+ listenToFlipsUseCase.changeUpdateEnabled(false)
stateHolder.updateWithHiddenBalancesNotification()
reduxNavController.navigate(NavigationAction.NavigateTo(AppScreen.ModalNotification))
}
@@ -79,7 +80,9 @@ internal class MainViewModel @Inject constructor(
return@onEach
}
- displayBalancesHiddenStatusToast(settings)
+ if (!settings.isUpdateFromToast) {
+ displayBalancesHiddenStatusToast(settings)
+ }
previousSettings = settings
}
@@ -96,7 +99,10 @@ internal class MainViewModel @Inject constructor(
override fun onHiddenBalanceToastAction() {
viewModelScope.launch {
updateBalanceHidingSettingsUseCase.invoke {
- copy(isBalanceHidden = false)
+ copy(
+ isBalanceHidden = false,
+ isUpdateFromToast = true,
+ )
}
}
}
@@ -104,7 +110,10 @@ internal class MainViewModel @Inject constructor(
override fun onShownBalanceToastAction() {
viewModelScope.launch {
updateBalanceHidingSettingsUseCase.invoke {
- copy(isBalanceHidden = true)
+ copy(
+ isBalanceHidden = true,
+ isUpdateFromToast = true,
+ )
}
}
}
@@ -112,6 +121,7 @@ internal class MainViewModel @Inject constructor(
override fun onHiddenBalanceNotificationAction(isPermanent: Boolean) {
onDismissBottomSheet()
+ stateHolder.updateWithHiddenBalancesToast(true)
if (isPermanent) {
viewModelScope.launch {
updateBalanceHidingSettingsUseCase.invoke {
@@ -122,6 +132,8 @@ internal class MainViewModel @Inject constructor(
}
override fun onDismissBottomSheet() {
+ listenToFlipsUseCase.changeUpdateEnabled(true)
stateHolder.updateWithoutModalNotification()
+ stateHolder.updateWithHiddenBalancesToast(true)
}
}
\ No newline at end of file
diff --git a/app/src/main/java/com/tangem/tap/features/main/ui/ModalNotificationBottomSheetFragment.kt b/app/src/main/java/com/tangem/tap/features/main/ui/ModalNotificationBottomSheetFragment.kt
index 2a40e92ef8..ec7cb8d416 100644
--- a/app/src/main/java/com/tangem/tap/features/main/ui/ModalNotificationBottomSheetFragment.kt
+++ b/app/src/main/java/com/tangem/tap/features/main/ui/ModalNotificationBottomSheetFragment.kt
@@ -2,12 +2,14 @@ package com.tangem.tap.features.main.ui
import android.content.DialogInterface
import androidx.activity.compose.BackHandler
+import androidx.compose.foundation.background
import androidx.compose.runtime.Composable
import androidx.compose.runtime.LaunchedEffect
import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier
import androidx.fragment.app.activityViewModels
import androidx.lifecycle.compose.collectAsStateWithLifecycle
+import com.tangem.core.ui.res.TangemTheme
import com.tangem.core.ui.screen.ComposeBottomSheetFragment
import com.tangem.core.ui.theme.AppThemeModeHolder
import com.tangem.tap.features.main.MainViewModel
@@ -37,7 +39,11 @@ internal class ModalNotificationBottomSheetFragment : ComposeBottomSheetFragment
when (val content = notification.content) {
is ModalNotification -> ModalNotificationContent(
- modifier = modifier,
+ modifier = modifier
+ .background(
+ color = TangemTheme.colors.background.primary,
+ shape = TangemTheme.shapes.bottomSheet,
+ ),
notification = content,
)
else -> Unit
diff --git a/app/src/main/java/com/tangem/tap/features/main/ui/components/ModalNotificationScreen.kt b/app/src/main/java/com/tangem/tap/features/main/ui/components/ModalNotificationScreen.kt
index 3ebb87e8dd..587b734dc0 100644
--- a/app/src/main/java/com/tangem/tap/features/main/ui/components/ModalNotificationScreen.kt
+++ b/app/src/main/java/com/tangem/tap/features/main/ui/components/ModalNotificationScreen.kt
@@ -88,9 +88,9 @@ private fun ModalNotificationContentPreview_Light(
) {
TangemTheme(isDark = false) {
ModalNotificationContent(
- param,
+ notification = param,
modifier = Modifier.background(
- color = TangemTheme.colors.background.plain,
+ color = TangemTheme.colors.background.primary,
shape = TangemTheme.shapes.bottomSheet,
),
)
@@ -104,9 +104,9 @@ private fun ModalNotificationContentPreview_Dark(
) {
TangemTheme(isDark = true) {
ModalNotificationContent(
- param,
+ notification = param,
modifier = Modifier.background(
- color = TangemTheme.colors.background.plain,
+ color = TangemTheme.colors.background.primary,
shape = TangemTheme.shapes.bottomSheet,
),
)
diff --git a/app/src/main/java/com/tangem/tap/features/send/ui/SendViewModel.kt b/app/src/main/java/com/tangem/tap/features/send/ui/SendViewModel.kt
index fe7c000ae6..de5e810b88 100644
--- a/app/src/main/java/com/tangem/tap/features/send/ui/SendViewModel.kt
+++ b/app/src/main/java/com/tangem/tap/features/send/ui/SendViewModel.kt
@@ -2,7 +2,6 @@ package com.tangem.tap.features.send.ui
import androidx.lifecycle.*
import com.tangem.domain.balancehiding.GetBalanceHidingSettingsUseCase
-import com.tangem.domain.balancehiding.ListenToFlipsUseCase
import com.tangem.domain.tokens.FetchPendingTransactionsUseCase
import com.tangem.domain.tokens.UpdateDelayedNetworkStatusUseCase
import com.tangem.domain.tokens.model.CryptoCurrency
@@ -16,11 +15,10 @@ import com.tangem.tap.proxy.AppStateHolder
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.coroutines.CoroutineScope
-import kotlinx.coroutines.flow.collect
+import kotlinx.coroutines.flow.flowOn
import kotlinx.coroutines.flow.launchIn
import kotlinx.coroutines.flow.onEach
import kotlinx.coroutines.launch
-import kotlinx.coroutines.withContext
import timber.log.Timber
import javax.inject.Inject
@@ -30,7 +28,6 @@ internal class SendViewModel @Inject constructor(
private val dispatchers: CoroutineDispatcherProvider,
private val appStateHolder: AppStateHolder,
private val getBalanceHidingSettingsUseCase: GetBalanceHidingSettingsUseCase,
- private val listenToFlipsUseCase: ListenToFlipsUseCase,
private val updateDelayedCurrencyStatusUseCase: UpdateDelayedNetworkStatusUseCase,
private val getSelectedWalletSyncUseCase: GetSelectedWalletSyncUseCase,
private val fetchPendingTransactionsUseCase: FetchPendingTransactionsUseCase,
@@ -44,17 +41,10 @@ internal class SendViewModel @Inject constructor(
getBalanceHidingSettingsUseCase()
.flowWithLifecycle(owner.lifecycle)
.onEach {
- withContext(dispatchers.main) {
- appStateHolder.mainStore?.dispatch(AmountAction.HideBalance(it.isBalanceHidden))
- }
+ appStateHolder.mainStore?.dispatch(AmountAction.HideBalance(it.isBalanceHidden))
}
+ .flowOn(dispatchers.main)
.launchIn(viewModelScope)
-
- viewModelScope.launch {
- listenToFlipsUseCase()
- .flowWithLifecycle(owner.lifecycle)
- .collect()
- }
}
fun updateCurrencyDelayed() {
diff --git a/app/src/main/res/values-night/colors.xml b/app/src/main/res/values-night/colors.xml
index 29535c674f..7b2c91dd38 100644
--- a/app/src/main/res/values-night/colors.xml
+++ b/app/src/main/res/values-night/colors.xml
@@ -10,7 +10,7 @@
#303030
- #F5F5F5
+ #FFC9C9C9
#303030
#1ACE80
diff --git a/core/res/src/main/res/values-ru/strings.xml b/core/res/src/main/res/values-ru/strings.xml
index 857c2f4ff1..cba2a01896 100644
--- a/core/res/src/main/res/values-ru/strings.xml
+++ b/core/res/src/main/res/values-ru/strings.xml
@@ -86,6 +86,7 @@
Ошибка
Обменять
Посмотреть историю транзакций
+ Обозреватель
Обозреватель
Сетевые комиссии за транзакции используются для поддержки безопасности сети, поощрения валидаторов, выделения ресурсов и определения приоритета транзакции.
Свое
diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/bottomsheets/tokenreceive/TokenReceiveBottomSheet.kt b/core/ui/src/main/java/com/tangem/core/ui/components/bottomsheets/tokenreceive/TokenReceiveBottomSheet.kt
index b9dc31d04f..704418b5ec 100644
--- a/core/ui/src/main/java/com/tangem/core/ui/components/bottomsheets/tokenreceive/TokenReceiveBottomSheet.kt
+++ b/core/ui/src/main/java/com/tangem/core/ui/components/bottomsheets/tokenreceive/TokenReceiveBottomSheet.kt
@@ -2,9 +2,7 @@ package com.tangem.core.ui.components.bottomsheets.tokenreceive
import android.widget.Toast
import androidx.compose.animation.animateColorAsState
-import androidx.compose.foundation.ExperimentalFoundationApi
-import androidx.compose.foundation.Image
-import androidx.compose.foundation.background
+import androidx.compose.foundation.*
import androidx.compose.foundation.layout.*
import androidx.compose.foundation.lazy.LazyRow
import androidx.compose.foundation.lazy.rememberLazyListState
@@ -43,6 +41,7 @@ private fun TokenReceiveBottomSheetContent(content: TokenReceiveBottomSheetConfi
var selectedAddress by remember { mutableStateOf(content.addresses.first()) }
Column(
modifier = Modifier
+ .verticalScroll(state = rememberScrollState())
.padding(
start = TangemTheme.dimens.spacing24,
top = TangemTheme.dimens.spacing24,
diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/transactions/TransactionList.kt b/core/ui/src/main/java/com/tangem/core/ui/components/transactions/TransactionList.kt
index 5920e09e81..202930549a 100644
--- a/core/ui/src/main/java/com/tangem/core/ui/components/transactions/TransactionList.kt
+++ b/core/ui/src/main/java/com/tangem/core/ui/components/transactions/TransactionList.kt
@@ -81,7 +81,7 @@ private fun LazyListScope.contentItems(
count = txHistoryItems.itemCount,
key = txHistoryItems.itemKey { item ->
when (item) {
- is TxHistoryState.TxHistoryItemState.GroupTitle -> item.title
+ is TxHistoryState.TxHistoryItemState.GroupTitle -> item.itemKey
is TxHistoryState.TxHistoryItemState.Title -> item.onExploreClick.hashCode()
is TxHistoryState.TxHistoryItemState.Transaction -> item.state.txHash
}
diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/transactions/TxHistoryGroupTitle.kt b/core/ui/src/main/java/com/tangem/core/ui/components/transactions/TxHistoryGroupTitle.kt
index c7eaaa7978..4676fd5c49 100644
--- a/core/ui/src/main/java/com/tangem/core/ui/components/transactions/TxHistoryGroupTitle.kt
+++ b/core/ui/src/main/java/com/tangem/core/ui/components/transactions/TxHistoryGroupTitle.kt
@@ -10,6 +10,7 @@ import androidx.compose.ui.text.style.TextAlign
import androidx.compose.ui.tooling.preview.Preview
import com.tangem.core.ui.components.transactions.state.TxHistoryState.TxHistoryItemState
import com.tangem.core.ui.res.TangemTheme
+import java.util.UUID
/**
* Transactions block group title
@@ -38,7 +39,9 @@ internal fun TxHistoryGroupTitle(config: TxHistoryItemState.GroupTitle, modifier
@Composable
private fun Preview_TransactionsBlockGroupTitle_Light() {
TangemTheme(isDark = false) {
- TxHistoryGroupTitle(config = TxHistoryItemState.GroupTitle(title = "Today"))
+ TxHistoryGroupTitle(
+ config = TxHistoryItemState.GroupTitle(title = "Today", itemKey = UUID.randomUUID().toString()),
+ )
}
}
@@ -46,6 +49,8 @@ private fun Preview_TransactionsBlockGroupTitle_Light() {
@Composable
private fun Preview_TransactionsBlockGroupTitle_Dark() {
TangemTheme(isDark = true) {
- TxHistoryGroupTitle(config = TxHistoryItemState.GroupTitle(title = "Today"))
+ TxHistoryGroupTitle(
+ config = TxHistoryItemState.GroupTitle(title = "Today", itemKey = UUID.randomUUID().toString()),
+ )
}
}
\ No newline at end of file
diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/transactions/state/TxHistoryState.kt b/core/ui/src/main/java/com/tangem/core/ui/components/transactions/state/TxHistoryState.kt
index 6e297a4196..9801f79276 100644
--- a/core/ui/src/main/java/com/tangem/core/ui/components/transactions/state/TxHistoryState.kt
+++ b/core/ui/src/main/java/com/tangem/core/ui/components/transactions/state/TxHistoryState.kt
@@ -49,8 +49,12 @@ sealed interface TxHistoryState {
* Group title item
*
* @property title title
+ * @property itemKey key to use in compose
*/
- data class GroupTitle(val title: String) : TxHistoryItemState
+ data class GroupTitle(
+ val title: String,
+ val itemKey: String,
+ ) : TxHistoryItemState
/**
* Transaction item
diff --git a/core/ui/src/main/java/com/tangem/core/ui/extensions/BlockchainIcons.kt b/core/ui/src/main/java/com/tangem/core/ui/extensions/BlockchainIcons.kt
index 3c29a58544..e418da8ea3 100644
--- a/core/ui/src/main/java/com/tangem/core/ui/extensions/BlockchainIcons.kt
+++ b/core/ui/src/main/java/com/tangem/core/ui/extensions/BlockchainIcons.kt
@@ -45,6 +45,7 @@ fun getActiveIconRes(blockchainId: String): Int {
"aleph-zero", "aleph-zero/test" -> R.drawable.img_azero_22
"octaspace", "octaspace/test" -> R.drawable.img_octaspace_22
"chia", "chia/test" -> R.drawable.img_chia_22
+ "NEAR", "NEAR/test" -> R.drawable.img_near_22
"decimal", "decimal/testnet" -> R.drawable.img_decimal_22
else -> R.drawable.ic_alert_24
}
@@ -135,6 +136,7 @@ fun getGreyedOutIconRes(blockchainId: String): Int {
"aleph-zero", "aleph-zero/test" -> R.drawable.ic_azero_22
"octaspace", "octaspace/test" -> R.drawable.ic_octaspace_22
"chia", "chia/test" -> R.drawable.ic_chia_22
+ "NEAR", "NEAR/test" -> R.drawable.ic_near_22
"decimal", "decimal/test" -> R.drawable.ic_decimal_22
else -> R.drawable.ic_alert_24
}
diff --git a/core/ui/src/main/java/com/tangem/core/ui/res/TangemTheme.kt b/core/ui/src/main/java/com/tangem/core/ui/res/TangemTheme.kt
index db286e6d51..93dae822ba 100644
--- a/core/ui/src/main/java/com/tangem/core/ui/res/TangemTheme.kt
+++ b/core/ui/src/main/java/com/tangem/core/ui/res/TangemTheme.kt
@@ -156,7 +156,7 @@ private fun darkThemeColors(): TangemColors {
attention = TangemColorPalette.Mustard,
),
button = TangemColors.Button(
- primary = TangemColorPalette.Light1,
+ primary = TangemColorPalette.Light4,
secondary = TangemColorPalette.Dark5,
disabled = TangemColorPalette.Dark5,
positiveDisabled = TangemColorPalette.DarkGreen,
diff --git a/core/ui/src/main/res/drawable/ic_near_22.xml b/core/ui/src/main/res/drawable/ic_near_22.xml
new file mode 100644
index 0000000000..31661112fb
--- /dev/null
+++ b/core/ui/src/main/res/drawable/ic_near_22.xml
@@ -0,0 +1,9 @@
+
+
+
diff --git a/data/balance-hiding/src/main/java/com/tangem/data/balancehiding/DefaultBalanceHidingRepository.kt b/data/balance-hiding/src/main/java/com/tangem/data/balancehiding/DefaultBalanceHidingRepository.kt
index 948ec336de..f2fdcd320e 100644
--- a/data/balance-hiding/src/main/java/com/tangem/data/balancehiding/DefaultBalanceHidingRepository.kt
+++ b/data/balance-hiding/src/main/java/com/tangem/data/balancehiding/DefaultBalanceHidingRepository.kt
@@ -13,6 +13,8 @@ internal class DefaultBalanceHidingRepository(
private val appPreferencesStore: AppPreferencesStore,
) : BalanceHidingRepository {
+ override var isUpdateEnabled: Boolean = true
+
override fun getBalanceHidingSettingsFlow(): Flow {
return appPreferencesStore.getObject(
key = PreferencesKeys.BALANCE_HIDING_SETTINGS_KEY,
diff --git a/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultMarketCryptoCurrencyRepository.kt b/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultMarketCryptoCurrencyRepository.kt
index 441f3f97d2..2211aa96cd 100644
--- a/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultMarketCryptoCurrencyRepository.kt
+++ b/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/DefaultMarketCryptoCurrencyRepository.kt
@@ -17,6 +17,12 @@ class DefaultMarketCryptoCurrencyRepository(
return userMarketCoinsStore.getSyncOrNull(userWalletId)?.coins
?.firstOrNull { it.id == cryptoCurrencyId.rawCurrencyId }
?.networks
- ?.firstOrNull { it.networkId == apiNetworkId }?.exchangeable ?: false
+ ?.firstOrNull {
+ if (it.contractAddress != null) {
+ it.networkId == apiNetworkId && it.contractAddress == cryptoCurrencyId.contractAddress
+ } else {
+ it.networkId == apiNetworkId
+ }
+ }?.exchangeable ?: false
}
}
\ No newline at end of file
diff --git a/domain/balance-hiding/models/src/main/kotlin/com/tangem/domain/balancehiding/BalanceHidingSettings.kt b/domain/balance-hiding/models/src/main/kotlin/com/tangem/domain/balancehiding/BalanceHidingSettings.kt
index 2432bbc2ec..b646dd8c30 100644
--- a/domain/balance-hiding/models/src/main/kotlin/com/tangem/domain/balancehiding/BalanceHidingSettings.kt
+++ b/domain/balance-hiding/models/src/main/kotlin/com/tangem/domain/balancehiding/BalanceHidingSettings.kt
@@ -4,4 +4,5 @@ data class BalanceHidingSettings(
val isHidingEnabledInSettings: Boolean,
val isBalanceHidden: Boolean,
val isBalanceHidingNotificationEnabled: Boolean,
+ val isUpdateFromToast: Boolean = false,
)
\ No newline at end of file
diff --git a/domain/balance-hiding/src/main/kotlin/com/tangem/domain/balancehiding/ListenToFlipsUseCase.kt b/domain/balance-hiding/src/main/kotlin/com/tangem/domain/balancehiding/ListenToFlipsUseCase.kt
index c80577e10e..d518006d05 100644
--- a/domain/balance-hiding/src/main/kotlin/com/tangem/domain/balancehiding/ListenToFlipsUseCase.kt
+++ b/domain/balance-hiding/src/main/kotlin/com/tangem/domain/balancehiding/ListenToFlipsUseCase.kt
@@ -24,12 +24,13 @@ class ListenToFlipsUseCase(
},
)
- if (balanceHidingSettings.isHidingEnabledInSettings) {
+ if (balanceHidingSettings.isHidingEnabledInSettings && balanceHidingRepository.isUpdateEnabled) {
catch(
block = {
balanceHidingRepository.storeBalanceHidingSettings(
balanceHidingSettings.copy(
isBalanceHidden = !balanceHidingSettings.isBalanceHidden,
+ isUpdateFromToast = false,
),
)
},
@@ -40,4 +41,8 @@ class ListenToFlipsUseCase(
}
}
}
+
+ fun changeUpdateEnabled(isUpdateEnabled: Boolean) {
+ balanceHidingRepository.isUpdateEnabled = isUpdateEnabled
+ }
}
\ No newline at end of file
diff --git a/domain/balance-hiding/src/main/kotlin/com/tangem/domain/balancehiding/repositories/BalanceHidingRepository.kt b/domain/balance-hiding/src/main/kotlin/com/tangem/domain/balancehiding/repositories/BalanceHidingRepository.kt
index 84161a07d9..93d21ef4b2 100644
--- a/domain/balance-hiding/src/main/kotlin/com/tangem/domain/balancehiding/repositories/BalanceHidingRepository.kt
+++ b/domain/balance-hiding/src/main/kotlin/com/tangem/domain/balancehiding/repositories/BalanceHidingRepository.kt
@@ -5,6 +5,8 @@ import kotlinx.coroutines.flow.Flow
interface BalanceHidingRepository {
+ var isUpdateEnabled: Boolean
+
fun getBalanceHidingSettingsFlow(): Flow
suspend fun storeBalanceHidingSettings(isBalanceHidden: BalanceHidingSettings)
diff --git a/domain/legacy/src/main/java/com/tangem/domain/common/extensions/Blockchain.kt b/domain/legacy/src/main/java/com/tangem/domain/common/extensions/Blockchain.kt
index df437d1241..2e72d3e67f 100644
--- a/domain/legacy/src/main/java/com/tangem/domain/common/extensions/Blockchain.kt
+++ b/domain/legacy/src/main/java/com/tangem/domain/common/extensions/Blockchain.kt
@@ -224,4 +224,6 @@ private const val NODL_AMOUNT_TO_CREATE_ACCOUNT = 1.5
private val excludedBlockchains = listOf(
Blockchain.Unknown,
Blockchain.Ducatus,
+ Blockchain.Decimal,
+ Blockchain.DecimalTestnet,
)
\ No newline at end of file
diff --git a/domain/legacy/src/main/java/com/tangem/domain/redux/LegacyAction.kt b/domain/legacy/src/main/java/com/tangem/domain/redux/LegacyAction.kt
index 2565d2f226..f715061ac7 100644
--- a/domain/legacy/src/main/java/com/tangem/domain/redux/LegacyAction.kt
+++ b/domain/legacy/src/main/java/com/tangem/domain/redux/LegacyAction.kt
@@ -1,8 +1,16 @@
package com.tangem.domain.redux
+import com.tangem.domain.models.scan.ScanResponse
import org.rekotlin.Action
sealed interface LegacyAction : Action {
object SendEmailRateCanBeBetter : LegacyAction
+
+ /**
+ * Initiate an onboarding process.
+ * For resuming unfinished backup of standard Wallet see
+ * BackupAction.CheckForUnfinishedBackup, GlobalAction.Onboarding.StartForUnfinishedBackup
+ */
+ data class StartOnboardingProcess(val scanResponse: ScanResponse, val canSkipBackup: Boolean = true) : LegacyAction
}
\ No newline at end of file
diff --git a/domain/tokens/models/src/main/java/com/tangem/domain/tokens/model/CryptoCurrency.kt b/domain/tokens/models/src/main/java/com/tangem/domain/tokens/model/CryptoCurrency.kt
index e360bda6e4..87015b1305 100644
--- a/domain/tokens/models/src/main/java/com/tangem/domain/tokens/model/CryptoCurrency.kt
+++ b/domain/tokens/models/src/main/java/com/tangem/domain/tokens/model/CryptoCurrency.kt
@@ -94,6 +94,8 @@ sealed class CryptoCurrency : Parcelable {
/** Represents a raw cryptocurrency ID. If it is a custom token, the value will be `null`. */
val rawCurrencyId: String? get() = (suffix as? Suffix.RawID)?.rawId
+ val contractAddress: String? get() = (suffix as? Suffix.RawID)?.contractAddress
+
/** Represents a raw cryptocurrency's network ID. */
val rawNetworkId: String
get() = when (body) {
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 d76a2d777e..4e6dcfa4cf 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
@@ -23,6 +23,7 @@ import timber.log.Timber
import java.math.BigDecimal
import java.math.RoundingMode
import javax.inject.Inject
+import com.tangem.lib.crypto.models.Currency as LibCurrency
@Suppress("LargeClass", "LongParameterList")
internal class SwapInteractorImpl @Inject constructor(
@@ -70,7 +71,14 @@ internal class SwapInteractorImpl @Inject constructor(
isExcludeCustom = true,
)
.map { token ->
- allLoadedTokens.firstOrNull { it.symbol == token.symbol }?.let {
+ val contractAddress = (token as? LibCurrency.NonNativeToken)?.contractAddress
+ allLoadedTokens.firstOrNull {
+ if (it is Currency.NonNativeToken) {
+ it.symbol == token.symbol && it.contractAddress == contractAddress
+ } else {
+ it.symbol == token.symbol
+ }
+ }?.let {
loadedOnWalletsMap.add(it.symbol)
it
} ?: swapCurrencyConverter.convertBack(token)
diff --git a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/txhistory/TokenDetailsTxHistoryItemFlowConverter.kt b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/txhistory/TokenDetailsTxHistoryItemFlowConverter.kt
index 819d32e1de..5af7329676 100644
--- a/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/txhistory/TokenDetailsTxHistoryItemFlowConverter.kt
+++ b/features/tokendetails/impl/src/main/kotlin/com/tangem/feature/tokendetails/presentation/tokendetails/state/factory/txhistory/TokenDetailsTxHistoryItemFlowConverter.kt
@@ -14,6 +14,7 @@ import com.tangem.utils.converter.Converter
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.*
+import java.util.UUID
internal class TokenDetailsTxHistoryItemFlowConverter(
private val currentStateProvider: Provider,
@@ -71,7 +72,10 @@ internal class TokenDetailsTxHistoryItemFlowConverter(
// If [afterDate] is the first transaction in the flow, add the group title
val afterDate = after.getTimestamp()?.toDateFormat() ?: return@insertSeparators null
if (before is TxHistoryItemState.Title) {
- return@insertSeparators TxHistoryItemState.GroupTitle(afterDate)
+ return@insertSeparators TxHistoryItemState.GroupTitle(
+ title = afterDate,
+ itemKey = UUID.randomUUID().toString(),
+ )
}
/*
@@ -80,7 +84,10 @@ internal class TokenDetailsTxHistoryItemFlowConverter(
*/
val beforeDate = before.getTimestamp()?.toDateFormat() ?: return@insertSeparators null
return@insertSeparators if (beforeDate != afterDate) {
- TxHistoryItemState.GroupTitle(afterDate)
+ TxHistoryItemState.GroupTitle(
+ title = afterDate,
+ itemKey = UUID.randomUUID().toString(),
+ )
} else {
null
}
diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/WalletPreviewData.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/WalletPreviewData.kt
index e4f7243ad9..9ffd482c85 100644
--- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/WalletPreviewData.kt
+++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/WalletPreviewData.kt
@@ -418,7 +418,10 @@ internal object WalletPreviewData {
contentItems = MutableStateFlow(
PagingData.from(
listOf(
- TxHistoryState.TxHistoryItemState.GroupTitle("Today"),
+ TxHistoryState.TxHistoryItemState.GroupTitle(
+ title = "Today",
+ itemKey = UUID.randomUUID().toString(),
+ ),
TxHistoryState.TxHistoryItemState.Transaction(
TransactionState.Content(
txHash = UUID.randomUUID().toString(),
@@ -432,7 +435,10 @@ internal object WalletPreviewData {
onClick = {},
),
),
- TxHistoryState.TxHistoryItemState.GroupTitle("Yesterday"),
+ TxHistoryState.TxHistoryItemState.GroupTitle(
+ title = "Yesterday",
+ itemKey = UUID.randomUUID().toString(),
+ ),
TxHistoryState.TxHistoryItemState.Transaction(
TransactionState.Content(
txHash = UUID.randomUUID().toString(),
diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/component/TokenItem.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/component/TokenItem.kt
index ac0fac75db..9a3d17502f 100644
--- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/component/TokenItem.kt
+++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/common/component/TokenItem.kt
@@ -45,13 +45,18 @@ internal fun TokenItem(
.tokenClickable(state = state)
.background(color = TangemTheme.colors.background.primary),
) {
- TokenIcon(state = state.iconState, modifier = Modifier.layoutId(layoutId = LayoutId.ICON))
+ TokenIcon(
+ state = state.iconState,
+ modifier = Modifier
+ .layoutId(layoutId = LayoutId.ICON)
+ .padding(end = TangemTheme.dimens.spacing8),
+ )
TokenTitle(
state = state.titleState,
modifier = Modifier
.layoutId(layoutId = LayoutId.TITLE)
- .padding(horizontal = TangemTheme.dimens.spacing8)
+ .padding(end = TangemTheme.dimens.spacing8)
.padding(bottom = betweenRowsMargin),
)
@@ -67,7 +72,7 @@ internal fun TokenItem(
state = state.cryptoPriceState,
modifier = Modifier
.layoutId(layoutId = LayoutId.CRYPTO_PRICE)
- .padding(horizontal = TangemTheme.dimens.spacing8),
+ .padding(end = TangemTheme.dimens.spacing8),
)
TokenCryptoAmount(
@@ -233,7 +238,10 @@ private fun CustomContainer(state: TokenItemState, modifier: Modifier = Modifier
)
cryptoAmount?.placeRelative(
- x = layoutWidth - cryptoAmount.width - layoutPadding,
+ x = when (state) {
+ is TokenItemState.Draggable -> layoutPadding + icon.width
+ else -> layoutWidth - cryptoAmount.width - layoutPadding
+ },
y = layoutHeight - cryptoAmount.height - layoutPadding,
)
diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/factory/txhistory/WalletTxHistoryItemFlowConverter.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/factory/txhistory/WalletTxHistoryItemFlowConverter.kt
index 8f3e20271e..32b55caef0 100644
--- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/factory/txhistory/WalletTxHistoryItemFlowConverter.kt
+++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/state/factory/txhistory/WalletTxHistoryItemFlowConverter.kt
@@ -20,6 +20,7 @@ import kotlinx.coroutines.Dispatchers
import kotlinx.coroutines.flow.*
import org.joda.time.DateTime
import org.joda.time.DateTimeZone
+import java.util.UUID
/**
* Convert from [Flow] of [TxHistoryItem] to [TxHistoryState]
@@ -83,7 +84,10 @@ internal class WalletTxHistoryItemFlowConverter(
// If [afterDate] is the first transaction in the flow, add the group title
val afterDate = after.getTimestamp()?.toDateFormat() ?: return@insertSeparators null
if (before is TxHistoryItemState.Title) {
- return@insertSeparators TxHistoryItemState.GroupTitle(afterDate)
+ return@insertSeparators TxHistoryItemState.GroupTitle(
+ title = afterDate,
+ itemKey = UUID.randomUUID().toString(),
+ )
}
/*
@@ -92,7 +96,7 @@ internal class WalletTxHistoryItemFlowConverter(
*/
val beforeDate = before.getTimestamp()?.toDateFormat() ?: return@insertSeparators null
return@insertSeparators if (beforeDate != afterDate) {
- TxHistoryItemState.GroupTitle(afterDate)
+ TxHistoryItemState.GroupTitle(title = afterDate, itemKey = UUID.randomUUID().toString())
} else {
null
}
diff --git a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/WalletViewModel.kt b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/WalletViewModel.kt
index d943c0f76a..bc1c275b2f 100644
--- a/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/WalletViewModel.kt
+++ b/features/wallet/impl/src/main/java/com/tangem/feature/wallet/presentation/wallet/viewmodels/WalletViewModel.kt
@@ -431,6 +431,12 @@ internal class WalletViewModel @Inject constructor(
override fun onBackupCardClick() {
analyticsEventsHandler.send(WalletScreenAnalyticsEvent.MainScreen.NoticeBackupYourWalletTapped)
+ reduxStateHolder.dispatch(
+ LegacyAction.StartOnboardingProcess(
+ scanResponse = getSelectedWallet().scanResponse,
+ canSkipBackup = false,
+ ),
+ )
router.openOnboardingScreen()
}
diff --git a/gradle/dependencies.toml b/gradle/dependencies.toml
index 90e018f42d..efbdda38e4 100644
--- a/gradle/dependencies.toml
+++ b/gradle/dependencies.toml
@@ -88,9 +88,9 @@ spr-client = "3.6.2"
# endregion Other libraries
# region Tangem
-tangemBlockchainSdk = "develop-393"
+tangemBlockchainSdk = "develop-394"
#tangemBlockchainSdk = "0.0.1" # Keep it! - used for local builds
-tangemCardSdk = "develop-310"
+tangemCardSdk = "develop-312"
#tangemCardSdk = "0.0.1" # Keep it! - used for local builds
# endregion Tangem