From bfdac6a9a87db0504eb8457851e0e8500eeccd29 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 21 Jul 2023 10:25:39 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../tap/di/domain/TokensDomainModule.kt | 9 +++ .../tokens/ToggleTokenListGroupingUseCase.kt | 81 +++++++++++++++++++ .../tokens/error/TokenListSortingError.kt | 2 + 3 files changed, 92 insertions(+) create mode 100644 domain/tokens/src/main/kotlin/com/tangem/domain/tokens/ToggleTokenListGroupingUseCase.kt diff --git a/app/src/main/java/com/tangem/tap/di/domain/TokensDomainModule.kt b/app/src/main/java/com/tangem/tap/di/domain/TokensDomainModule.kt index a43ebfeb6c..c5f6850336 100644 --- a/app/src/main/java/com/tangem/tap/di/domain/TokensDomainModule.kt +++ b/app/src/main/java/com/tangem/tap/di/domain/TokensDomainModule.kt @@ -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 { diff --git a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/ToggleTokenListGroupingUseCase.kt b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/ToggleTokenListGroupingUseCase.kt new file mode 100644 index 0000000000..4d65f82422 --- /dev/null +++ b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/ToggleTokenListGroupingUseCase.kt @@ -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 { + 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.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.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.getSortingOperations(tokenList: TokenList): TokenListSortingOperations<*> { + return TokenListSortingOperations( + tokenList = tokenList, + dispatchers = dispatchers, + raise = this, + transformError = TokenListSortingOperations.Error::mapToTokenListSortingError, + ) + } + + private suspend fun Raise.getNetworks(networksIds: Set): Set { + return withContext(dispatchers.io) { + catch( + block = { networksRepository.getNetworks(networksIds) }, + catch = { raise(TokenListSortingError.DataError(it)) }, + ) + } + } +} \ No newline at end of file diff --git a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/error/TokenListSortingError.kt b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/error/TokenListSortingError.kt index ae49dfb209..847432134b 100644 --- a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/error/TokenListSortingError.kt +++ b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/error/TokenListSortingError.kt @@ -7,4 +7,6 @@ sealed class TokenListSortingError { object TokenListIsEmpty : TokenListSortingError() object UnableToSortTokenList : TokenListSortingError() + + data class DataError(val cause: Throwable) : TokenListSortingError() } \ No newline at end of file