Updated on 2026-08-14

This commit is contained in:
Tangem 2024-11-15 11:26:02 +05:00
parent db358d8014
commit f1eb31f5f4
8 changed files with 142 additions and 4 deletions

View file

@ -12,10 +12,7 @@ import com.tangem.features.managetokens.component.ManageTokensComponent
import com.tangem.features.managetokens.component.ManageTokensSource
import com.tangem.features.markets.details.MarketsTokenDetailsComponent
import com.tangem.features.onboarding.v2.entry.OnboardingEntryComponent
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.onramp.component.SwapSelectTokensComponent
import com.tangem.features.onramp.component.*
import com.tangem.features.pushnotifications.api.navigation.PushNotificationsRouter
import com.tangem.features.send.api.navigation.SendRouter
import com.tangem.features.staking.api.navigation.StakingRouter
@ -52,6 +49,7 @@ internal class ChildFactory @Inject constructor(
private val manageTokensComponentFactory: ManageTokensComponent.Factory,
private val marketsTokenDetailsComponentFactory: MarketsTokenDetailsComponent.Factory,
private val onrampComponentFactory: OnrampComponent.Factory,
private val onrampSuccessComponentFactory: OnrampSuccessComponent.Factory,
private val buyCryptoComponentFactory: BuyCryptoComponent.Factory,
private val sellCryptoComponentFactory: SellCryptoComponent.Factory,
private val swapSelectTokensComponentFactory: SwapSelectTokensComponent.Factory,
@ -203,6 +201,13 @@ internal class ChildFactory @Inject constructor(
componentFactory = onrampComponentFactory,
)
}
is AppRoute.OnrampSuccess -> {
route.asComponentChild(
contextProvider = contextProvider(route, contextFactory),
params = OnrampSuccessComponent.Params(route.txId),
componentFactory = onrampSuccessComponentFactory,
)
}
is AppRoute.BuyCrypto -> {
route.asComponentChild(
contextProvider = contextProvider(route, contextFactory),

View file

@ -299,6 +299,13 @@ sealed class AppRoute(val path: String) : Route {
override fun getBundle(): Bundle = bundle(serializer())
}
@Serializable
data class OnrampSuccess(
val txId: String,
) : AppRoute(path = "/onramp/success/$txId"), RouteBundleParams {
override fun getBundle(): Bundle = bundle(serializer())
}
@Serializable
data class BuyCrypto(
val userWalletId: UserWalletId,

View file

@ -0,0 +1,11 @@
package com.tangem.features.onramp.component
import com.tangem.core.decompose.factory.ComponentFactory
import com.tangem.core.ui.decompose.ComposableContentComponent
interface OnrampSuccessComponent : ComposableContentComponent {
data class Params(val txId: String?)
interface Factory : ComponentFactory<Params, OnrampSuccessComponent>
}

View file

@ -0,0 +1,36 @@
package com.tangem.features.onramp.success
import androidx.compose.runtime.Composable
import androidx.compose.runtime.collectAsState
import androidx.compose.runtime.getValue
import androidx.compose.ui.Modifier
import com.tangem.core.decompose.context.AppComponentContext
import com.tangem.core.decompose.model.getOrCreateModel
import com.tangem.features.onramp.component.OnrampSuccessComponent
import com.tangem.features.onramp.success.model.OnrampSuccessComponentModel
import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
internal class DefaultOnrampSuccessComponent @AssistedInject constructor(
@Assisted appComponentContext: AppComponentContext,
@Assisted params: OnrampSuccessComponent.Params,
) : OnrampSuccessComponent, AppComponentContext by appComponentContext {
private val model: OnrampSuccessComponentModel = getOrCreateModel(params)
@Composable
override fun Content(modifier: Modifier) {
val state by model.state.collectAsState()
// todo onramp [REDACTED_JIRA]
}
@AssistedFactory
interface Factory : OnrampSuccessComponent.Factory {
override fun create(
context: AppComponentContext,
params: OnrampSuccessComponent.Params,
): DefaultOnrampSuccessComponent
}
}

View file

@ -0,0 +1,19 @@
package com.tangem.features.onramp.success.di
import com.tangem.core.decompose.di.DecomposeComponent
import com.tangem.core.decompose.model.Model
import com.tangem.features.onramp.success.model.OnrampSuccessComponentModel
import dagger.Binds
import dagger.Module
import dagger.hilt.InstallIn
import dagger.multibindings.ClassKey
import dagger.multibindings.IntoMap
@Module
@InstallIn(DecomposeComponent::class)
internal interface OnrampSuccessComponentModelModule {
@Binds
@IntoMap
@ClassKey(OnrampSuccessComponentModel::class)
fun bindOnrampSuccessComponentModel(model: OnrampSuccessComponentModel): Model
}

View file

@ -0,0 +1,19 @@
package com.tangem.features.onramp.success.di
import com.tangem.features.onramp.component.OnrampSuccessComponent
import com.tangem.features.onramp.success.DefaultOnrampSuccessComponent
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 OnrampSuccessComponentModule {
@Binds
@Singleton
fun bindOnrampSuccessComponentFactory(
factory: DefaultOnrampSuccessComponent.Factory,
): OnrampSuccessComponent.Factory
}

View file

@ -0,0 +1,16 @@
package com.tangem.features.onramp.success.entity
sealed class OnrampSuccessComponentUM {
data object Loading : OnrampSuccessComponentUM()
data class Content(
val txId: String,
val createdAt: Long,
val providerId: String,
val currencyImageUrl: String,
val fromAmount: String,
val toAmount: String,
val onBackClick: () -> Unit,
) : OnrampSuccessComponentUM()
}

View file

@ -0,0 +1,25 @@
package com.tangem.features.onramp.success.model
import com.tangem.core.decompose.model.Model
import com.tangem.core.decompose.model.ParamsContainer
import com.tangem.features.onramp.component.OnrampSuccessComponent
import com.tangem.features.onramp.success.entity.OnrampSuccessComponentUM
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.asStateFlow
import javax.inject.Inject
internal class OnrampSuccessComponentModel @Inject constructor(
override val dispatchers: CoroutineDispatcherProvider,
paramsContainer: ParamsContainer,
) : Model() {
// todo onramp remove in [REDACTED_JIRA]
@Suppress("UnusedPrivateMember")
private val params: OnrampSuccessComponent.Params = paramsContainer.require()
private val _state: MutableStateFlow<OnrampSuccessComponentUM> = MutableStateFlow(
value = OnrampSuccessComponentUM.Loading,
)
val state: StateFlow<OnrampSuccessComponentUM> get() = _state.asStateFlow()
}