Updated on 2026-08-14

This commit is contained in:
Tangem 2025-09-23 13:36:18 +03:00
parent c72fdf004d
commit bc8a0ba20d
4 changed files with 31 additions and 5 deletions

View file

@ -4,7 +4,7 @@ import com.squareup.moshi.Json
import com.squareup.moshi.JsonClass
@JsonClass(generateAdapter = true)
data class PromotionInfoResponse(
data class PromoBannerResponse(
@Json(name = "name") val name: String,
@Json(name = "all") val bannerState: BannerState?,
) {

View file

@ -1,6 +1,7 @@
package com.tangem.datasource.api.tangemTech
import com.tangem.datasource.api.common.response.ApiResponse
import com.tangem.datasource.api.promotion.models.PromoBannerResponse
import com.tangem.datasource.api.promotion.models.StoryContentResponse
import com.tangem.datasource.api.tangemTech.models.*
import com.tangem.datasource.api.tangemTech.models.account.GetWalletAccountsResponse
@ -163,4 +164,12 @@ interface TangemTechApi {
@Header("If-None-Match") eTag: String? = null,
): ApiResponse<GetWalletArchivedAccountsResponse>
// endregion
// region promo banners
@GET("/v1/promotion")
suspend fun getPromoBanner(
@Query("programName") name: String,
@Header("Cache-Control") cacheControl: String = "max-age=600",
): ApiResponse<PromoBannerResponse>
// endregion
}

View file

@ -1,5 +1,6 @@
package com.tangem.data.promo
import com.tangem.data.promo.converters.PromoBannerConverter
import com.tangem.data.promo.converters.StoryContentResponseConverter
import com.tangem.datasource.api.common.response.getOrThrow
import com.tangem.datasource.api.tangemTech.TangemTechApi
@ -12,6 +13,7 @@ import com.tangem.datasource.local.preferences.utils.store
import com.tangem.datasource.local.promo.PromoStoriesStore
import com.tangem.domain.models.wallet.UserWalletId
import com.tangem.domain.promo.PromoRepository
import com.tangem.domain.promo.models.PromoBanner
import com.tangem.domain.promo.models.PromoId
import com.tangem.domain.promo.models.StoryContent
import com.tangem.feature.referral.domain.ReferralRepository
@ -22,6 +24,7 @@ import kotlinx.coroutines.flow.map
import kotlinx.coroutines.flow.mapLatest
import kotlinx.coroutines.withContext
import kotlinx.coroutines.withTimeoutOrNull
import com.tangem.utils.coroutines.runCatching
internal class DefaultPromoRepository(
private val tangemApi: TangemTechApi,
@ -32,6 +35,7 @@ internal class DefaultPromoRepository(
) : PromoRepository {
private val storyContentConverter = StoryContentResponseConverter()
private val promoBannerConverter = PromoBannerConverter()
override fun isReadyToShowWalletPromo(userWalletId: UserWalletId, promoId: PromoId): Flow<Boolean> {
return appPreferencesStore.get(
@ -42,7 +46,11 @@ internal class DefaultPromoRepository(
PromoId.Referral -> runCatching {
!referralRepository.isReferralParticipant(userWalletId) && shouldShow
}.getOrDefault(false)
PromoId.Sepa -> shouldShow
PromoId.Sepa -> {
val isActive = getSepaPromoBanner()?.isActive ?: false
isActive && shouldShow
}
}
}
}
@ -118,7 +126,16 @@ internal class DefaultPromoRepository(
)
}
private suspend fun getSepaPromoBanner(): PromoBanner? {
return runCatching(dispatchers.io) {
promoBannerConverter.convert(
tangemApi.getPromoBanner(SEPA_NAME).getOrThrow(),
)
}.getOrNull()
}
private companion object {
const val SEPA_NAME = "sepa"
const val STORIES_LOAD_DELAY = 1000L
}
}

View file

@ -1,13 +1,13 @@
package com.tangem.data.promo.converters
import com.tangem.datasource.api.promotion.models.PromotionInfoResponse
import com.tangem.datasource.api.promotion.models.PromoBannerResponse
import com.tangem.domain.promo.models.PromoBanner
import com.tangem.utils.converter.Converter
import org.joda.time.DateTime
class PromoResponseConverter : Converter<PromotionInfoResponse, PromoBanner?> {
class PromoBannerConverter : Converter<PromoBannerResponse, PromoBanner?> {
override fun convert(value: PromotionInfoResponse): PromoBanner? {
override fun convert(value: PromoBannerResponse): PromoBanner? {
val bannerState = value.bannerState ?: return null
return PromoBanner(
name = value.name,