Updated on 2026-08-14

This commit is contained in:
Tangem 2023-07-21 10:25:39 +03:00
parent 3e71ba89ac
commit bfdac6a9a8
3 changed files with 92 additions and 0 deletions

View file

@ -26,6 +26,15 @@ internal object TokensDomainModule {
return GetTokenListUseCase(tokensRepository, quotesRepository, networksRepository, dispatchers)
}
@Provides
@ViewModelScoped
fun provideToggleTokenListGroupingUseCase(
networksRepository: NetworksRepository,
dispatchers: CoroutineDispatcherProvider,
): ToggleTokenListGroupingUseCase {
return ToggleTokenListGroupingUseCase(networksRepository, dispatchers)
}
@Provides
@ViewModelScoped
fun provideToggleTokenListSortingUseCase(dispatchers: CoroutineDispatcherProvider): ToggleTokenListSortingUseCase {

View file

@ -0,0 +1,81 @@
package com.tangem.domain.tokens
import arrow.core.Either
import arrow.core.raise.Raise
import arrow.core.raise.catch
import arrow.core.raise.either
import arrow.core.raise.ensure
import com.tangem.domain.tokens.error.TokenListSortingError
import com.tangem.domain.tokens.error.mapper.mapToTokenListSortingError
import com.tangem.domain.tokens.model.Network
import com.tangem.domain.tokens.model.TokenList
import com.tangem.domain.tokens.operations.TokenListSortingOperations
import com.tangem.domain.tokens.repository.NetworksRepository
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import kotlinx.coroutines.withContext
class ToggleTokenListGroupingUseCase(
private val networksRepository: NetworksRepository,
private val dispatchers: CoroutineDispatcherProvider,
) {
suspend operator fun invoke(tokenList: TokenList): Either<TokenListSortingError, TokenList> {
return withContext(dispatchers.default) {
either {
ensure(tokenList.totalFiatBalance !is TokenList.FiatBalance.Loading) {
TokenListSortingError.TokenListIsLoading
}
when (tokenList) {
is TokenList.GroupedByNetwork -> ungroupTokens(tokenList)
is TokenList.Ungrouped -> groupTokens(tokenList)
is TokenList.NotInitialized -> raise(TokenListSortingError.TokenListIsEmpty)
}
}
}
}
private suspend fun Raise<TokenListSortingError>.groupTokens(
tokenList: TokenList.Ungrouped,
): TokenList.GroupedByNetwork {
val sortingOperations = getSortingOperations(tokenList)
val tokens = sortingOperations.getTokens()
val networks = getNetworks(tokens.map { it.networkId }.toSet())
return TokenList.GroupedByNetwork(
groups = sortingOperations.getGroupedTokens(networks),
totalFiatBalance = tokenList.totalFiatBalance,
sortedBy = sortingOperations.getSortType(),
)
}
private suspend fun Raise<TokenListSortingError>.ungroupTokens(
tokenList: TokenList.GroupedByNetwork,
): TokenList.Ungrouped {
val sortingOperations = getSortingOperations(tokenList)
return TokenList.Ungrouped(
tokens = sortingOperations.getTokens(),
totalFiatBalance = tokenList.totalFiatBalance,
sortedBy = sortingOperations.getSortType(),
)
}
private fun Raise<TokenListSortingError>.getSortingOperations(tokenList: TokenList): TokenListSortingOperations<*> {
return TokenListSortingOperations(
tokenList = tokenList,
dispatchers = dispatchers,
raise = this,
transformError = TokenListSortingOperations.Error::mapToTokenListSortingError,
)
}
private suspend fun Raise<TokenListSortingError>.getNetworks(networksIds: Set<Network.ID>): Set<Network> {
return withContext(dispatchers.io) {
catch(
block = { networksRepository.getNetworks(networksIds) },
catch = { raise(TokenListSortingError.DataError(it)) },
)
}
}
}

View file

@ -7,4 +7,6 @@ sealed class TokenListSortingError {
object TokenListIsEmpty : TokenListSortingError()
object UnableToSortTokenList : TokenListSortingError()
data class DataError(val cause: Throwable) : TokenListSortingError()
}