From fabac3cf5b0a015367d9f17412d758ba682c40a3 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 10 Jan 2025 13:08:12 +0500 Subject: [PATCH 1/3] Updated on 2026-08-14 --- .../configs/feature_toggles_config.json | 4 ++++ features/swap/api/build.gradle.kts | 12 ++--------- .../features/swap/SwapFeatureToggles.kt | 5 +++++ features/swap/presentation/build.gradle.kts | 1 + .../feature/swap/DefaultSwapFeatureToggles.kt | 11 ++++++++++ .../feature/swap/di/SwapFeatureModule.kt | 21 +++++++++++++++++++ 6 files changed, 44 insertions(+), 10 deletions(-) create mode 100644 features/swap/api/src/main/kotlin/com/tangem/features/swap/SwapFeatureToggles.kt create mode 100644 features/swap/presentation/src/main/java/com/tangem/feature/swap/DefaultSwapFeatureToggles.kt create mode 100644 features/swap/presentation/src/main/java/com/tangem/feature/swap/di/SwapFeatureModule.kt diff --git a/core/config-toggles/src/main/assets/configs/feature_toggles_config.json b/core/config-toggles/src/main/assets/configs/feature_toggles_config.json index 60580e40b7..6b82c24e67 100644 --- a/core/config-toggles/src/main/assets/configs/feature_toggles_config.json +++ b/core/config-toggles/src/main/assets/configs/feature_toggles_config.json @@ -26,5 +26,9 @@ { "name": "NAVIGATION_REFACTORING", "version": "undefined" + }, + { + "name": "SWAP_STORIES_ENABLED", + "version": "undefined" } ] diff --git a/features/swap/api/build.gradle.kts b/features/swap/api/build.gradle.kts index 76bb25817f..099edf86ca 100644 --- a/features/swap/api/build.gradle.kts +++ b/features/swap/api/build.gradle.kts @@ -1,18 +1,10 @@ plugins { alias(deps.plugins.android.library) alias(deps.plugins.kotlin.android) - alias(deps.plugins.kotlin.kapt) - alias(deps.plugins.kotlin.serialization) - alias(deps.plugins.hilt.android) + id("kotlin-parcelize") id("configuration") } android { - namespace = "com.tangem.feature.swap.api" -} - -dependencies { - /** DI */ - implementation(deps.hilt.android) - kapt(deps.hilt.kapt) + namespace = "com.tangem.features.swap.api" } \ No newline at end of file diff --git a/features/swap/api/src/main/kotlin/com/tangem/features/swap/SwapFeatureToggles.kt b/features/swap/api/src/main/kotlin/com/tangem/features/swap/SwapFeatureToggles.kt new file mode 100644 index 0000000000..f43c34f8ac --- /dev/null +++ b/features/swap/api/src/main/kotlin/com/tangem/features/swap/SwapFeatureToggles.kt @@ -0,0 +1,5 @@ +package com.tangem.features.swap + +interface SwapFeatureToggles { + val isPromoStoriesEnabled: Boolean +} \ No newline at end of file diff --git a/features/swap/presentation/build.gradle.kts b/features/swap/presentation/build.gradle.kts index bd52ee999a..dfd97b9d99 100644 --- a/features/swap/presentation/build.gradle.kts +++ b/features/swap/presentation/build.gradle.kts @@ -44,6 +44,7 @@ dependencies { implementation(projects.features.swap.domain.api) implementation(projects.features.swap.domain.models) implementation(projects.features.wallet.api) + implementation(projects.features.swap.api) /** AndroidX */ implementation(deps.androidx.activity.compose) diff --git a/features/swap/presentation/src/main/java/com/tangem/feature/swap/DefaultSwapFeatureToggles.kt b/features/swap/presentation/src/main/java/com/tangem/feature/swap/DefaultSwapFeatureToggles.kt new file mode 100644 index 0000000000..cd341751d8 --- /dev/null +++ b/features/swap/presentation/src/main/java/com/tangem/feature/swap/DefaultSwapFeatureToggles.kt @@ -0,0 +1,11 @@ +package com.tangem.feature.swap + +import com.tangem.core.configtoggle.feature.FeatureTogglesManager +import com.tangem.features.swap.SwapFeatureToggles + +internal class DefaultSwapFeatureToggles( + private val featureToggles: FeatureTogglesManager, +) : SwapFeatureToggles { + override val isPromoStoriesEnabled: Boolean + get() = featureToggles.isFeatureEnabled("SWAP_STORIES_ENABLED") +} \ No newline at end of file diff --git a/features/swap/presentation/src/main/java/com/tangem/feature/swap/di/SwapFeatureModule.kt b/features/swap/presentation/src/main/java/com/tangem/feature/swap/di/SwapFeatureModule.kt new file mode 100644 index 0000000000..f2b92be438 --- /dev/null +++ b/features/swap/presentation/src/main/java/com/tangem/feature/swap/di/SwapFeatureModule.kt @@ -0,0 +1,21 @@ +package com.tangem.feature.swap.di + +import com.tangem.core.configtoggle.feature.FeatureTogglesManager +import com.tangem.feature.swap.DefaultSwapFeatureToggles +import com.tangem.features.swap.SwapFeatureToggles +import dagger.Module +import dagger.Provides +import dagger.hilt.InstallIn +import dagger.hilt.components.SingletonComponent +import javax.inject.Singleton + +@Module +@InstallIn(SingletonComponent::class) +internal object SwapFeatureModule { + + @Provides + @Singleton + fun provideSwapFeatureToggles(featureToggles: FeatureTogglesManager): SwapFeatureToggles { + return DefaultSwapFeatureToggles(featureToggles) + } +} \ No newline at end of file From 563d95d75ee0c2ce1348c2d08bbdf3f8c8d2b008 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 10 Jan 2025 13:08:41 +0500 Subject: [PATCH 2/3] Updated on 2026-08-14 --- .../tangem/tap/di/domain/PromoDomainModule.kt | 11 +++++++---- .../local/preferences/PreferencesKeys.kt | 2 ++ .../tangem/data/promo/DefaultPromoRepository.kt | 17 +++++++++++++++++ .../com/tangem/domain/promo/PromoRepository.kt | 6 ++++++ .../promo/ShouldShowSwapStoriesUseCase.kt | 10 ++++++++++ 5 files changed, 42 insertions(+), 4 deletions(-) create mode 100644 domain/promo/src/main/java/com/tangem/domain/promo/ShouldShowSwapStoriesUseCase.kt diff --git a/app/src/main/java/com/tangem/tap/di/domain/PromoDomainModule.kt b/app/src/main/java/com/tangem/tap/di/domain/PromoDomainModule.kt index ccc91c699c..381de50f84 100644 --- a/app/src/main/java/com/tangem/tap/di/domain/PromoDomainModule.kt +++ b/app/src/main/java/com/tangem/tap/di/domain/PromoDomainModule.kt @@ -1,9 +1,6 @@ package com.tangem.tap.di.domain -import com.tangem.domain.promo.PromoRepository -import com.tangem.domain.promo.ShouldShowRingPromoUseCase -import com.tangem.domain.promo.ShouldShowSwapPromoTokenUseCase -import com.tangem.domain.promo.ShouldShowSwapPromoWalletUseCase +import com.tangem.domain.promo.* import dagger.Module import dagger.Provides import dagger.hilt.InstallIn @@ -33,4 +30,10 @@ internal object PromoDomainModule { fun provideShouldShowSwapPromoTokenUseCase(promoRepository: PromoRepository): ShouldShowSwapPromoTokenUseCase { return ShouldShowSwapPromoTokenUseCase(promoRepository) } + + @Provides + @Singleton + fun provideShouldShowSwapStoriesUseCase(promoRepository: PromoRepository): ShouldShowSwapStoriesUseCase { + return ShouldShowSwapStoriesUseCase(promoRepository) + } } \ No newline at end of file diff --git a/core/datasource/src/main/java/com/tangem/datasource/local/preferences/PreferencesKeys.kt b/core/datasource/src/main/java/com/tangem/datasource/local/preferences/PreferencesKeys.kt index a18f6044f7..0a5aad5199 100644 --- a/core/datasource/src/main/java/com/tangem/datasource/local/preferences/PreferencesKeys.kt +++ b/core/datasource/src/main/java/com/tangem/datasource/local/preferences/PreferencesKeys.kt @@ -113,6 +113,8 @@ object PreferencesKeys { val WAS_LOG_FILE_CLEARED by lazy { booleanPreferencesKey(name = "wasLogFileCleared") } + val SHOULD_SHOW_SWAP_STORIES_KEY by lazy { booleanPreferencesKey("shouldShowSwapStories") } + // region Permission fun getShouldShowPermission(permission: String) = booleanPreferencesKey("shouldShowPushPermission_$permission") diff --git a/data/promo/src/main/java/com/tangem/data/promo/DefaultPromoRepository.kt b/data/promo/src/main/java/com/tangem/data/promo/DefaultPromoRepository.kt index 4714406f4d..6a0307943f 100644 --- a/data/promo/src/main/java/com/tangem/data/promo/DefaultPromoRepository.kt +++ b/data/promo/src/main/java/com/tangem/data/promo/DefaultPromoRepository.kt @@ -8,7 +8,9 @@ import com.tangem.datasource.local.preferences.PreferencesKeys.ADDED_WALLETS_WIT import com.tangem.datasource.local.preferences.PreferencesKeys.IS_TOKEN_SWAP_PROMO_OKX_SHOW_KEY import com.tangem.datasource.local.preferences.PreferencesKeys.IS_WALLET_SWAP_PROMO_OKX_SHOW_KEY import com.tangem.datasource.local.preferences.PreferencesKeys.SHOULD_SHOW_RING_PROMO_KEY +import com.tangem.datasource.local.preferences.PreferencesKeys.SHOULD_SHOW_SWAP_STORIES_KEY import com.tangem.datasource.local.preferences.utils.get +import com.tangem.datasource.local.preferences.utils.getSyncOrDefault import com.tangem.datasource.local.preferences.utils.store import com.tangem.domain.promo.PromoRepository import com.tangem.domain.promo.models.PromoBanner @@ -89,6 +91,21 @@ internal class DefaultPromoRepository( appPreferencesStore.store(key = SHOULD_SHOW_RING_PROMO_KEY, value = false) } + override fun isReadyToShowSwapStories(): Flow { + return appPreferencesStore.get(SHOULD_SHOW_SWAP_STORIES_KEY, true) + } + + override suspend fun isReadyToShowSwapStoriesSync(): Boolean { + return appPreferencesStore.getSyncOrDefault(SHOULD_SHOW_SWAP_STORIES_KEY, true) + } + + override suspend fun setNeverToShowSwapStories() { + appPreferencesStore.store( + key = SHOULD_SHOW_SWAP_STORIES_KEY, + value = false, + ) + } + private companion object { private const val CHANGELLY_NAME = "changelly" private const val OKX = "okx" diff --git a/domain/promo/src/main/java/com/tangem/domain/promo/PromoRepository.kt b/domain/promo/src/main/java/com/tangem/domain/promo/PromoRepository.kt index 6350df9b18..de2c366987 100644 --- a/domain/promo/src/main/java/com/tangem/domain/promo/PromoRepository.kt +++ b/domain/promo/src/main/java/com/tangem/domain/promo/PromoRepository.kt @@ -23,4 +23,10 @@ interface PromoRepository { fun isReadyToShowRingPromo(userWalletId: UserWalletId): Flow suspend fun setNeverToShowRingPromo() + + fun isReadyToShowSwapStories(): Flow + + suspend fun isReadyToShowSwapStoriesSync(): Boolean + + suspend fun setNeverToShowSwapStories() } \ No newline at end of file diff --git a/domain/promo/src/main/java/com/tangem/domain/promo/ShouldShowSwapStoriesUseCase.kt b/domain/promo/src/main/java/com/tangem/domain/promo/ShouldShowSwapStoriesUseCase.kt new file mode 100644 index 0000000000..35d46bbf27 --- /dev/null +++ b/domain/promo/src/main/java/com/tangem/domain/promo/ShouldShowSwapStoriesUseCase.kt @@ -0,0 +1,10 @@ +package com.tangem.domain.promo + +import kotlinx.coroutines.flow.Flow + +class ShouldShowSwapStoriesUseCase(private val promoRepository: PromoRepository) { + operator fun invoke(): Flow = promoRepository.isReadyToShowSwapStories() + suspend fun invokeSync(): Boolean = promoRepository.isReadyToShowSwapStoriesSync() + + suspend fun neverToShow() = promoRepository.setNeverToShowSwapStories() +} \ No newline at end of file From 1b25b81caf87bc8b0a2da04621b0be9ce04e4816 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 10 Jan 2025 13:09:31 +0500 Subject: [PATCH 3/3] Updated on 2026-08-14 --- .../ui/components/stories/StoriesContainer.kt | 11 +++++++--- .../stories/inner/StoriesProgressBar.kt | 1 + .../stories/model/StoriesContentConfig.kt | 1 + features/swap/presentation/build.gradle.kts | 1 + .../feature/swap/models/SwapStateHolder.kt | 1 + .../swap/models/SwapStoriesContentConfig.kt | 19 ++++++++++++++++++ .../tangem/feature/swap/models/UiActions.kt | 1 + .../feature/swap/presentation/SwapFragment.kt | 9 +++++++++ .../tangem/feature/swap/router/SwapRouter.kt | 2 +- .../tangem/feature/swap/ui/StateBuilder.kt | 20 +++++++++++++++++++ .../feature/swap/ui/SwapStoriesScreen.kt | 20 +++++++++++++++++++ .../feature/swap/viewmodels/SwapViewModel.kt | 18 +++++++++++++++++ 12 files changed, 100 insertions(+), 4 deletions(-) create mode 100644 features/swap/presentation/src/main/java/com/tangem/feature/swap/models/SwapStoriesContentConfig.kt create mode 100644 features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/SwapStoriesScreen.kt diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/stories/StoriesContainer.kt b/core/ui/src/main/java/com/tangem/core/ui/components/stories/StoriesContainer.kt index f1cd043fd6..0bcf8ace95 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/components/stories/StoriesContainer.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/components/stories/StoriesContainer.kt @@ -56,15 +56,19 @@ inline fun StoriesContainer( onNextStory = storyState::nextStory, ) + currentStoryContent(storyState.currentStory, isPaused) + StoriesProgressBar( steps = storyState.steps, currentStep = storyState.currentIndex.intValue, stepDuration = storyState.currentStory.duration, paused = isPaused, - onStepFinish = storyState::nextStory, + onStepFinish = { + if (storyState.nextStory()) { + config.onClose() + } + }, ) - - currentStoryContent(storyState.currentStory, isPaused) } } @@ -97,6 +101,7 @@ private data class StoryContainerPreviewProviderData( StoryConfigPreviewProviderData(title = "Wallet"), ), override val isRestartable: Boolean = true, + override val onClose: () -> Unit = {}, ) : StoriesContentConfig private data class StoryConfigPreviewProviderData( diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/stories/inner/StoriesProgressBar.kt b/core/ui/src/main/java/com/tangem/core/ui/components/stories/inner/StoriesProgressBar.kt index f2c504316e..5f009d8569 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/components/stories/inner/StoriesProgressBar.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/components/stories/inner/StoriesProgressBar.kt @@ -80,6 +80,7 @@ fun StoriesProgressBar( Row( verticalAlignment = Alignment.CenterVertically, modifier = Modifier + .statusBarsPadding() .padding( start = 16.dp, end = 16.dp, diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/stories/model/StoriesContentConfig.kt b/core/ui/src/main/java/com/tangem/core/ui/components/stories/model/StoriesContentConfig.kt index 68cc624895..f5e569292a 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/components/stories/model/StoriesContentConfig.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/components/stories/model/StoriesContentConfig.kt @@ -11,6 +11,7 @@ import kotlinx.collections.immutable.ImmutableList interface StoriesContentConfig { val stories: ImmutableList val isRestartable: Boolean + val onClose: () -> Unit } interface StoryConfig { diff --git a/features/swap/presentation/build.gradle.kts b/features/swap/presentation/build.gradle.kts index dfd97b9d99..3049182a5f 100644 --- a/features/swap/presentation/build.gradle.kts +++ b/features/swap/presentation/build.gradle.kts @@ -38,6 +38,7 @@ dependencies { implementation(projects.domain.settings) implementation(projects.domain.staking) implementation(projects.domain.feedback) + implementation(projects.domain.promo) /** Feature modules */ implementation(projects.features.swap.domain) diff --git a/features/swap/presentation/src/main/java/com/tangem/feature/swap/models/SwapStateHolder.kt b/features/swap/presentation/src/main/java/com/tangem/feature/swap/models/SwapStateHolder.kt index 542c5974cb..d4498bf83c 100644 --- a/features/swap/presentation/src/main/java/com/tangem/feature/swap/models/SwapStateHolder.kt +++ b/features/swap/presentation/src/main/java/com/tangem/feature/swap/models/SwapStateHolder.kt @@ -34,6 +34,7 @@ internal data class SwapStateHolder( val successState: SwapSuccessStateHolder? = null, val selectTokenState: SwapSelectTokenStateHolder? = null, val bottomSheetConfig: TangemBottomSheetConfig? = null, + val storiesConfig: SwapStoriesContentConfig? = null, val swapButton: SwapButton, val shouldShowMaxAmount: Boolean, diff --git a/features/swap/presentation/src/main/java/com/tangem/feature/swap/models/SwapStoriesContentConfig.kt b/features/swap/presentation/src/main/java/com/tangem/feature/swap/models/SwapStoriesContentConfig.kt new file mode 100644 index 0000000000..625eecdb62 --- /dev/null +++ b/features/swap/presentation/src/main/java/com/tangem/feature/swap/models/SwapStoriesContentConfig.kt @@ -0,0 +1,19 @@ +package com.tangem.feature.swap.models + +import androidx.annotation.DrawableRes +import com.tangem.core.ui.components.stories.model.StoriesContentConfig +import com.tangem.core.ui.components.stories.model.StoryConfig +import kotlinx.collections.immutable.ImmutableList + +data class SwapStoriesContentConfig( + override val stories: ImmutableList, + override val onClose: () -> Unit, +) : StoriesContentConfig { + override val isRestartable: Boolean = false +} + +data class SwapStoryConfig( + @DrawableRes val imageRes: Int, +) : StoryConfig { + override val duration: Int = 2000 +} \ No newline at end of file diff --git a/features/swap/presentation/src/main/java/com/tangem/feature/swap/models/UiActions.kt b/features/swap/presentation/src/main/java/com/tangem/feature/swap/models/UiActions.kt index 0075bcca6e..4c7a41a979 100644 --- a/features/swap/presentation/src/main/java/com/tangem/feature/swap/models/UiActions.kt +++ b/features/swap/presentation/src/main/java/com/tangem/feature/swap/models/UiActions.kt @@ -21,6 +21,7 @@ data class UiActions( val openPermissionBottomSheet: () -> Unit, val onChangeApproveType: (ApproveType) -> Unit, // region new actions + val onStoriesClose: () -> Unit, val onRetryClick: () -> Unit, val onClickFee: () -> Unit, val onSelectFeeType: (TxFee) -> Unit, diff --git a/features/swap/presentation/src/main/java/com/tangem/feature/swap/presentation/SwapFragment.kt b/features/swap/presentation/src/main/java/com/tangem/feature/swap/presentation/SwapFragment.kt index d6389ac181..86c77dd6e8 100644 --- a/features/swap/presentation/src/main/java/com/tangem/feature/swap/presentation/SwapFragment.kt +++ b/features/swap/presentation/src/main/java/com/tangem/feature/swap/presentation/SwapFragment.kt @@ -13,6 +13,7 @@ import com.tangem.core.ui.screen.ComposeFragment import com.tangem.feature.swap.router.SwapNavScreen import com.tangem.feature.swap.ui.SwapScreen import com.tangem.feature.swap.ui.SwapSelectTokenScreen +import com.tangem.feature.swap.ui.SwapStoriesScreen import com.tangem.feature.swap.ui.SwapSuccessScreen import com.tangem.feature.swap.viewmodels.SwapViewModel import dagger.hilt.android.AndroidEntryPoint @@ -46,6 +47,14 @@ class SwapFragment : ComposeFragment() { label = "", ) { screen -> when (screen) { + SwapNavScreen.PromoStories -> { + val storiesConfig = viewModel.uiState.storiesConfig + if (storiesConfig != null) { + SwapStoriesScreen(config = storiesConfig) + } else { + SwapScreen(stateHolder = viewModel.uiState) + } + } SwapNavScreen.Main -> SwapScreen(stateHolder = viewModel.uiState) SwapNavScreen.Success -> { val successState = viewModel.uiState.successState diff --git a/features/swap/presentation/src/main/java/com/tangem/feature/swap/router/SwapRouter.kt b/features/swap/presentation/src/main/java/com/tangem/feature/swap/router/SwapRouter.kt index 98ceb6e3d4..48bdde9475 100644 --- a/features/swap/presentation/src/main/java/com/tangem/feature/swap/router/SwapRouter.kt +++ b/features/swap/presentation/src/main/java/com/tangem/feature/swap/router/SwapRouter.kt @@ -67,5 +67,5 @@ internal class SwapRouter( } enum class SwapNavScreen { - Main, Success, SelectToken + Main, Success, SelectToken, PromoStories } \ No newline at end of file diff --git a/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/StateBuilder.kt b/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/StateBuilder.kt index c932040053..219efa3a97 100644 --- a/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/StateBuilder.kt +++ b/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/StateBuilder.kt @@ -125,6 +125,26 @@ internal class StateBuilder( ) } + fun createStoriesState(uiStateHolder: SwapStateHolder): SwapStateHolder { + return uiStateHolder.copy( + // todo stories [REDACTED_TASK_KEY] fix when design is ready + storiesConfig = SwapStoriesContentConfig( + stories = persistentListOf( + SwapStoryConfig( + imageRes = R.drawable.img_card_with_ring, + ), + SwapStoryConfig( + imageRes = R.drawable.ill_businessman_3d, + ), + SwapStoryConfig( + imageRes = R.drawable.ill_one_inch_powered, + ), + ), + onClose = actions.onStoriesClose, + ), + ) + } + fun createNoAvailableTokensToSwapState( uiStateHolder: SwapStateHolder, fromToken: CryptoCurrencyStatus, diff --git a/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/SwapStoriesScreen.kt b/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/SwapStoriesScreen.kt new file mode 100644 index 0000000000..edb6c2d5b6 --- /dev/null +++ b/features/swap/presentation/src/main/java/com/tangem/feature/swap/ui/SwapStoriesScreen.kt @@ -0,0 +1,20 @@ +package com.tangem.feature.swap.ui + +import androidx.compose.foundation.Image +import androidx.compose.runtime.Composable +import androidx.compose.ui.res.painterResource +import com.tangem.core.ui.components.stories.StoriesContainer +import com.tangem.feature.swap.models.SwapStoriesContentConfig + +@Composable +internal fun SwapStoriesScreen(config: SwapStoriesContentConfig) { + StoriesContainer( + config = config, + ) { current, _ -> + // todo stories [REDACTED_TASK_KEY] fix when design is ready + Image( + painter = painterResource(current.imageRes), + contentDescription = null, + ) + } +} \ No newline at end of file diff --git a/features/swap/presentation/src/main/java/com/tangem/feature/swap/viewmodels/SwapViewModel.kt b/features/swap/presentation/src/main/java/com/tangem/feature/swap/viewmodels/SwapViewModel.kt index ae4b5ef4d6..40de9a3c95 100644 --- a/features/swap/presentation/src/main/java/com/tangem/feature/swap/viewmodels/SwapViewModel.kt +++ b/features/swap/presentation/src/main/java/com/tangem/feature/swap/viewmodels/SwapViewModel.kt @@ -27,6 +27,7 @@ import com.tangem.domain.feedback.SaveBlockchainErrorUseCase import com.tangem.domain.feedback.SendFeedbackEmailUseCase import com.tangem.domain.feedback.models.BlockchainErrorInfo import com.tangem.domain.feedback.models.FeedbackEmailType +import com.tangem.domain.promo.ShouldShowSwapStoriesUseCase import com.tangem.domain.tokens.* import com.tangem.domain.tokens.model.CryptoCurrency import com.tangem.domain.tokens.model.CryptoCurrencyStatus @@ -50,6 +51,7 @@ import com.tangem.feature.swap.router.SwapNavScreen import com.tangem.feature.swap.router.SwapRouter import com.tangem.feature.swap.ui.StateBuilder import com.tangem.feature.swap.utils.formatToUIRepresentation +import com.tangem.features.swap.SwapFeatureToggles import com.tangem.utils.Provider import com.tangem.utils.coroutines.* import com.tangem.utils.isNullOrZero @@ -86,6 +88,8 @@ internal class SwapViewModel @Inject constructor( private val saveBlockchainErrorUseCase: SaveBlockchainErrorUseCase, private val sendFeedbackEmailUseCase: SendFeedbackEmailUseCase, private val getMinimumTransactionAmountSyncUseCase: GetMinimumTransactionAmountSyncUseCase, + private val shouldShowSwapStoriesUseCase: ShouldShowSwapStoriesUseCase, + private val featureToggles: SwapFeatureToggles, swapInteractorFactory: SwapInteractor.Factory, private val savedStateHandle: SavedStateHandle, private val urlOpener: UrlOpener, @@ -168,6 +172,13 @@ internal class SwapViewModel @Inject constructor( val fromStatus = getCryptoCurrencyStatusUseCase(userWalletId, initialCurrencyFrom.id).getOrNull() val toStatus = initialCurrencyTo?.let { getCryptoCurrencyStatusUseCase(userWalletId, it.id).getOrNull() } val wallet = getUserWalletUseCase(userWalletId).getOrNull() + val isShowPromoStories = shouldShowSwapStoriesUseCase.invokeSync() && featureToggles.isPromoStoriesEnabled + + if (isShowPromoStories) { + initStories() + swapRouter.openScreen(SwapNavScreen.PromoStories) + } + if (fromStatus == null || wallet == null) { uiState = stateBuilder.addAlert(uiState = uiState, onDismiss = swapRouter::back) } else { @@ -271,6 +282,10 @@ internal class SwapViewModel @Inject constructor( } } + private fun initStories() { + uiState = stateBuilder.createStoriesState(uiState) + } + private fun applyInitialTokenChoice( state: TokensDataStateExpress, selectedCurrency: CryptoCurrencyStatus?, @@ -1115,6 +1130,9 @@ internal class SwapViewModel @Inject constructor( onSuccess = { swapRouter.openScreen(SwapNavScreen.Success) }, + onStoriesClose = { + swapRouter.openScreen(SwapNavScreen.Main) + }, ) }