Updated on 2026-08-14
This commit is contained in:
parent
cc78c7dde5
commit
6d37d90a86
39 changed files with 114 additions and 113 deletions
|
|
@ -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
|
||||
}
|
||||
}
|
||||
|
|
@ -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>?>
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue