Updated on 2026-08-14

This commit is contained in:
Tangem 2024-02-08 11:17:26 +03:00
parent 8106b36fd6
commit 1e0876eea6
45 changed files with 301 additions and 292 deletions

1
data/promo/.gitignore vendored Normal file
View file

@ -0,0 +1 @@
/build

View file

@ -0,0 +1,25 @@
plugins {
alias(deps.plugins.android.library)
alias(deps.plugins.kotlin.android)
alias(deps.plugins.kotlin.kapt)
alias(deps.plugins.hilt.android)
id("configuration")
}
android {
namespace = "com.tangem.data.promo"
}
dependencies {
implementation(deps.androidx.datastore)
implementation(deps.jodatime)
implementation(deps.hilt.android)
kapt(deps.hilt.kapt)
implementation(projects.domain.tokens)
implementation(projects.domain.tokens.models)
implementation(projects.core.datasource)
implementation(projects.core.utils)
}

View file

@ -0,0 +1,29 @@
package com.tangem.data.promo
import com.tangem.data.promo.converters.PromoResponseConverter
import com.tangem.datasource.api.common.response.getOrThrow
import com.tangem.datasource.api.tangemTech.TangemTechApi
import com.tangem.domain.promo.PromoBanner
import com.tangem.domain.tokens.repository.PromoRepository
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import com.tangem.utils.coroutines.runCatching
internal class DefaultPromoRepository(
private val tangemApi: TangemTechApi,
private val dispatchers: CoroutineDispatcherProvider,
) : PromoRepository {
private val promoResponseConverter = PromoResponseConverter()
override suspend fun getChangellyPromoBanner(): PromoBanner? {
return runCatching(dispatchers.io) {
promoResponseConverter.convert(
tangemApi.getPromotionInfo(CHANGELLY_NAME)
.getOrThrow(),
)
}.getOrNull()
}
private companion object {
private const val CHANGELLY_NAME = "changelly"
}
}

View file

@ -0,0 +1,23 @@
package com.tangem.data.promo.converters
import com.tangem.datasource.api.promotion.models.PromotionInfoResponse
import com.tangem.domain.promo.PromoBanner
import com.tangem.utils.converter.Converter
import org.joda.time.DateTime
class PromoResponseConverter : Converter<PromotionInfoResponse, PromoBanner?> {
override fun convert(value: PromotionInfoResponse): PromoBanner? {
val bannerState = value.bannerState ?: return null
return PromoBanner(
name = value.name,
bannerState = PromoBanner.BannerState(
status = bannerState.status,
timeline = PromoBanner.Timeline(
start = DateTime.parse(bannerState.timeline.start),
end = DateTime.parse(bannerState.timeline.end),
),
),
)
}
}

View file

@ -0,0 +1,26 @@
package com.tangem.data.promo.di
import com.tangem.data.promo.DefaultPromoRepository
import com.tangem.datasource.api.tangemTech.TangemTechApi
import com.tangem.datasource.di.DevTangemApi
import com.tangem.domain.tokens.repository.PromoRepository
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
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 PromoDataModule {
@Provides
@Singleton
fun providePromoRepository(
@DevTangemApi tangemTechApi: TangemTechApi,
dispatchers: CoroutineDispatcherProvider,
): PromoRepository {
return DefaultPromoRepository(tangemTechApi, dispatchers)
}
}

View file

@ -1,14 +1,12 @@
package com.tangem.data.settings
import com.tangem.datasource.local.preferences.AppPreferencesStore
import com.tangem.datasource.local.preferences.PreferencesKeys.IS_TOKEN_SWAP_PROMO_SHOW_KEY
import com.tangem.datasource.local.preferences.PreferencesKeys.IS_WALLET_SWAP_PROMO_SHOW_KEY
import com.tangem.datasource.local.preferences.PreferencesKeys.IS_TOKEN_SWAP_PROMO_CHANGELLY_SHOW_KEY
import com.tangem.datasource.local.preferences.PreferencesKeys.IS_WALLET_SWAP_PROMO_CHANGELLY_SHOW_KEY
import com.tangem.datasource.local.preferences.utils.get
import com.tangem.datasource.local.preferences.utils.store
import com.tangem.domain.settings.repositories.SwapPromoRepository
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.map
import java.util.Calendar
/**
* Repository for showing swap promo notification.
@ -16,47 +14,25 @@ import java.util.Calendar
class DefaultSwapPromoRepository(
private val appPreferencesStore: AppPreferencesStore,
) : SwapPromoRepository {
override fun isReadyToShowWallet(): Flow<Boolean> {
return appPreferencesStore.get(IS_WALLET_SWAP_PROMO_SHOW_KEY, true)
.map { it && checkPromoPeriod() }
override fun isReadyToShowWalletPromo(): Flow<Boolean> {
return appPreferencesStore.get(IS_WALLET_SWAP_PROMO_CHANGELLY_SHOW_KEY, true)
}
override fun isReadyToShowToken(): Flow<Boolean> {
return appPreferencesStore.get(IS_TOKEN_SWAP_PROMO_SHOW_KEY, true)
.map { it && checkPromoPeriod() }
override fun isReadyToShowTokenPromo(): Flow<Boolean> {
return appPreferencesStore.get(IS_TOKEN_SWAP_PROMO_CHANGELLY_SHOW_KEY, true)
}
override suspend fun setNeverToShowWallet() {
override suspend fun setNeverToShowWalletPromo() {
appPreferencesStore.store(
key = IS_WALLET_SWAP_PROMO_SHOW_KEY,
key = IS_WALLET_SWAP_PROMO_CHANGELLY_SHOW_KEY,
value = false,
)
}
override suspend fun setNeverToShowToken() {
override suspend fun setNeverToShowTokenPromo() {
appPreferencesStore.store(
key = IS_TOKEN_SWAP_PROMO_SHOW_KEY,
key = IS_TOKEN_SWAP_PROMO_CHANGELLY_SHOW_KEY,
value = false,
)
}
private suspend fun checkPromoPeriod(): Boolean {
val calendar = Calendar.getInstance()
val currentTime = calendar.timeInMillis
calendar.set(END_YEAR_KEY, END_MONTH_KEY, END_DAY_KEY, 0, 0, 0)
val endTime = calendar.timeInMillis
val shouldShow = endTime - currentTime > 0
if (!shouldShow) {
setNeverToShowToken()
setNeverToShowWallet()
}
return shouldShow
}
companion object {
private const val END_DAY_KEY = 1
private const val END_MONTH_KEY = 1 // February
private const val END_YEAR_KEY = 2024
}
}