Updated on 2026-08-14

This commit is contained in:
Tangem 2023-04-12 16:33:33 +09:00
parent 8a9547827b
commit cb5f018d2a
11 changed files with 91 additions and 54 deletions

View file

@ -29,6 +29,7 @@ internal object CoinsResponseConverter : Converter<CoinsResponse, List<Token>> {
blockchain = blockchain,
address = network.contractAddress,
iconUrl = getIconUrl(network.networkId, value.imageHost),
decimalCount = network.decimalCount?.toInt(),
)
},
)

View file

@ -29,6 +29,7 @@ internal object TestnetTokensConfigConverter : Converter<TestnetTokensConfig, Li
blockchain = blockchain,
address = network.address,
iconUrl = getIconUrl(id = network.id, imageHost = null),
decimalCount = network.decimalCount,
)
}.orEmpty(),
)

View file

@ -0,0 +1,40 @@
package com.tangem.tap.features.tokens.di
import com.tangem.datasource.api.tangemTech.TangemTechApi
import com.tangem.datasource.local.testnet.TestnetTokensStorage
import com.tangem.tap.features.tokens.data.DefaultTokensListRepository
import com.tangem.tap.features.tokens.domain.DefaultTokensListInteractor
import com.tangem.tap.features.tokens.domain.TokensListInteractor
import com.tangem.tap.proxy.AppStateHolder
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.android.components.ViewModelComponent
import dagger.hilt.android.scopes.ViewModelScoped
/**
[REDACTED_AUTHOR]
*/
@Module
@InstallIn(ViewModelComponent::class)
internal object TokensListInteractorModule {
@Provides
@ViewModelScoped
fun provideTokensListInteractor(
tangemTechApi: TangemTechApi,
dispatchers: CoroutineDispatcherProvider,
reduxStateHolder: AppStateHolder,
testnetTokensStorage: TestnetTokensStorage,
): TokensListInteractor {
return DefaultTokensListInteractor(
repository = DefaultTokensListRepository(
tangemTechApi = tangemTechApi,
dispatchers = dispatchers,
reduxStateHolder = reduxStateHolder,
testnetTokensStorage = testnetTokensStorage,
),
)
}
}

View file

@ -1,37 +0,0 @@
package com.tangem.tap.features.tokens.di
import com.tangem.datasource.api.tangemTech.TangemTechApi
import com.tangem.datasource.local.testnet.TestnetTokensStorage
import com.tangem.tap.features.tokens.data.DefaultTokensListRepository
import com.tangem.tap.features.tokens.domain.TokensListRepository
import com.tangem.tap.proxy.AppStateHolder
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import javax.inject.Singleton
/**
[REDACTED_AUTHOR]
*/
@Module
@InstallIn(SingletonComponent::class)
internal object TokensListRepositoryModule {
@Provides
@Singleton
fun providesTokensListRepository(
tangemTechApi: TangemTechApi,
dispatchers: CoroutineDispatcherProvider,
reduxStateHolder: AppStateHolder,
testnetTokensStorage: TestnetTokensStorage,
): TokensListRepository {
return DefaultTokensListRepository(
tangemTechApi = tangemTechApi,
dispatchers = dispatchers,
reduxStateHolder = reduxStateHolder,
testnetTokensStorage = testnetTokensStorage,
)
}
}

View file

@ -1,7 +1,7 @@
package com.tangem.tap.features.tokens.di
import com.tangem.tap.features.tokens.presentation.router.AddTokensRouter
import com.tangem.tap.features.tokens.presentation.router.DefaultAddTokensRouter
import com.tangem.tap.features.tokens.presentation.router.DefaultTokensListRouter
import com.tangem.tap.features.tokens.presentation.router.TokensListRouter
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
@ -13,9 +13,9 @@ import dagger.hilt.android.scopes.ViewModelScoped
*/
@Module
@InstallIn(ViewModelComponent::class)
internal object AddTokensRouterModule {
internal object TokensListRouterModule {
@Provides
@ViewModelScoped
fun provideAddTokensRouter(): AddTokensRouter = DefaultAddTokensRouter()
fun provideTokensListRouter(): TokensListRouter = DefaultTokensListRouter()
}

View file

@ -0,0 +1,17 @@
package com.tangem.tap.features.tokens.domain
import androidx.paging.PagingData
import com.tangem.tap.features.tokens.domain.models.Token
import kotlinx.coroutines.flow.Flow
/**
* Default implementation of tokens list interactor
*
* @property repository repository of tokens list feature
*/
internal class DefaultTokensListInteractor(private val repository: TokensListRepository) : TokensListInteractor {
override fun getTokensList(searchText: String): Flow<PagingData<Token>> {
return repository.getAvailableTokens(searchText = searchText.ifBlank(defaultValue = { null }))
}
}

View file

@ -0,0 +1,16 @@
package com.tangem.tap.features.tokens.domain
import androidx.paging.PagingData
import com.tangem.tap.features.tokens.domain.models.Token
import kotlinx.coroutines.flow.Flow
/**
* Interactor of tokens list feature
*
[REDACTED_AUTHOR]
*/
internal interface TokensListInteractor {
/** Get tokens list using filter by text [searchText] */
fun getTokensList(searchText: String): Flow<PagingData<Token>>
}

View file

@ -24,10 +24,11 @@ internal data class Token(
/**
* Domain model of network for tokens list screen
*
* @property id network id
* @property blockchain blockchain
* @property address address. If address equals null, it means it is the main network of token
* @property iconUrl network icon url
* @property id network id
* @property blockchain blockchain
* @property address address. If address equals null, it means it is the main network of token
* @property iconUrl network icon url
* @property decimalCount decimal count
*
[REDACTED_AUTHOR]
*/
@ -36,5 +37,6 @@ internal data class Token(
val blockchain: Blockchain,
val address: String?,
val iconUrl: String,
val decimalCount: Int?,
)
}

View file

@ -1,17 +1,15 @@
package com.tangem.tap.features.tokens.presentation.router
import com.tangem.core.analytics.Analytics
import com.tangem.tap.common.analytics.events.ManageTokens
import com.tangem.tap.common.redux.navigation.NavigationAction
import com.tangem.tap.features.tokens.redux.TokensAction
import com.tangem.tap.store
/**
* Router implementation for add tokens feature
* Default implementation of tokens list router
*
[REDACTED_AUTHOR]
*/
internal class DefaultAddTokensRouter : AddTokensRouter {
internal class DefaultTokensListRouter : TokensListRouter {
override fun popBackStack() {
store.dispatch(NavigationAction.PopBackTo())
@ -19,7 +17,6 @@ internal class DefaultAddTokensRouter : AddTokensRouter {
}
override fun openAddCustomTokenScreen() {
Analytics.send(ManageTokens.ButtonCustomToken())
store.dispatch(TokensAction.PrepareAndNavigateToAddCustomToken)
}
}

View file

@ -1,7 +1,7 @@
package com.tangem.tap.features.tokens.presentation.router
/** Add tokens feature router */
internal interface AddTokensRouter {
/** Tokens list feature router */
internal interface TokensListRouter {
/** Return to last screen */
fun popBackStack()

View file

@ -24,7 +24,7 @@ import com.tangem.tap.common.redux.AppDialog
import com.tangem.tap.common.redux.AppState
import com.tangem.tap.domain.tokens.Contract
import com.tangem.tap.domain.tokens.Currency
import com.tangem.tap.features.tokens.presentation.router.AddTokensRouter
import com.tangem.tap.features.tokens.presentation.router.TokensListRouter
import com.tangem.tap.features.tokens.presentation.states.NetworkItemState
import com.tangem.tap.features.tokens.presentation.states.TokenItemState
import com.tangem.tap.features.tokens.presentation.states.TokensListStateHolder
@ -55,7 +55,7 @@ import javax.inject.Inject
*/
@HiltViewModel
internal class TokensListViewModel @Inject constructor(
private val router: AddTokensRouter,
private val router: TokensListRouter,
private val dispatchers: AppCoroutineDispatcherProvider,
) : ViewModel() {