Updated on 2026-08-14

This commit is contained in:
Tangem 2025-02-05 13:53:44 +05:00
commit 8146119ccd
15 changed files with 204 additions and 3 deletions

View file

@ -1,18 +1,31 @@
package com.tangem.data.promo
import com.tangem.data.promo.converters.StoryContentResponseConverter
import com.tangem.datasource.api.common.response.getOrThrow
import com.tangem.datasource.api.tangemTech.TangemTechApi
import com.tangem.datasource.local.preferences.AppPreferencesStore
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.datasource.local.promo.PromoStoriesStore
import com.tangem.domain.promo.PromoRepository
import com.tangem.domain.promo.models.StoryContent
import com.tangem.utils.SupportedLanguages
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import kotlinx.coroutines.flow.Flow
import kotlinx.coroutines.flow.flowOf
import kotlinx.coroutines.withContext
internal class DefaultPromoRepository(
private val tangemApi: TangemTechApi,
private val appPreferencesStore: AppPreferencesStore,
private val promoStoriesStore: PromoStoriesStore,
private val dispatchers: CoroutineDispatcherProvider,
) : PromoRepository {
private val storyContentConverter = StoryContentResponseConverter()
override fun isReadyToShowWalletSwapPromo(): Flow<Boolean> {
return flowOf(false) // Use it on new promo action
}
@ -29,6 +42,23 @@ internal class DefaultPromoRepository(
// Use it on new promo action
}
override suspend fun getStoryById(id: String): StoryContent = withContext(dispatchers.io) {
val storedPromo = promoStoriesStore.getSyncOrNull(storyId = id)
// Get last stored promo by id if possible or get from network
val story = if (storedPromo == null) {
val storyContent = tangemApi.getStoryById(
storyId = id,
language = SupportedLanguages.getCurrentSupportedLanguageCode(),
).getOrThrow()
promoStoriesStore.store(storyId = id, item = storyContent)
storyContent
} else {
storedPromo
}
storyContentConverter.convert(story)
}
override fun isReadyToShowSwapStories(): Flow<Boolean> {
return appPreferencesStore.get(SHOULD_SHOW_SWAP_STORIES_KEY, true)
}

View file

@ -0,0 +1,22 @@
package com.tangem.data.promo.converters
import com.tangem.datasource.api.promotion.models.StoryContentResponse
import com.tangem.domain.promo.models.StoryContent
import com.tangem.utils.converter.Converter
internal class StoryContentResponseConverter : Converter<StoryContentResponse, StoryContent> {
override fun convert(value: StoryContentResponse): StoryContent {
return StoryContent(
imageHost = value.imageHost,
story = StoryContent.Story(
id = value.story.id,
title = value.story.title,
slides = value.story.slides?.map { slide ->
StoryContent.StorySlide(
id = slide.id,
)
}.orEmpty(),
),
)
}
}

View file

@ -1,8 +1,11 @@
package com.tangem.data.promo.di
import com.tangem.data.promo.DefaultPromoRepository
import com.tangem.datasource.api.tangemTech.TangemTechApi
import com.tangem.datasource.local.preferences.AppPreferencesStore
import com.tangem.datasource.local.promo.PromoStoriesStore
import com.tangem.domain.promo.PromoRepository
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
@ -15,7 +18,17 @@ internal object PromoDataModule {
@Provides
@Singleton
fun providePromoRepository(appPreferencesStore: AppPreferencesStore): PromoRepository {
return DefaultPromoRepository(appPreferencesStore)
fun providePromoRepository(
tangemTechApi: TangemTechApi,
appPreferencesStore: AppPreferencesStore,
promoStoriesStore: PromoStoriesStore,
dispatchers: CoroutineDispatcherProvider,
): PromoRepository {
return DefaultPromoRepository(
tangemApi = tangemTechApi,
appPreferencesStore = appPreferencesStore,
promoStoriesStore = promoStoriesStore,
dispatchers = dispatchers,
)
}
}