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 48042171a4..46a9c70161 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 @@ -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), 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 66993b210a..da4f005d32 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 @@ -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, diff --git a/features/onramp/api/src/main/kotlin/com/tangem/features/onramp/component/OnrampSuccessComponent.kt b/features/onramp/api/src/main/kotlin/com/tangem/features/onramp/component/OnrampSuccessComponent.kt new file mode 100644 index 0000000000..70b6e543c4 --- /dev/null +++ b/features/onramp/api/src/main/kotlin/com/tangem/features/onramp/component/OnrampSuccessComponent.kt @@ -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 +} \ No newline at end of file diff --git a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/success/DefaultOnrampSuccessComponent.kt b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/success/DefaultOnrampSuccessComponent.kt new file mode 100644 index 0000000000..0f5787d3b3 --- /dev/null +++ b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/success/DefaultOnrampSuccessComponent.kt @@ -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 + } +} \ No newline at end of file diff --git a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/success/di/OnrampSuccessComponentModelModule.kt b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/success/di/OnrampSuccessComponentModelModule.kt new file mode 100644 index 0000000000..ba6f6664fd --- /dev/null +++ b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/success/di/OnrampSuccessComponentModelModule.kt @@ -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 +} \ No newline at end of file diff --git a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/success/di/OnrampSuccessComponentModule.kt b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/success/di/OnrampSuccessComponentModule.kt new file mode 100644 index 0000000000..fe2545877b --- /dev/null +++ b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/success/di/OnrampSuccessComponentModule.kt @@ -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 +} \ No newline at end of file diff --git a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/success/entity/OnrampSuccessComponentUM.kt b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/success/entity/OnrampSuccessComponentUM.kt new file mode 100644 index 0000000000..3f0bea7160 --- /dev/null +++ b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/success/entity/OnrampSuccessComponentUM.kt @@ -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() +} \ No newline at end of file diff --git a/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/success/model/OnrampSuccessComponentModel.kt b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/success/model/OnrampSuccessComponentModel.kt new file mode 100644 index 0000000000..bdda90effd --- /dev/null +++ b/features/onramp/impl/src/main/kotlin/com/tangem/features/onramp/success/model/OnrampSuccessComponentModel.kt @@ -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 = MutableStateFlow( + value = OnrampSuccessComponentUM.Loading, + ) + val state: StateFlow get() = _state.asStateFlow() +} \ No newline at end of file