Updated on 2026-08-14

This commit is contained in:
Tangem 2024-10-29 14:20:14 +04:00
parent 06f2d51e87
commit 1698771cfd
5 changed files with 119 additions and 0 deletions

View file

@ -13,6 +13,7 @@ import com.tangem.features.managetokens.component.ManageTokensSource
import com.tangem.features.markets.details.MarketsTokenDetailsComponent
import com.tangem.features.onramp.component.BuyCryptoComponent
import com.tangem.features.onramp.component.OnrampComponent
import com.tangem.features.onramp.component.SellCryptoComponent
import com.tangem.features.pushnotifications.api.navigation.PushNotificationsRouter
import com.tangem.features.send.api.navigation.SendRouter
import com.tangem.features.staking.api.navigation.StakingRouter
@ -50,6 +51,7 @@ internal class ChildFactory @Inject constructor(
private val marketsTokenDetailsComponentFactory: MarketsTokenDetailsComponent.Factory,
private val onrampComponentFactory: OnrampComponent.Factory,
private val buyCryptoComponentFactory: BuyCryptoComponent.Factory,
private val sellCryptoComponentFactory: SellCryptoComponent.Factory,
private val sendRouter: SendRouter,
private val tokenDetailsRouter: TokenDetailsRouter,
private val walletRouter: WalletRouter,
@ -204,6 +206,13 @@ internal class ChildFactory @Inject constructor(
componentFactory = buyCryptoComponentFactory,
)
}
is AppRoute.SellCrypto -> {
route.asComponentChild(
contextProvider = contextProvider(route, contextFactory),
params = SellCryptoComponent.Params(userWalletId = route.userWalletId),
componentFactory = sellCryptoComponentFactory,
)
}
}
}

View file

@ -292,4 +292,9 @@ sealed class AppRoute(val path: String) : Route {
data class BuyCrypto(
val userWalletId: UserWalletId,
) : AppRoute(path = "/buy_crypto/${userWalletId.stringValue}")
@Serializable
data class SellCrypto(
val userWalletId: UserWalletId,
) : AppRoute(path = "/sell_crypto/${userWalletId.stringValue}")
}

View file

@ -0,0 +1,22 @@
package com.tangem.features.onramp.component
import com.tangem.core.decompose.factory.ComponentFactory
import com.tangem.core.ui.decompose.ComposableContentComponent
import com.tangem.domain.wallets.models.UserWalletId
/**
* Sell crypto component
*
[REDACTED_AUTHOR]
*/
interface SellCryptoComponent : ComposableContentComponent {
interface Factory : ComponentFactory<Params, SellCryptoComponent>
/**
* Params
*
* @property userWalletId user wallet id
*/
data class Params(val userWalletId: UserWalletId)
}

View file

@ -0,0 +1,65 @@
package com.tangem.features.onramp.sell
import androidx.compose.runtime.Composable
import androidx.compose.runtime.Stable
import androidx.compose.ui.Modifier
import arrow.core.getOrElse
import com.tangem.core.decompose.context.AppComponentContext
import com.tangem.domain.appcurrency.GetSelectedAppCurrencyUseCase
import com.tangem.domain.appcurrency.model.AppCurrency
import com.tangem.domain.redux.ReduxStateHolder
import com.tangem.domain.tokens.legacy.TradeCryptoAction
import com.tangem.domain.tokens.model.CryptoCurrencyStatus
import com.tangem.features.onramp.component.SellCryptoComponent
import com.tangem.features.onramp.impl.R
import com.tangem.features.onramp.selecttoken.OnrampSelectTokenComponent
import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import kotlinx.coroutines.launch
@Stable
internal class DefaultSellCryptoComponent @AssistedInject constructor(
onrampSelectTokenComponentFactory: OnrampSelectTokenComponent.Factory,
@Assisted private val appComponentContext: AppComponentContext,
@Assisted private val params: SellCryptoComponent.Params,
private val reduxStateHolder: ReduxStateHolder,
private val getSelectedAppCurrencyUseCase: GetSelectedAppCurrencyUseCase,
) : SellCryptoComponent {
private val selectTokenComponent: OnrampSelectTokenComponent = onrampSelectTokenComponentFactory.create(
context = appComponentContext,
params = OnrampSelectTokenComponent.Params(
hasSearchBar = true,
userWalletId = params.userWalletId,
titleResId = R.string.common_sell,
onTokenClick = ::onTokenClick,
),
)
@Composable
override fun Content(modifier: Modifier) {
selectTokenComponent.Content(modifier = modifier)
}
private fun onTokenClick(status: CryptoCurrencyStatus) {
appComponentContext.componentScope.launch {
reduxStateHolder.dispatch(
TradeCryptoAction.Sell(
cryptoCurrencyStatus = status,
appCurrencyCode = getSelectedAppCurrencyUseCase.invokeSync()
.getOrElse { AppCurrency.Default }.code,
),
)
}
}
@AssistedFactory
interface Factory : SellCryptoComponent.Factory {
override fun create(
context: AppComponentContext,
params: SellCryptoComponent.Params,
): DefaultSellCryptoComponent
}
}

View file

@ -0,0 +1,18 @@
package com.tangem.features.onramp.sell.di
import com.tangem.features.onramp.component.SellCryptoComponent
import com.tangem.features.onramp.sell.DefaultSellCryptoComponent
import dagger.Binds
import dagger.Module
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import javax.inject.Singleton
@Module
@InstallIn(SingletonComponent::class)
internal interface SellCryptoComponentModule {
@Binds
@Singleton
fun bindSellCryptoComponentFactory(factory: DefaultSellCryptoComponent.Factory): SellCryptoComponent.Factory
}