diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/visa/api/OnboardingVisaComponent.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/visa/api/OnboardingVisaComponent.kt new file mode 100644 index 0000000000..eb6a9c353d --- /dev/null +++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/visa/api/OnboardingVisaComponent.kt @@ -0,0 +1,13 @@ +package com.tangem.features.onboarding.v2.visa.api + +import com.tangem.core.decompose.factory.ComponentFactory +import com.tangem.core.decompose.navigation.inner.InnerNavigationHolder +import com.tangem.core.ui.decompose.ComposableContentComponent +import com.tangem.features.onboarding.v2.TitleProvider + +interface OnboardingVisaComponent : ComposableContentComponent, InnerNavigationHolder { + + data class Params(val titleProvider: TitleProvider) + + interface Factory : ComponentFactory +} \ No newline at end of file diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/visa/impl/DefaultOnboardingVisaComponent.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/visa/impl/DefaultOnboardingVisaComponent.kt new file mode 100644 index 0000000000..fe903926b8 --- /dev/null +++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/visa/impl/DefaultOnboardingVisaComponent.kt @@ -0,0 +1,59 @@ +package com.tangem.features.onboarding.v2.visa.impl + +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import com.tangem.core.decompose.context.AppComponentContext +import com.tangem.core.decompose.navigation.inner.InnerNavigation +import com.tangem.core.decompose.navigation.inner.InnerNavigationState +import com.tangem.features.onboarding.v2.visa.api.OnboardingVisaComponent +import dagger.assisted.Assisted +import dagger.assisted.AssistedFactory +import dagger.assisted.AssistedInject +import kotlinx.coroutines.channels.BufferOverflow +import kotlinx.coroutines.flow.MutableSharedFlow +import kotlinx.coroutines.flow.MutableStateFlow +import kotlinx.coroutines.flow.StateFlow +import kotlinx.coroutines.launch + +@Suppress("UnusedPrivateMember") +class DefaultOnboardingVisaComponent @AssistedInject constructor( + @Assisted appComponentContext: AppComponentContext, + @Assisted private val params: OnboardingVisaComponent.Params, +) : OnboardingVisaComponent, AppComponentContext by appComponentContext { + + private val innerNavigationState = MutableStateFlow( + OnboardingVisaInnerNavigationState( + stackSize = 1, + stackMaxSize = 7, + ), + ) + + private val currentChildBackEventHandle = MutableSharedFlow(onBufferOverflow = BufferOverflow.DROP_LATEST) + + override val innerNavigation: InnerNavigation = object : InnerNavigation { + override val state: StateFlow = innerNavigationState + + override fun pop(onComplete: (Boolean) -> Unit) { + // TODO add stack handling + componentScope.launch { currentChildBackEventHandle.emit(Unit) } + } + } + + @Composable + override fun Content(modifier: Modifier) { + TODO("Not yet implemented") + } + + @AssistedFactory + interface Factory : OnboardingVisaComponent.Factory { + override fun create( + context: AppComponentContext, + params: OnboardingVisaComponent.Params, + ): DefaultOnboardingVisaComponent + } +} + +data class OnboardingVisaInnerNavigationState( + override val stackSize: Int, + override val stackMaxSize: Int?, +) : InnerNavigationState \ No newline at end of file diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/visa/impl/child/accesscode/OnboardingVisaAccessCodeComponent.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/visa/impl/child/accesscode/OnboardingVisaAccessCodeComponent.kt new file mode 100644 index 0000000000..2c3e0eb8dd --- /dev/null +++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/visa/impl/child/accesscode/OnboardingVisaAccessCodeComponent.kt @@ -0,0 +1,28 @@ +package com.tangem.features.onboarding.v2.visa.impl.child.accesscode + +import androidx.activity.compose.BackHandler +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import com.tangem.core.decompose.context.AppComponentContext +import com.tangem.core.decompose.model.getOrCreateModel +import com.tangem.core.ui.decompose.ComposableContentComponent +import com.tangem.features.onboarding.v2.visa.impl.child.accesscode.model.OnboardingVisaAccessCodeModel +import kotlinx.coroutines.flow.SharedFlow + +class OnboardingVisaAccessCodeComponent( + appComponentContext: AppComponentContext, + private val params: Params, +) : ComposableContentComponent, AppComponentContext by appComponentContext { + + private val model: OnboardingVisaAccessCodeModel = getOrCreateModel(params) + + @Composable + override fun Content(modifier: Modifier) { + BackHandler(onBack = model::onBack) + } + + data class Params( + val parentBackEvent: SharedFlow, + val onBack: () -> Unit, + ) +} \ No newline at end of file diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/visa/impl/child/accesscode/model/OnboardingVisaAccessCodeModel.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/visa/impl/child/accesscode/model/OnboardingVisaAccessCodeModel.kt new file mode 100644 index 0000000000..678c620c27 --- /dev/null +++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/visa/impl/child/accesscode/model/OnboardingVisaAccessCodeModel.kt @@ -0,0 +1,24 @@ +package com.tangem.features.onboarding.v2.visa.impl.child.accesscode.model + +import androidx.compose.runtime.Stable +import com.tangem.core.decompose.di.ComponentScoped +import com.tangem.core.decompose.model.Model +import com.tangem.core.decompose.model.ParamsContainer +import com.tangem.features.onboarding.v2.visa.impl.child.accesscode.OnboardingVisaAccessCodeComponent +import com.tangem.utils.coroutines.CoroutineDispatcherProvider +import javax.inject.Inject + +@Stable +@ComponentScoped +class OnboardingVisaAccessCodeModel @Inject constructor( + override val dispatchers: CoroutineDispatcherProvider, + private val paramsContainer: ParamsContainer, +) : Model() { + + @Suppress("UnusedPrivateMember") + private val params = paramsContainer.require() + + fun onBack() { + TODO() + } +} \ No newline at end of file diff --git a/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/visa/impl/child/welcome/OnboardingVisaWelcomeComponent.kt b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/visa/impl/child/welcome/OnboardingVisaWelcomeComponent.kt new file mode 100644 index 0000000000..8dab8ddac4 --- /dev/null +++ b/features/onboarding-v2/impl/src/main/kotlin/com/tangem/features/onboarding/v2/visa/impl/child/welcome/OnboardingVisaWelcomeComponent.kt @@ -0,0 +1,23 @@ +package com.tangem.features.onboarding.v2.visa.impl.child.welcome + +import androidx.activity.compose.BackHandler +import androidx.compose.runtime.Composable +import androidx.compose.runtime.remember +import androidx.compose.ui.Modifier +import com.tangem.core.decompose.context.AppComponentContext +import com.tangem.core.ui.decompose.ComposableContentComponent + +class OnboardingVisaWelcomeComponent( + appComponentContext: AppComponentContext, + private val params: Params, +) : ComposableContentComponent, AppComponentContext by appComponentContext { + + @Composable + override fun Content(modifier: Modifier) { + BackHandler(onBack = remember(this) { { params.onBack() } }) + } + + data class Params( + val onBack: () -> Unit, + ) +} \ No newline at end of file