Updated on 2026-08-14

This commit is contained in:
Tangem 2023-07-28 10:30:50 +03:00
parent e0b5ca0c4d
commit ef438c3cd3
6 changed files with 55 additions and 22 deletions

View file

@ -3,13 +3,16 @@ package com.tangem.feature.wallet.presentation.organizetokens
import androidx.compose.runtime.getValue
import androidx.compose.runtime.mutableStateOf
import androidx.compose.runtime.setValue
import androidx.lifecycle.SavedStateHandle
import androidx.lifecycle.ViewModel
import androidx.lifecycle.viewModelScope
import com.tangem.domain.wallets.models.UserWalletId
import com.tangem.feature.wallet.presentation.common.WalletPreviewData
import com.tangem.feature.wallet.presentation.organizetokens.OrganizeTokensStateHolder.DragConfig
import com.tangem.feature.wallet.presentation.organizetokens.OrganizeTokensStateHolder.HeaderConfig
import com.tangem.feature.wallet.presentation.organizetokens.utils.*
import com.tangem.feature.wallet.presentation.router.InnerWalletRouter
import com.tangem.feature.wallet.presentation.router.WalletRoute
import dagger.hilt.android.lifecycle.HiltViewModel
import kotlinx.collections.immutable.toPersistentList
import kotlinx.coroutines.Dispatchers
@ -20,12 +23,17 @@ import kotlin.properties.Delegates
// FIXME: Implemented with preview data
@HiltViewModel
internal class OrganizeTokensViewModel @Inject constructor() : ViewModel() {
internal class OrganizeTokensViewModel @Inject constructor(savedStateHandle: SavedStateHandle) : ViewModel() {
@Volatile
private var movingItem: DraggableItem? = null
var router: InnerWalletRouter by Delegates.notNull()
val userWalletId: UserWalletId by lazy {
val userWalletIdValue: String = checkNotNull(savedStateHandle[WalletRoute.userWalletIdKey])
UserWalletId(userWalletIdValue)
}
var uiState: OrganizeTokensStateHolder by mutableStateOf(getInitialState())
private set

View file

@ -1,6 +1,5 @@
package com.tangem.feature.wallet.presentation.router
import androidx.activity.compose.BackHandler
import androidx.compose.foundation.layout.systemBarsPadding
import androidx.compose.runtime.Composable
import androidx.compose.ui.Modifier
@ -9,12 +8,15 @@ import androidx.fragment.app.Fragment
import androidx.fragment.app.FragmentManager
import androidx.hilt.navigation.compose.hiltViewModel
import androidx.navigation.NavHostController
import androidx.navigation.NavType
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.NavigationStateHolder
import com.tangem.domain.wallets.models.UserWalletId
import com.tangem.feature.wallet.presentation.WalletFragment
import com.tangem.feature.wallet.presentation.organizetokens.OrganizeTokensScreen
import com.tangem.feature.wallet.presentation.organizetokens.OrganizeTokensViewModel
@ -36,20 +38,23 @@ internal class DefaultWalletRouter(private val navigationStateHolder: Navigation
NavHost(
navController = rememberNavController().apply { navController = this },
startDestination = WalletScreens.WALLET.name,
startDestination = WalletRoute.Wallet.route,
) {
composable(WalletScreens.WALLET.name) {
composable(WalletRoute.Wallet.route) {
val viewModel = hiltViewModel<WalletViewModel>().apply { router = this@DefaultWalletRouter }
LocalLifecycleOwner.current.lifecycle.addObserver(observer = viewModel)
WalletScreen(state = viewModel.uiState)
}
composable(WalletScreens.ORGANIZE_TOKENS.name) {
BackHandler(onBack = ::popBackStack)
composable(
WalletRoute.OrganizeTokens.route,
arguments = listOf(navArgument(WalletRoute.userWalletIdKey) { type = NavType.StringType }),
) {
val viewModel: OrganizeTokensViewModel = hiltViewModel<OrganizeTokensViewModel>()
.apply { router = this@DefaultWalletRouter }
.apply {
router = this@DefaultWalletRouter
}
OrganizeTokensScreen(
modifier = Modifier.systemBarsPadding(),
@ -73,8 +78,8 @@ internal class DefaultWalletRouter(private val navigationStateHolder: Navigation
}
}
override fun openOrganizeTokensScreen() {
navController.navigate(route = WalletScreens.ORGANIZE_TOKENS.name)
override fun openOrganizeTokensScreen(userWalletId: UserWalletId) {
navController.navigate(WalletRoute.OrganizeTokens.createRoute(userWalletId))
}
override fun openDetailsScreen() {

View file

@ -3,6 +3,7 @@ package com.tangem.feature.wallet.presentation.router
import androidx.compose.runtime.Composable
import androidx.compose.runtime.Stable
import androidx.fragment.app.FragmentManager
import com.tangem.domain.wallets.models.UserWalletId
import com.tangem.features.wallet.navigation.WalletRouter
/**
@ -29,7 +30,7 @@ internal interface InnerWalletRouter : WalletRouter {
fun popBackStack()
/** Open organize tokens screen */
fun openOrganizeTokensScreen()
fun openOrganizeTokensScreen(userWalletId: UserWalletId)
/** Open details screen */
fun openDetailsScreen()

View file

@ -0,0 +1,24 @@
package com.tangem.feature.wallet.presentation.router
import com.tangem.domain.wallets.models.UserWalletId
/**
* Wallet feature screens
*
* @property route route string representation
*
[REDACTED_AUTHOR]
*/
internal sealed class WalletRoute(val route: String) {
object Wallet : WalletRoute(route = "wallet")
object OrganizeTokens : WalletRoute(route = "wallet/{$userWalletIdKey}/organize_tokens") {
fun createRoute(userWalletId: UserWalletId) = "wallet/${userWalletId.stringValue}/organize_tokens"
}
companion object {
const val userWalletIdKey = "userWalletId"
}
}

View file

@ -1,10 +0,0 @@
package com.tangem.feature.wallet.presentation.router
/**
* Wallet feature screens
*
[REDACTED_AUTHOR]
*/
enum class WalletScreens {
WALLET, ORGANIZE_TOKENS
}

View file

@ -243,5 +243,10 @@ internal class WalletViewModel @Inject constructor(
updateContentItems(index = uiState.walletsListConfig.selectedWalletIndex, isRefreshing = true)
}
override fun onOrganizeTokensClick() = router.openOrganizeTokensScreen()
override fun onOrganizeTokensClick() {
val index = uiState.walletsListConfig.selectedWalletIndex
val walletId = uiState.walletsListConfig.wallets[index].id
router.openOrganizeTokensScreen(walletId)
}
}