Updated on 2026-08-14

This commit is contained in:
Tangem 2026-05-14 11:50:47 +03:00
parent f1a4be49b3
commit ce948a71ae
51 changed files with 20 additions and 1186 deletions

View file

@ -5,5 +5,4 @@ plugins {
}
dependencies {
implementation(deps.jodatime)
}

View file

@ -1,35 +0,0 @@
package com.tangem.domain.promo.models
import org.joda.time.DateTime
data class PromoBanner(
val name: String,
val bannerState: BannerState,
) {
val isActive = bannerState.status == ACTIVE_STATUS && bannerState.timeline.end.isAfterNow
data class BannerState(
val timeline: Timeline,
val status: String,
val link: String?,
)
data class Timeline(
val start: DateTime,
val end: DateTime,
)
private companion object {
const val ACTIVE_STATUS = "active"
}
}
enum class PromoId {
Referral,
Sepa,
VisaPresale,
BlackFriday,
OnePlusOne,
YieldPromo,
}

View file

@ -1,24 +1,10 @@
package com.tangem.domain.promo
import com.tangem.domain.models.wallet.UserWalletId
import com.tangem.domain.promo.models.PromoId
import com.tangem.domain.promo.models.StoryContent
import kotlinx.coroutines.flow.Flow
interface PromoRepository {
// region Promo
fun isReadyToShowWalletPromo(userWalletId: UserWalletId, promoId: PromoId): Flow<Boolean>
fun isReadyToShowTokenPromo(promoId: PromoId): Flow<Boolean>
suspend fun setNeverToShowWalletPromo(promoId: PromoId)
suspend fun setNeverToShowTokenPromo(promoId: PromoId)
suspend fun isMoonpayPromoActive(): Boolean
// endregion
// region Stories
fun getStoryById(id: String): Flow<StoryContent?>

View file

@ -1,11 +0,0 @@
package com.tangem.domain.promo
import com.tangem.domain.promo.models.PromoId
import kotlinx.coroutines.flow.Flow
class ShouldShowPromoTokenUseCase(private val promoRepository: PromoRepository) {
operator fun invoke(promoId: PromoId): Flow<Boolean> = promoRepository.isReadyToShowTokenPromo(promoId)
suspend fun neverToShow(promoId: PromoId) = promoRepository.setNeverToShowTokenPromo(promoId)
}

View file

@ -1,57 +0,0 @@
package com.tangem.domain.promo
import com.tangem.domain.models.wallet.UserWalletId
import com.tangem.domain.promo.models.PromoId
import com.tangem.domain.settings.repositories.SettingsRepository
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.emitAll
import kotlinx.coroutines.flow.flow
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.flow.map
import java.util.Calendar
class ShouldShowPromoWalletUseCase(
private val promoRepository: PromoRepository,
private val settingsRepository: SettingsRepository,
private val isNewPromoBannersEnabled: Boolean,
) {
operator fun invoke(userWalletId: UserWalletId, promoId: PromoId): Flow<Boolean> {
if (isNewPromoBannersEnabled) return flowOf(false)
return flow {
emit(false)
val promoFlow = promoRepository.isReadyToShowWalletPromo(userWalletId, promoId)
.map { applyWalletFirstUsageCondition(promoId, it) }
emitAll(promoFlow)
}
}
private suspend fun applyWalletFirstUsageCondition(promoId: PromoId, isReady: Boolean): Boolean {
if (!isReady) return false
return when (promoId) {
PromoId.Referral,
PromoId.VisaPresale,
PromoId.BlackFriday,
PromoId.OnePlusOne,
PromoId.YieldPromo,
-> true
PromoId.Sepa -> {
val walletFirstUsageDate = settingsRepository.getWalletFirstUsageDate()
if (walletFirstUsageDate == 0L) return false
val currentDate = Calendar.getInstance().timeInMillis
currentDate - walletFirstUsageDate > ONE_DAY_IN_MILLIS
}
}
}
suspend fun neverToShow(promoId: PromoId) = promoRepository.setNeverToShowWalletPromo(promoId)
private companion object {
const val ONE_DAY_IN_MILLIS = 1 * 24 * 60 * 60 * 1000L
}
}