Updated on 2026-08-14

This commit is contained in:
Tangem 2026-04-21 16:29:43 +04:00
parent cc78c7dde5
commit 6d37d90a86
39 changed files with 114 additions and 113 deletions

View file

@ -1,56 +0,0 @@
package com.tangem.features.account
import com.tangem.domain.account.models.AccountStatusList
import com.tangem.domain.appcurrency.model.AppCurrency
import com.tangem.domain.models.wallet.UserWallet
import com.tangem.domain.models.wallet.UserWalletId
import kotlinx.coroutines.CoroutineScope
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.StateFlow
/**
* How to use see [PortfolioSelectorComponent]
*/
interface PortfolioFetcher {
val data: Flow<Data>
val mode: StateFlow<Mode>
fun updateMode(mode: Mode)
data class Data(
val appCurrency: AppCurrency,
val isBalanceHidden: Boolean,
val balances: Map<UserWalletId, PortfolioBalance>,
) {
val isSingleChoice: Boolean = balances.values
.map { it.accountsBalance.accountStatuses }
.sumOf { it.size } == 1
fun isSingleChoice(walletId: UserWalletId): Boolean = balances[walletId]
?.accountsBalance
?.accountStatuses
?.size == 1
}
data class PortfolioBalance(
val userWallet: UserWallet,
val accountsBalance: AccountStatusList,
) {
val walletBalance get() = accountsBalance.totalFiatBalance
val userWalletId: UserWalletId get() = userWallet.walletId
}
sealed interface Mode {
data class All(val isOnlyMultiCurrency: Boolean) : Mode
data class Wallet(val walletId: UserWalletId) : Mode
}
/**
* @param[mode] supports runtime change [PortfolioFetcher.updateMode]
*/
interface Factory {
fun create(mode: Mode, scope: CoroutineScope): PortfolioFetcher
}
}

View file

@ -1,66 +0,0 @@
package com.tangem.features.account
import com.tangem.core.decompose.factory.ComponentFactory
import com.tangem.core.ui.decompose.ComposableBottomSheetComponent
import com.tangem.core.ui.decompose.ComposableContentComponent
import com.tangem.core.ui.extensions.TextReference
import com.tangem.domain.models.account.AccountId
import com.tangem.domain.models.account.AccountStatus
import com.tangem.domain.models.wallet.UserWallet
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
/**
* How to use
* 1) Create and keep instance of [PortfolioFetcher] and [PortfolioSelectorController] in your Feature Model
* 2) Provide them via [Params]
* 3) Now you have a bridge between your Feature and PortfolioSelector
* 4) Initial state is unselected. Select yourself [PortfolioSelectorController.selectAccount]
* or offer users to select
*
* 5) Listen [PortfolioSelectorController.selectedAccount] or [PortfolioSelectorController.selectedAccountWithData]
*
* Note:
* - Supports [PortfolioSelectorComponent.BottomSheet] and [PortfolioSelectorComponent.Content] modes
*/
interface PortfolioSelectorComponent : ComposableBottomSheetComponent, ComposableContentComponent {
val title: StateFlow<TextReference>
data class Params(
val portfolioFetcher: PortfolioFetcher,
val controller: PortfolioSelectorController,
val bsCallback: BottomSheetCallback? = null,
)
interface BottomSheetCallback {
val onDismiss: () -> Unit
val onBack: () -> Unit
}
interface Factory : ComponentFactory<Params, PortfolioSelectorComponent>
}
/**
* How to use see [PortfolioSelectorComponent]
*
* if [isAccountMode] is false it's mean [selectedAccount] emit [AccountId] for Main account
*/
interface PortfolioSelectorController {
val isAccountMode: Flow<Boolean>
val selectedAccount: Flow<AccountId?>
val selectedAccountSync: AccountId?
/**
* for some Feature specific filtering
* combine and update with your Feature data and [PortfolioFetcher.data]
*/
val isEnabled: MutableStateFlow<(UserWallet, AccountStatus) -> Boolean>
suspend fun isAccountModeSync(): Boolean
fun selectAccount(accountId: AccountId?)
fun selectedAccountWithData(
portfolioFetcher: PortfolioFetcher,
): Flow<Pair<UserWallet, AccountStatus.CryptoPortfolio>?>
}