Updated on 2026-08-14

This commit is contained in:
Tangem 2024-06-13 12:52:44 +04:00
parent e5e35519b9
commit 5ea04db5d8
6 changed files with 36 additions and 55 deletions

View file

@ -52,6 +52,7 @@ dependencies {
implementation(projects.core.utils)
implementation(projects.core.analytics)
implementation(projects.core.analytics.models)
implementation(projects.common.routing)
implementation(projects.core.deepLinks)
implementation(projects.core.deepLinks.global)

View file

@ -1,6 +1,6 @@
package com.tangem.feature.wallet.di
import com.tangem.core.navigation.ReduxNavController
import com.tangem.common.routing.AppRouter
import com.tangem.core.navigation.url.UrlOpener
import com.tangem.domain.redux.ReduxStateHolder
import com.tangem.feature.wallet.presentation.router.DefaultWalletRouter
@ -18,10 +18,10 @@ internal object WalletRouterModule {
@Provides
@ActivityScoped
fun provideWalletRouter(
reduxNavController: ReduxNavController,
reduxStateHolder: ReduxStateHolder,
appRouter: AppRouter,
urlOpener: UrlOpener,
reduxStateHolder: ReduxStateHolder,
): WalletRouter {
return DefaultWalletRouter(reduxNavController, reduxStateHolder, urlOpener)
return DefaultWalletRouter(appRouter, urlOpener, reduxStateHolder)
}
}

View file

@ -6,7 +6,6 @@ import androidx.compose.runtime.*
import androidx.compose.ui.Modifier
import androidx.compose.ui.platform.LocalLifecycleOwner
import androidx.compose.ui.unit.dp
import androidx.core.os.bundleOf
import androidx.fragment.app.Fragment
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.lifecycle.compose.collectAsStateWithLifecycle
@ -16,31 +15,27 @@ import androidx.navigation.compose.NavHost
import androidx.navigation.compose.composable
import androidx.navigation.compose.rememberNavController
import androidx.navigation.navArgument
import com.tangem.core.navigation.AppScreen
import com.tangem.core.navigation.NavigationAction
import com.tangem.core.navigation.ReduxNavController
import com.tangem.common.routing.AppRoute
import com.tangem.common.routing.AppRouter
import com.tangem.core.navigation.url.UrlOpener
import com.tangem.domain.redux.ReduxStateHolder
import com.tangem.domain.redux.StateDialog
import com.tangem.domain.tokens.model.CryptoCurrencyStatus
import com.tangem.domain.wallets.models.UserWalletId
import com.tangem.feature.onboarding.navigation.OnboardingRouter
import com.tangem.feature.wallet.presentation.WalletFragment
import com.tangem.feature.wallet.presentation.organizetokens.OrganizeTokensScreen
import com.tangem.feature.wallet.presentation.organizetokens.OrganizeTokensViewModel
import com.tangem.feature.wallet.presentation.wallet.ui.WalletScreen
import com.tangem.feature.wallet.presentation.wallet.viewmodels.WalletViewModel
import com.tangem.features.details.DetailsEntryPoint
import com.tangem.features.managetokens.navigation.ExpandableState
import com.tangem.features.managetokens.navigation.ManageTokensUi
import com.tangem.features.tokendetails.navigation.TokenDetailsRouter
import kotlin.properties.Delegates
/** Default implementation of wallet feature router */
internal class DefaultWalletRouter(
private val reduxNavController: ReduxNavController,
private val reduxStateHolder: ReduxStateHolder,
private val router: AppRouter,
private val urlOpener: UrlOpener,
private val reduxStateHolder: ReduxStateHolder,
) : InnerWalletRouter {
private var navController: NavHostController by Delegates.notNull()
@ -99,7 +94,7 @@ internal class DefaultWalletRouter(
}
@SuppressLint("RestrictedApi")
override fun popBackStack(screen: AppScreen?) {
override fun popBackStack() {
/*
* It's hack that avoid issue with closing the wallet screen.
* We are using NavGraph only inside feature so first backstack's element is entry of NavGraph and
@ -107,11 +102,7 @@ internal class DefaultWalletRouter(
* If backstack contains only NavGraph entry and wallet screen entry then we close the wallet fragment.
*/
if (navController.currentBackStack.value.size == BACKSTACK_ENTRY_COUNT_TO_CLOSE_WALLET_SCREEN) {
if (screen != null) {
reduxNavController.navigate(action = NavigationAction.PopBackTo(screen))
} else {
onFinish.invoke()
}
onFinish.invoke()
} else {
navController.popBackStack()
}
@ -122,22 +113,16 @@ internal class DefaultWalletRouter(
}
override fun openDetailsScreen(selectedWalletId: UserWalletId) {
reduxNavController.navigate(
action = NavigationAction.NavigateTo(
screen = AppScreen.Details,
bundle = bundleOf(
DetailsEntryPoint.USER_WALLET_ID_KEY to selectedWalletId.stringValue,
),
router.push(
AppRoute.Details(
userWalletId = selectedWalletId,
),
)
}
override fun openOnboardingScreen() {
reduxNavController.navigate(
action = NavigationAction.NavigateTo(
screen = AppScreen.OnboardingWallet,
bundle = bundleOf(OnboardingRouter.CAN_SKIP_BACKUP to false),
),
router.push(
AppRoute.OnboardingWallet(canSkipBackup = false),
)
}
@ -148,30 +133,29 @@ internal class DefaultWalletRouter(
override fun openTokenDetails(userWalletId: UserWalletId, currencyStatus: CryptoCurrencyStatus) {
val networkAddress = currencyStatus.value.networkAddress
if (networkAddress != null && networkAddress.defaultAddress.value.isNotEmpty()) {
reduxNavController.navigate(
action = NavigationAction.NavigateTo(
screen = AppScreen.WalletDetails,
bundle = bundleOf(
TokenDetailsRouter.USER_WALLET_ID_KEY to userWalletId.stringValue,
TokenDetailsRouter.CRYPTO_CURRENCY_KEY to currencyStatus.currency,
),
router.push(
AppRoute.CurrencyDetails(
userWalletId = userWalletId,
currency = currencyStatus.currency,
),
)
}
}
override fun openStoriesScreen() {
reduxNavController.navigate(action = NavigationAction.NavigateTo(screen = AppScreen.Home))
router.push(AppRoute.Home)
}
override fun openSaveUserWalletScreen() {
reduxNavController.navigate(action = NavigationAction.NavigateTo(AppScreen.SaveWallet))
router.push(AppRoute.SaveWallet)
}
override fun isWalletLastScreen(): Boolean = reduxNavController.getBackStack().lastOrNull() == AppScreen.Wallet
override fun isWalletLastScreen(): Boolean {
return router.stack.lastOrNull() is AppRoute.Wallet
}
override fun openManageTokensScreen() {
reduxNavController.navigate(action = NavigationAction.NavigateTo(AppScreen.ManageTokens))
router.push(AppRoute.ManageTokens)
}
override fun openScanFailedDialog(onTryAgain: () -> Unit) {

View file

@ -2,7 +2,7 @@ package com.tangem.feature.wallet.presentation.router
import androidx.compose.runtime.Composable
import androidx.compose.runtime.Stable
import com.tangem.core.navigation.AppScreen
import com.tangem.domain.tokens.model.CryptoCurrencyStatus
import com.tangem.domain.wallets.models.UserWalletId
import com.tangem.features.managetokens.navigation.ManageTokensUi
@ -29,7 +29,7 @@ internal interface InnerWalletRouter : WalletRouter {
fun Initialize(onFinish: () -> Unit, manageTokensUi: ManageTokensUi)
/** Pop back stack */
fun popBackStack(screen: AppScreen? = null)
fun popBackStack()
/** Open organize tokens screen */
fun openOrganizeTokensScreen(userWalletId: UserWalletId)

View file

@ -154,7 +154,8 @@ private fun WalletContent(
horizontalAlignment = Alignment.CenterHorizontally,
) {
item(
key = state.wallets.map { it.walletCardState.id },
// !!! Type of the key should be saveable via Bundle on Android !!!
key = state.wallets.map { it.walletCardState.id.stringValue },
contentType = state.wallets.map { it.walletCardState.id },
) {
WalletsList(

View file

@ -1,21 +1,16 @@
package com.tangem.feature.wallet.presentation.wallet.viewmodels.intents
import arrow.core.getOrElse
import com.tangem.common.routing.AppRoute
import com.tangem.common.routing.AppRouter
import com.tangem.core.analytics.api.AnalyticsEventHandler
import com.tangem.core.ui.extensions.resourceReference
import com.tangem.core.ui.extensions.wrappedList
import com.tangem.domain.wallets.usecase.GetWalletNamesUseCase
import com.tangem.domain.wallets.usecase.RenameWalletUseCase
import com.tangem.feature.wallet.impl.R
import com.tangem.domain.card.DeleteSavedAccessCodesUseCase
import com.tangem.core.navigation.AppScreen
import com.tangem.core.navigation.NavigationAction
import com.tangem.core.navigation.ReduxNavController
import com.tangem.domain.redux.ReduxStateHolder
import com.tangem.domain.wallets.models.UserWalletId
import com.tangem.domain.wallets.usecase.DeleteWalletUseCase
import com.tangem.domain.wallets.usecase.GetSelectedWalletSyncUseCase
import com.tangem.domain.wallets.usecase.GetUserWalletUseCase
import com.tangem.domain.wallets.usecase.*
import com.tangem.feature.wallet.impl.R
import com.tangem.feature.wallet.presentation.wallet.analytics.WalletScreenAnalyticsEvent.MainScreen
import com.tangem.feature.wallet.presentation.wallet.loaders.WalletScreenContentLoader
import com.tangem.feature.wallet.presentation.wallet.state.WalletStateController
@ -52,7 +47,7 @@ internal class WalletCardClickIntentsImplementor @Inject constructor(
private val deleteSavedAccessCodesUseCase: DeleteSavedAccessCodesUseCase,
private val analyticsEventHandler: AnalyticsEventHandler,
private val reduxStateHolder: ReduxStateHolder,
private val reduxNavController: ReduxNavController,
private val appRouter: AppRouter,
private val dispatchers: CoroutineDispatcherProvider,
) : BaseWalletClickIntents(), WalletCardClickIntents {
@ -123,7 +118,7 @@ internal class WalletCardClickIntentsImplementor @Inject constructor(
reduxStateHolder.onUserWalletSelected(selectedWallet)
} else {
stateHolder.clear()
reduxNavController.navigate(NavigationAction.PopBackTo(AppScreen.Home))
appRouter.replaceAll(AppRoute.Home)
}
}
}