diff --git a/app/src/main/java/com/tangem/tap/routing/utils/ChildFactory.kt b/app/src/main/java/com/tangem/tap/routing/utils/ChildFactory.kt index 06b53a8fd3..5731dab42f 100644 --- a/app/src/main/java/com/tangem/tap/routing/utils/ChildFactory.kt +++ b/app/src/main/java/com/tangem/tap/routing/utils/ChildFactory.kt @@ -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, + ) + } } } diff --git a/common/routing/src/main/kotlin/com/tangem/common/routing/AppRoute.kt b/common/routing/src/main/kotlin/com/tangem/common/routing/AppRoute.kt index c10a008033..cb8be40a85 100644 --- a/common/routing/src/main/kotlin/com/tangem/common/routing/AppRoute.kt +++ b/common/routing/src/main/kotlin/com/tangem/common/routing/AppRoute.kt @@ -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}") } \ No newline at end of file diff --git a/features/onramp/api/src/main/kotlin/com/tangem/features/onramp/component/SellCryptoComponent.kt b/features/onramp/api/src/main/kotlin/com/tangem/features/onramp/component/SellCryptoComponent.kt new file mode 100644 index 0000000000..ce340b8c07 --- /dev/null +++ b/features/onramp/api/src/main/kotlin/com/tangem/features/onramp/component/SellCryptoComponent.kt @@ -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 + * + * @property userWalletId user wallet id + */ + data class Params(val userWalletId: UserWalletId) +} \ No newline at end of file diff --git a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/sell/DefaultSellCryptoComponent.kt b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/sell/DefaultSellCryptoComponent.kt new file mode 100644 index 0000000000..b1a3589e6c --- /dev/null +++ b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/sell/DefaultSellCryptoComponent.kt @@ -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 + } +} \ No newline at end of file diff --git a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/sell/di/SellCryptoComponentModule.kt b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/sell/di/SellCryptoComponentModule.kt new file mode 100644 index 0000000000..cb2ec7c8f6 --- /dev/null +++ b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/sell/di/SellCryptoComponentModule.kt @@ -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 +} \ No newline at end of file