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 c5f6850336..b593c7a762 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 @@ -40,4 +40,13 @@ internal object TokensDomainModule { fun provideToggleTokenListSortingUseCase(dispatchers: CoroutineDispatcherProvider): ToggleTokenListSortingUseCase { return ToggleTokenListSortingUseCase(dispatchers) } + + @Provides + @ViewModelScoped + fun provideApplyTokenListSortingUseCase( + tokensRepository: TokensRepository, + dispatchers: CoroutineDispatcherProvider, + ): ApplyTokenListSortingUseCase { + return ApplyTokenListSortingUseCase(tokensRepository, dispatchers) + } } \ No newline at end of file diff --git a/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/MockTokensRepository.kt b/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/MockTokensRepository.kt index e6b7760a7c..8c9ec119a7 100644 --- a/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/MockTokensRepository.kt +++ b/data/tokens/src/main/kotlin/com/tangem/data/tokens/repository/MockTokensRepository.kt @@ -11,7 +11,7 @@ internal class MockTokensRepository : TokensRepository { override suspend fun sortTokens( userWalletId: UserWalletId, - sortedTokensIds: Set, + sortedTokens: Set, isGrouped: Boolean, isSortedByBalance: Boolean, ) = Unit diff --git a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/ApplyTokenListSortingUseCase.kt b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/ApplyTokenListSortingUseCase.kt new file mode 100644 index 0000000000..2f51531dc2 --- /dev/null +++ b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/ApplyTokenListSortingUseCase.kt @@ -0,0 +1,49 @@ +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.ensureNotNull +import arrow.core.toNonEmptySetOrNull +import com.tangem.domain.tokens.error.TokenListSortingError +import com.tangem.domain.tokens.model.Token +import com.tangem.domain.tokens.repository.TokensRepository +import com.tangem.domain.wallets.models.UserWalletId +import com.tangem.utils.coroutines.CoroutineDispatcherProvider +import kotlinx.coroutines.withContext + +class ApplyTokenListSortingUseCase( + private val tokensRepository: TokensRepository, + private val dispatchers: CoroutineDispatcherProvider, +) { + + suspend operator fun invoke( + userWalletId: UserWalletId, + sortedTokens: Set, + isGrouped: Boolean, + isSortedByBalance: Boolean, + ): Either { + return withContext(dispatchers.default) { + either { + val nonEmptyTokens = ensureNotNull(sortedTokens.toNonEmptySetOrNull()) { + TokenListSortingError.TokenListIsEmpty + } + + applySorting(userWalletId, nonEmptyTokens, isGrouped, isSortedByBalance) + } + } + } + + private suspend fun Raise.applySorting( + userWalletId: UserWalletId, + tokens: Set, + isGrouped: Boolean, + isSortedByBalance: Boolean, + ) = withContext(dispatchers.io) { + catch( + block = { tokensRepository.sortTokens(userWalletId, tokens, isGrouped, isSortedByBalance) }, + catch = { raise(TokenListSortingError.DataError(it)) }, + ) + } +} \ No newline at end of file diff --git a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/repository/NetworksRepository.kt b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/repository/NetworksRepository.kt index 93f7f7c95b..97efc6c34a 100644 --- a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/repository/NetworksRepository.kt +++ b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/repository/NetworksRepository.kt @@ -6,9 +6,6 @@ import com.tangem.domain.tokens.model.Token import com.tangem.domain.wallets.models.UserWalletId import kotlinx.coroutines.flow.Flow -// FIXME: Use Raise as context instead of Effect when context receivers become stable -// [REDACTED_JIRA] - /** * Repository for everything related to the blockchain networks * */ diff --git a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/repository/QuotesRepository.kt b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/repository/QuotesRepository.kt index 984ffb6608..fd3e10aaff 100644 --- a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/repository/QuotesRepository.kt +++ b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/repository/QuotesRepository.kt @@ -4,9 +4,6 @@ import com.tangem.domain.tokens.model.Quote import com.tangem.domain.tokens.model.Token import kotlinx.coroutines.flow.Flow -// FIXME: Use Raise as context instead of Effect when context receivers become stable -// [REDACTED_JIRA] - /** * Repository for everything related to the quotes of tokens * */ diff --git a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/repository/TokensRepository.kt b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/repository/TokensRepository.kt index b544ecb8f5..1f978018a3 100644 --- a/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/repository/TokensRepository.kt +++ b/domain/tokens/src/main/kotlin/com/tangem/domain/tokens/repository/TokensRepository.kt @@ -4,9 +4,6 @@ import com.tangem.domain.tokens.model.Token import com.tangem.domain.wallets.models.UserWalletId import kotlinx.coroutines.flow.Flow -// FIXME: Use Raise as context instead of Effect when context receivers become stable -// [REDACTED_JIRA] - /** * Repository for everything related to the tokens of user wallet * */ @@ -14,7 +11,7 @@ interface TokensRepository { suspend fun sortTokens( userWalletId: UserWalletId, - sortedTokensIds: Set, + sortedTokens: Set, isGrouped: Boolean, isSortedByBalance: Boolean, ) diff --git a/domain/tokens/src/test/kotlin/com/tangem/domain/tokens/repository/MockTokensRepository.kt b/domain/tokens/src/test/kotlin/com/tangem/domain/tokens/repository/MockTokensRepository.kt index 813816c52a..c5db701f0b 100644 --- a/domain/tokens/src/test/kotlin/com/tangem/domain/tokens/repository/MockTokensRepository.kt +++ b/domain/tokens/src/test/kotlin/com/tangem/domain/tokens/repository/MockTokensRepository.kt @@ -16,7 +16,7 @@ internal class MockTokensRepository( override suspend fun sortTokens( userWalletId: UserWalletId, - sortedTokensIds: Set, + sortedTokens: Set, isGrouped: Boolean, isSortedByBalance: Boolean, ) = Unit