Updated on 2026-08-14
This commit is contained in:
parent
3e71ba89ac
commit
bfdac6a9a8
3 changed files with 92 additions and 0 deletions
|
|
@ -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 {
|
||||
|
|
|
|||
|
|
@ -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)) },
|
||||
)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -7,4 +7,6 @@ sealed class TokenListSortingError {
|
|||
object TokenListIsEmpty : TokenListSortingError()
|
||||
|
||||
object UnableToSortTokenList : TokenListSortingError()
|
||||
|
||||
data class DataError(val cause: Throwable) : TokenListSortingError()
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue