Updated on 2026-08-14
This commit is contained in:
parent
92e21cc79c
commit
a40e6e7e28
11 changed files with 109 additions and 1 deletions
|
|
@ -3,6 +3,7 @@ package com.tangem.tap.common.analytics.appsflyer
|
|||
import com.appsflyer.deeplink.DeepLink
|
||||
import com.tangem.datasource.local.appsflyer.AppsFlyerStore
|
||||
import com.tangem.domain.wallets.models.AppsFlyerConversionData
|
||||
import com.tangem.feature.referral.domain.SetShouldShowMobileWalletPromoUseCase
|
||||
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
||||
import kotlinx.coroutines.CoroutineScope
|
||||
import kotlinx.coroutines.SupervisorJob
|
||||
|
|
@ -18,6 +19,7 @@ import kotlin.contracts.contract
|
|||
@Singleton
|
||||
class AppsFlyerReferralParamsHandler @Inject constructor(
|
||||
private val appsFlyerStore: AppsFlyerStore,
|
||||
private val setShouldShowMobileWalletPromoUseCase: SetShouldShowMobileWalletPromoUseCase,
|
||||
dispatchers: CoroutineDispatcherProvider,
|
||||
) {
|
||||
|
||||
|
|
@ -69,6 +71,8 @@ class AppsFlyerReferralParamsHandler @Inject constructor(
|
|||
private fun storeConversionData(refcode: String, campaign: String?) {
|
||||
coroutineScope.launch {
|
||||
mutex.withLock {
|
||||
setShouldShowMobileWalletPromoUseCase()
|
||||
.onLeft { Timber.e(it) }
|
||||
appsFlyerStore.storeIfAbsent(
|
||||
value = AppsFlyerConversionData(refcode = refcode, campaign = campaign),
|
||||
)
|
||||
|
|
|
|||
|
|
@ -3,9 +3,12 @@ package com.tangem.tap.common.analytics.appsflyer
|
|||
import com.appsflyer.deeplink.DeepLink
|
||||
import com.tangem.datasource.local.appsflyer.AppsFlyerStore
|
||||
import com.tangem.domain.wallets.models.AppsFlyerConversionData
|
||||
import com.tangem.feature.referral.domain.SetShouldShowMobileWalletPromoUseCase
|
||||
import com.tangem.test.core.ProvideTestModels
|
||||
import com.tangem.utils.coroutines.TestingCoroutineDispatcherProvider
|
||||
import arrow.core.right
|
||||
import io.mockk.clearMocks
|
||||
import io.mockk.coEvery
|
||||
import io.mockk.coVerify
|
||||
import io.mockk.every
|
||||
import io.mockk.mockk
|
||||
|
|
@ -22,9 +25,13 @@ import org.junit.jupiter.params.ParameterizedTest
|
|||
class AppsFlyerReferralParamsHandlerTest {
|
||||
|
||||
private val appsFlyerStore: AppsFlyerStore = mockk(relaxUnitFun = true)
|
||||
private val setShouldShowMobileWalletPromoUseCase: SetShouldShowMobileWalletPromoUseCase = mockk {
|
||||
coEvery { this@mockk.invoke() } returns Unit.right()
|
||||
}
|
||||
private val handler = AppsFlyerReferralParamsHandler(
|
||||
appsFlyerStore = appsFlyerStore,
|
||||
dispatchers = TestingCoroutineDispatcherProvider(),
|
||||
setShouldShowMobileWalletPromoUseCase = setShouldShowMobileWalletPromoUseCase,
|
||||
)
|
||||
|
||||
@AfterEach
|
||||
|
|
@ -43,6 +50,7 @@ class AppsFlyerReferralParamsHandlerTest {
|
|||
|
||||
if (model.shouldStore) {
|
||||
val value = AppsFlyerConversionData(refcode = SUCCESS_REFCODE, campaign = SUCCESS_CAMPAIGN)
|
||||
|
||||
coVerify { appsFlyerStore.storeIfAbsent(value = value) }
|
||||
} else {
|
||||
coVerify(inverse = true) { appsFlyerStore.storeIfAbsent(value = any()) }
|
||||
|
|
|
|||
|
|
@ -27,6 +27,7 @@ dependencies {
|
|||
implementation(projects.common.routing)
|
||||
|
||||
/** Domain */
|
||||
implementation(projects.domain.common)
|
||||
implementation(projects.domain.models)
|
||||
implementation(projects.domain.core)
|
||||
implementation(projects.domain.card)
|
||||
|
|
@ -37,6 +38,10 @@ dependencies {
|
|||
implementation(projects.domain.legacy)
|
||||
implementation(projects.domain.feedback)
|
||||
implementation(projects.domain.feedback.models)
|
||||
implementation(projects.domain.referral)
|
||||
|
||||
/** Referral */
|
||||
implementation(projects.features.referral.domain)
|
||||
|
||||
/** AndroidX libraries */
|
||||
implementation(deps.androidx.activity.compose)
|
||||
|
|
|
|||
|
|
@ -42,8 +42,10 @@ import com.tangem.features.home.api.HomeComponent
|
|||
import com.tangem.features.home.impl.ui.state.HomeUM
|
||||
import com.tangem.features.home.impl.ui.state.Stories
|
||||
import com.tangem.features.home.impl.ui.state.getRestrictedStories
|
||||
import com.tangem.feature.referral.domain.ShouldShowMobileWalletPromoUseCase
|
||||
import com.tangem.features.hotwallet.HotWalletFeatureToggles
|
||||
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
||||
import com.tangem.utils.coroutines.Debouncer
|
||||
import kotlinx.collections.immutable.toImmutableList
|
||||
import kotlinx.coroutines.delay
|
||||
import kotlinx.coroutines.flow.*
|
||||
|
|
@ -74,9 +76,12 @@ internal class HomeModel @Inject constructor(
|
|||
private val hotWalletFeatureToggles: HotWalletFeatureToggles,
|
||||
private val userWalletsListRepository: UserWalletsListRepository,
|
||||
private val reduxStateHolder: ReduxStateHolder,
|
||||
private val shouldShowMobileWalletPromoUseCase: ShouldShowMobileWalletPromoUseCase,
|
||||
@GlobalUiMessageSender private val uiMessageSender: UiMessageSender,
|
||||
) : Model() {
|
||||
|
||||
private val debouncer = Debouncer()
|
||||
|
||||
val params = paramsContainer.require<HomeComponent.Params>()
|
||||
|
||||
private val _uiState = MutableStateFlow(
|
||||
|
|
@ -145,7 +150,16 @@ internal class HomeModel @Inject constructor(
|
|||
}
|
||||
|
||||
private fun onGetStartedClick() {
|
||||
router.push(AppRoute.CreateWalletStart(mode = AppRoute.CreateWalletStart.Mode.ColdWallet))
|
||||
debouncer.debounce(modelScope) {
|
||||
modelScope.launch {
|
||||
val mode = if (shouldShowMobileWalletPromoUseCase()) {
|
||||
AppRoute.CreateWalletStart.Mode.HotWallet
|
||||
} else {
|
||||
AppRoute.CreateWalletStart.Mode.ColdWallet
|
||||
}
|
||||
router.push(AppRoute.CreateWalletStart(mode = mode))
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
private fun scanCard() {
|
||||
|
|
|
|||
|
|
@ -18,8 +18,10 @@ dependencies {
|
|||
|
||||
/** Data modules */
|
||||
implementation(projects.data.common)
|
||||
implementation(deps.androidx.datastore)
|
||||
|
||||
/** Domain modules */
|
||||
implementation(projects.domain.common)
|
||||
implementation(projects.domain.legacy)
|
||||
implementation(projects.libs.blockchainSdk)
|
||||
implementation(projects.domain.models)
|
||||
|
|
|
|||
|
|
@ -0,0 +1,26 @@
|
|||
package com.tangem.feature.referral.data
|
||||
|
||||
import androidx.datastore.preferences.core.booleanPreferencesKey
|
||||
import com.tangem.datasource.local.preferences.AppPreferencesStore
|
||||
import com.tangem.datasource.local.preferences.utils.getSyncOrDefault
|
||||
import com.tangem.feature.referral.domain.MobileWalletPromoRepository
|
||||
import javax.inject.Inject
|
||||
|
||||
internal class DefaultMobileWalletPromoRepository @Inject constructor(
|
||||
private val appPreferencesStore: AppPreferencesStore,
|
||||
) : MobileWalletPromoRepository {
|
||||
|
||||
override suspend fun shouldShowMobileWalletPromo(): Boolean {
|
||||
return appPreferencesStore.getSyncOrDefault(key = SHOULD_SHOW_MOBILE_WALLET_PROMO_KEY, default = false)
|
||||
}
|
||||
|
||||
override suspend fun setShouldShowMobileWalletPromo(value: Boolean) {
|
||||
appPreferencesStore.editData { preferences ->
|
||||
preferences[SHOULD_SHOW_MOBILE_WALLET_PROMO_KEY] = value
|
||||
}
|
||||
}
|
||||
|
||||
private companion object {
|
||||
val SHOULD_SHOW_MOBILE_WALLET_PROMO_KEY = booleanPreferencesKey("should_show_mobile_wallet_promo")
|
||||
}
|
||||
}
|
||||
|
|
@ -2,10 +2,13 @@ package com.tangem.feature.referral.di
|
|||
|
||||
import com.tangem.blockchainsdk.utils.ExcludedBlockchains
|
||||
import com.tangem.datasource.api.tangemTech.TangemTechApi
|
||||
import com.tangem.datasource.local.preferences.AppPreferencesStore
|
||||
import com.tangem.datasource.local.userwallet.UserWalletsStore
|
||||
import com.tangem.feature.referral.converters.ReferralConverter
|
||||
import com.tangem.feature.referral.data.DefaultMobileWalletPromoRepository
|
||||
import com.tangem.feature.referral.data.ExternalReferralRepository
|
||||
import com.tangem.feature.referral.data.ReferralRepositoryImpl
|
||||
import com.tangem.feature.referral.domain.MobileWalletPromoRepository
|
||||
import com.tangem.feature.referral.domain.ReferralRepository
|
||||
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
|
||||
import dagger.Module
|
||||
|
|
@ -53,4 +56,11 @@ class ReferralRepositoryModule {
|
|||
excludedBlockchains = excludedBlockchains,
|
||||
)
|
||||
}
|
||||
|
||||
@Provides
|
||||
@Singleton
|
||||
fun provideMobileWalletPromoRepository(appPreferencesStore: AppPreferencesStore): MobileWalletPromoRepository =
|
||||
DefaultMobileWalletPromoRepository(
|
||||
appPreferencesStore = appPreferencesStore,
|
||||
)
|
||||
}
|
||||
|
|
@ -21,6 +21,7 @@ dependencies {
|
|||
/** Domain modules */
|
||||
implementation(projects.domain.account.status)
|
||||
implementation(projects.domain.card)
|
||||
implementation(projects.domain.common)
|
||||
implementation(projects.domain.models)
|
||||
implementation(projects.domain.tokens)
|
||||
implementation(projects.domain.tokens.models)
|
||||
|
|
|
|||
|
|
@ -0,0 +1,8 @@
|
|||
package com.tangem.feature.referral.domain
|
||||
|
||||
interface MobileWalletPromoRepository {
|
||||
|
||||
suspend fun shouldShowMobileWalletPromo(): Boolean
|
||||
|
||||
suspend fun setShouldShowMobileWalletPromo(value: Boolean)
|
||||
}
|
||||
|
|
@ -0,0 +1,18 @@
|
|||
package com.tangem.feature.referral.domain
|
||||
|
||||
import arrow.core.Either
|
||||
import com.tangem.domain.common.wallets.UserWalletsListRepository
|
||||
import javax.inject.Inject
|
||||
|
||||
class SetShouldShowMobileWalletPromoUseCase @Inject constructor(
|
||||
private val mobileWalletPromoRepository: MobileWalletPromoRepository,
|
||||
private val userWalletsListRepository: UserWalletsListRepository,
|
||||
) {
|
||||
|
||||
suspend operator fun invoke(): Either<Throwable, Unit> = Either.catch {
|
||||
val wallets = userWalletsListRepository.userWallets.value
|
||||
if (wallets.isNullOrEmpty()) {
|
||||
mobileWalletPromoRepository.setShouldShowMobileWalletPromo(true)
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,12 @@
|
|||
package com.tangem.feature.referral.domain
|
||||
|
||||
import javax.inject.Inject
|
||||
|
||||
class ShouldShowMobileWalletPromoUseCase @Inject constructor(
|
||||
private val mobileWalletPromoRepository: MobileWalletPromoRepository,
|
||||
) {
|
||||
|
||||
suspend operator fun invoke(): Boolean {
|
||||
return mobileWalletPromoRepository.shouldShowMobileWalletPromo()
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue