Updated on 2026-08-14

This commit is contained in:
Tangem 2024-07-26 17:03:36 +03:00
parent 75eee9698c
commit 1e29b39eec
2 changed files with 42 additions and 23 deletions

View file

@ -247,7 +247,7 @@ class DetailsMiddleware {
deleteSavedAccessCodes()
store.inject(DaggerGraphState::walletsRepository).saveShouldSaveUserWallets(item = false)
store.dispatchNavigationAction { popTo<AppRoute.Home>() }
store.dispatchNavigationAction { replaceAll(AppRoute.Home) }
return CompletionResult.Success(Unit)
}

View file

@ -1,17 +1,22 @@
package com.tangem.features.details.utils
import arrow.core.raise.*
import arrow.core.recover
import androidx.compose.ui.res.stringResource
import arrow.core.raise.Raise
import arrow.core.raise.ensureNotNull
import arrow.core.raise.fold
import arrow.core.raise.recover
import com.tangem.common.routing.AppRoute
import com.tangem.core.analytics.models.AnalyticsParam
import com.tangem.core.decompose.di.ComponentScoped
import com.tangem.core.decompose.navigation.Router
import com.tangem.core.decompose.navigation.popTo
import com.tangem.core.decompose.ui.UiMessageSender
import com.tangem.core.ui.components.SimpleOkDialog
import com.tangem.core.ui.extensions.TextReference
import com.tangem.core.ui.extensions.isNullOrEmpty
import com.tangem.core.ui.extensions.resourceReference
import com.tangem.core.ui.extensions.stringReference
import com.tangem.core.ui.message.ContentMessage
import com.tangem.core.ui.message.SnackbarMessage
import com.tangem.domain.card.ScanCardProcessor
import com.tangem.domain.models.scan.ScanResponse
@ -21,7 +26,7 @@ import com.tangem.domain.wallets.models.SaveWalletError
import com.tangem.domain.wallets.models.UserWallet
import com.tangem.domain.wallets.usecase.GenerateWalletNameUseCase
import com.tangem.domain.wallets.usecase.SaveWalletUseCase
import com.tangem.domain.wallets.usecase.SelectWalletUseCase
import com.tangem.domain.wallets.usecase.ShouldSaveUserWalletsSyncUseCase
import com.tangem.features.details.impl.R
import javax.inject.Inject
@ -31,7 +36,7 @@ internal class UserWalletSaver @Inject constructor(
private val scanCardProcessor: ScanCardProcessor,
private val saveWalletUseCase: SaveWalletUseCase,
private val generateWalletNameUseCase: GenerateWalletNameUseCase,
private val selectWalletUseCase: SelectWalletUseCase,
private val shouldSaveUserWalletsSyncUseCase: ShouldSaveUserWalletsSyncUseCase,
private val reduxStateHolder: ReduxStateHolder,
private val messageSender: UiMessageSender,
private val router: Router,
@ -43,8 +48,6 @@ internal class UserWalletSaver @Inject constructor(
val userWallet = createUserWallet(response)
saveWallet(userWallet)
router.popTo<AppRoute.Wallet>()
},
recover = { error ->
val message = error.message
@ -56,28 +59,44 @@ internal class UserWalletSaver @Inject constructor(
)
private suspend fun Raise<Error>.saveWallet(userWallet: UserWallet) {
saveWalletUseCase(userWallet).recover { error ->
when (error) {
is SaveWalletError.WalletAlreadySaved -> selectUserWallet(userWallet)
is SaveWalletError.DataError -> {
val messageRef = ensureNotNull(error.messageId?.let(::resourceReference)) {
Error.Unknown
fold(
block = { saveWalletUseCase(userWallet).bind() },
recover = { error ->
when (error) {
is SaveWalletError.WalletAlreadySaved -> {
if (shouldSaveUserWalletsSyncUseCase()) {
selectUserWallet()
} else {
router.popTo<AppRoute.Wallet>()
}
}
is SaveWalletError.DataError -> {
val messageRef = ensureNotNull(error.messageId?.let(::resourceReference)) {
Error.Unknown
}
raise(Error.Message(messageRef))
raise(Error.Message(messageRef))
}
}
}
}.bind()
},
transform = {
// call only if wallet is successfully saved
reduxStateHolder.onUserWalletSelected(userWallet)
reduxStateHolder.onUserWalletSelected(userWallet)
router.popTo<AppRoute.Wallet>()
},
)
}
private suspend fun Raise<Error>.selectUserWallet(userWallet: UserWallet) {
withError({ Error.Unknown }) {
selectWalletUseCase(userWallet.walletId).bind()
}
router.popTo<AppRoute.Wallet>()
private fun selectUserWallet() {
messageSender.send(
message = ContentMessage { onDismiss ->
SimpleOkDialog(
message = stringResource(id = R.string.user_wallet_list_error_wallet_already_saved),
onDismissDialog = onDismiss,
)
},
)
}
private suspend fun Raise<Error>.createUserWallet(response: ScanResponse): UserWallet {