Updated on 2026-08-14
This commit is contained in:
parent
54d8ce26bf
commit
1b486b730c
15 changed files with 99 additions and 49 deletions
|
|
@ -3,7 +3,6 @@ package com.tangem.tap
|
|||
import android.app.Application
|
||||
import android.content.Context
|
||||
import android.content.pm.PackageManager
|
||||
import androidx.compose.ui.text.intl.Locale
|
||||
import coil.ImageLoader
|
||||
import coil.ImageLoaderFactory
|
||||
import com.tangem.Log
|
||||
|
|
@ -146,7 +145,7 @@ class TapApplication : Application(), ImageLoaderFactory {
|
|||
lateinit var walletConnectSessionsRepository: WalletConnectSessionsRepository
|
||||
|
||||
@Inject
|
||||
lateinit var learn2ernInteractor: Learn2earnInteractor
|
||||
lateinit var learn2earnInteractor: Learn2earnInteractor
|
||||
|
||||
override fun onCreate() {
|
||||
super.onCreate()
|
||||
|
|
@ -205,7 +204,7 @@ class TapApplication : Application(), ImageLoaderFactory {
|
|||
// [REDACTED_JIRA]
|
||||
runBlocking {
|
||||
featureTogglesManager.init()
|
||||
learn2ernInteractor.init()
|
||||
learn2earnInteractor.init()
|
||||
}
|
||||
|
||||
initTopUpController()
|
||||
|
|
@ -246,7 +245,6 @@ class TapApplication : Application(), ImageLoaderFactory {
|
|||
shopService = TangemShopService(this, config.shopify!!)
|
||||
initAnalytics(this, config)
|
||||
initFeedbackManager(this, preferencesStorage, foregroundActivityObserver, store)
|
||||
setupLearn2earnAdditionalDependencies(config)
|
||||
}
|
||||
|
||||
private fun initAnalytics(application: Application, config: Config) {
|
||||
|
|
@ -309,13 +307,6 @@ class TapApplication : Application(), ImageLoaderFactory {
|
|||
store.dispatch(GlobalAction.SetFeedbackManager(feedbackManager))
|
||||
}
|
||||
|
||||
private fun setupLearn2earnAdditionalDependencies(config: Config) {
|
||||
learn2ernInteractor.setupDependencies(
|
||||
authCredentials = config.tangemComAuthorization,
|
||||
countryCodeProvider = { store.state.globalState.userCountryCode ?: Locale.current.language },
|
||||
)
|
||||
}
|
||||
|
||||
private fun initWarningMessagesManager() {
|
||||
store.dispatch(GlobalAction.SetWarningManager(WarningMessagesManager()))
|
||||
}
|
||||
|
|
|
|||
|
|
@ -217,7 +217,11 @@ class WalletFragment : Fragment(R.layout.fragment_wallet), SafeStoreSubscriber<W
|
|||
|
||||
binding.composeLearnToEarnContainer.show(true) { binding.llWarnings.beginDelayedTransition() }
|
||||
binding.composeLearnToEarnContainer.apply {
|
||||
setViewCompositionStrategy(ViewCompositionStrategy.DisposeOnViewTreeLifecycleDestroyed)
|
||||
setViewCompositionStrategy(
|
||||
strategy = ViewCompositionStrategy.DisposeOnLifecycleDestroyed(
|
||||
lifecycle = this@WalletFragment.lifecycle,
|
||||
),
|
||||
)
|
||||
setContent {
|
||||
TangemTheme {
|
||||
Learn2earnMainPageScreen(learn2earnViewModel.uiState)
|
||||
|
|
|
|||
|
|
@ -1,6 +1,8 @@
|
|||
package com.tangem.tap.proxy.di
|
||||
|
||||
import androidx.compose.ui.text.intl.Locale
|
||||
import com.tangem.core.analytics.api.AnalyticsEventHandler
|
||||
import com.tangem.feature.learn2earn.domain.api.Learn2earnDependencyProvider
|
||||
import com.tangem.lib.crypto.DerivationManager
|
||||
import com.tangem.lib.crypto.TransactionManager
|
||||
import com.tangem.lib.crypto.UserWalletManager
|
||||
|
|
@ -48,4 +50,20 @@ class ProxyModule {
|
|||
appStateHolder = appStateHolder,
|
||||
)
|
||||
}
|
||||
|
||||
// regions FeatureConsumers
|
||||
@Provides
|
||||
@Singleton
|
||||
fun provideLear2earnDependencies(appStateHolder: AppStateHolder): Learn2earnDependencyProvider {
|
||||
return object : Learn2earnDependencyProvider {
|
||||
override fun getUserCountryCodeProvider(): () -> String = {
|
||||
appStateHolder.mainStore?.state?.globalState?.userCountryCode ?: Locale.current.language
|
||||
}
|
||||
|
||||
override fun getWebViewAuthCredentialsProvider(): () -> String? = {
|
||||
appStateHolder.mainStore?.state?.globalState?.configManager?.config?.tangemComAuthorization
|
||||
}
|
||||
}
|
||||
}
|
||||
// endregion FeatureConsumers
|
||||
}
|
||||
|
|
@ -5,10 +5,7 @@ import com.tangem.datasource.api.promotion.models.AbstractPromotionResponse
|
|||
import com.tangem.datasource.api.promotion.models.PromotionInfoResponse
|
||||
import com.tangem.feature.learn2earn.data.api.Learn2earnRepository
|
||||
import com.tangem.feature.learn2earn.data.models.PromoUserData
|
||||
import com.tangem.feature.learn2earn.domain.api.Learn2earnInteractor
|
||||
import com.tangem.feature.learn2earn.domain.api.RedirectConsequences
|
||||
import com.tangem.feature.learn2earn.domain.api.WebViewResult
|
||||
import com.tangem.feature.learn2earn.domain.api.WebViewResultHandler
|
||||
import com.tangem.feature.learn2earn.domain.api.*
|
||||
import com.tangem.feature.learn2earn.domain.models.Promotion
|
||||
import com.tangem.feature.learn2earn.domain.models.PromotionError
|
||||
import com.tangem.feature.learn2earn.domain.models.toDomainError
|
||||
|
|
@ -23,20 +20,18 @@ class DefaultLearn2earnInteractor(
|
|||
private val repository: Learn2earnRepository,
|
||||
private val userWalletManager: UserWalletManager,
|
||||
private val derivationManager: DerivationManager,
|
||||
dependencyProvider: Learn2earnDependencyProvider,
|
||||
) : Learn2earnInteractor {
|
||||
|
||||
override var webViewResultHandler: WebViewResultHandler? = null
|
||||
|
||||
private lateinit var webViewUriBuilder: WebViewUriBuilder
|
||||
private lateinit var promotion: Promotion
|
||||
|
||||
override fun setupDependencies(authCredentials: String?, countryCodeProvider: () -> String) {
|
||||
webViewUriBuilder = WebViewUriBuilder(
|
||||
authCredentials = authCredentials,
|
||||
userCountryCodeProvider = countryCodeProvider,
|
||||
promoCodeProvider = { repository.getUserData().promoCode },
|
||||
)
|
||||
}
|
||||
private val webViewUriBuilder: WebViewUriBuilder = WebViewUriBuilder(
|
||||
authCredentialsProvider = dependencyProvider.getWebViewAuthCredentialsProvider(),
|
||||
userCountryCodeProvider = dependencyProvider.getUserCountryCodeProvider(),
|
||||
promoCodeProvider = { repository.getUserData().promoCode },
|
||||
)
|
||||
|
||||
override suspend fun init() {
|
||||
initPromotionInfo()
|
||||
|
|
|
|||
|
|
@ -3,7 +3,9 @@ package com.tangem.feature.learn2earn.domain
|
|||
import com.tangem.utils.converter.TwoWayConverter
|
||||
|
||||
/**
|
||||
* A converter that helps prepare a list of headers to put in an intent and retrieve them later.
|
||||
* A converter that helps prepare a list of headers to be added to the Bundle.
|
||||
* ArrayList is used to prevent cast exceptions when the convert result is placed in a Bundle.
|
||||
* @see Learn2earnRouter#openWebView() putStringArrayListExtra
|
||||
*
|
||||
[REDACTED_AUTHOR]
|
||||
*/
|
||||
|
|
|
|||
|
|
@ -7,7 +7,7 @@ import com.tangem.feature.learn2earn.impl.BuildConfig
|
|||
[REDACTED_AUTHOR]
|
||||
*/
|
||||
internal class WebViewUriBuilder(
|
||||
private val authCredentials: String?,
|
||||
private val authCredentialsProvider: () -> String?,
|
||||
private val userCountryCodeProvider: () -> String,
|
||||
private val promoCodeProvider: () -> String?,
|
||||
) {
|
||||
|
|
@ -30,10 +30,13 @@ internal class WebViewUriBuilder(
|
|||
return builder.build()
|
||||
}
|
||||
|
||||
fun getBasicAuthHeaders(): Map<String, String> = if (authCredentials == null) {
|
||||
mapOf()
|
||||
} else {
|
||||
mapOf("Authorization" to "Basic $authCredentials")
|
||||
fun getBasicAuthHeaders(): Map<String, String> {
|
||||
val credentials = authCredentialsProvider.invoke()
|
||||
return if (credentials == null) {
|
||||
mapOf()
|
||||
} else {
|
||||
mapOf("Authorization" to "Basic $credentials")
|
||||
}
|
||||
}
|
||||
|
||||
fun isPromoCodeRedirect(uri: Uri): Boolean {
|
||||
|
|
|
|||
|
|
@ -0,0 +1,13 @@
|
|||
package com.tangem.feature.learn2earn.domain.api
|
||||
|
||||
/**
|
||||
* Interface, a wrapper that allows us to get values from the AppStateHolder located in the app module
|
||||
*
|
||||
[REDACTED_AUTHOR]
|
||||
*/
|
||||
interface Learn2earnDependencyProvider {
|
||||
|
||||
fun getUserCountryCodeProvider(): () -> String
|
||||
|
||||
fun getWebViewAuthCredentialsProvider(): () -> String?
|
||||
}
|
||||
|
|
@ -9,8 +9,6 @@ interface Learn2earnInteractor : WebViewRedirectHandler {
|
|||
|
||||
var webViewResultHandler: WebViewResultHandler?
|
||||
|
||||
fun setupDependencies(authCredentials: String?, countryCodeProvider: () -> String)
|
||||
|
||||
suspend fun init()
|
||||
|
||||
fun isUserHadPromoCode(): Boolean
|
||||
|
|
|
|||
|
|
@ -3,6 +3,7 @@ package com.tangem.feature.learn2earn.domain.di
|
|||
import android.content.Context
|
||||
import com.tangem.feature.learn2earn.data.api.Learn2earnRepository
|
||||
import com.tangem.feature.learn2earn.domain.DefaultLearn2earnInteractor
|
||||
import com.tangem.feature.learn2earn.domain.api.Learn2earnDependencyProvider
|
||||
import com.tangem.feature.learn2earn.domain.api.Learn2earnInteractor
|
||||
import com.tangem.feature.learn2earn.domain.api.WebViewRedirectHandler
|
||||
import com.tangem.feature.learn2earn.presentation.Learn2earnRouter
|
||||
|
|
@ -29,6 +30,7 @@ class Learn2earnDomainModule {
|
|||
@Singleton
|
||||
fun provideInteractor(
|
||||
repository: Learn2earnRepository,
|
||||
dependencyProvider: Learn2earnDependencyProvider,
|
||||
userWalletManager: UserWalletManager,
|
||||
derivationManager: DerivationManager,
|
||||
): Learn2earnInteractor {
|
||||
|
|
@ -36,6 +38,7 @@ class Learn2earnDomainModule {
|
|||
repository = repository,
|
||||
userWalletManager = userWalletManager,
|
||||
derivationManager = derivationManager,
|
||||
dependencyProvider = dependencyProvider,
|
||||
)
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -29,7 +29,7 @@ class Learn2earnViewModel @Inject constructor(
|
|||
|
||||
var uiState: Learn2earnState by mutableStateOf(
|
||||
Learn2earnState.init(
|
||||
uiActions = UiActions(
|
||||
uiActions = Learn2earnUiActions(
|
||||
buttonStoryClick = ::buttonStoryClick,
|
||||
buttonMainClick = ::buttonMainClick,
|
||||
),
|
||||
|
|
|
|||
|
|
@ -15,9 +15,12 @@ import androidx.compose.ui.graphics.ColorFilter
|
|||
import androidx.compose.ui.graphics.Shape
|
||||
import androidx.compose.ui.res.painterResource
|
||||
import androidx.compose.ui.tooling.preview.Preview
|
||||
import androidx.compose.ui.tooling.preview.PreviewParameter
|
||||
import androidx.compose.ui.tooling.preview.datasource.CollectionPreviewParameterProvider
|
||||
import androidx.compose.ui.unit.dp
|
||||
import com.tangem.core.ui.components.SpacerH4
|
||||
import com.tangem.core.ui.extensions.resolveReference
|
||||
import com.tangem.core.ui.res.TangemColorPalette
|
||||
import com.tangem.core.ui.res.TangemTheme
|
||||
import com.tangem.core.ui.res.TangemTypography
|
||||
import com.tangem.feature.learn2earn.impl.R
|
||||
|
|
@ -57,7 +60,7 @@ internal fun GetBonusView(state: MainScreenState, modifier: Modifier = Modifier)
|
|||
modifier = Modifier
|
||||
.align(Alignment.Center)
|
||||
.size(size = TangemTheme.dimens.size28),
|
||||
color = Color.White,
|
||||
color = TangemColorPalette.White,
|
||||
strokeWidth = TangemTheme.dimens.size2,
|
||||
)
|
||||
}
|
||||
|
|
@ -125,28 +128,46 @@ private fun ContentBackground(shape: Shape) {
|
|||
|
||||
@Preview
|
||||
@Composable
|
||||
private fun OneInchStoriesContentPreview_Light() {
|
||||
private fun GetBonusViewPreview_Light(@PreviewParameter(GetBonusViewPreviewProvider::class) state: MainScreenState) {
|
||||
TangemTheme(
|
||||
isDark = false,
|
||||
) {
|
||||
GetBonusView(makePreviewState())
|
||||
GetBonusView(state)
|
||||
}
|
||||
}
|
||||
|
||||
@Preview
|
||||
@Composable
|
||||
private fun OneInchStoriesContentPreview_Dark() {
|
||||
private fun GetBonusViewPreview_Dark(@PreviewParameter(GetBonusViewPreviewProvider::class) state: MainScreenState) {
|
||||
TangemTheme(
|
||||
isDark = true,
|
||||
) {
|
||||
GetBonusView(makePreviewState())
|
||||
GetBonusView(state)
|
||||
}
|
||||
}
|
||||
|
||||
private fun makePreviewState(): MainScreenState = MainScreenState(
|
||||
isVisible = true,
|
||||
onClick = {},
|
||||
description = MainScreenState.Description.Learn(0),
|
||||
logoState = MainScreenState.LogoState.Idle,
|
||||
showProgress = false,
|
||||
private class GetBonusViewPreviewProvider : CollectionPreviewParameterProvider<MainScreenState>(
|
||||
collection = listOf(
|
||||
MainScreenState(
|
||||
isVisible = true,
|
||||
onClick = {},
|
||||
description = MainScreenState.Description.Learn(1),
|
||||
logoState = MainScreenState.LogoState.Idle,
|
||||
showProgress = false,
|
||||
),
|
||||
MainScreenState(
|
||||
isVisible = true,
|
||||
onClick = {},
|
||||
description = MainScreenState.Description.Learn(2),
|
||||
logoState = MainScreenState.LogoState.InProgress,
|
||||
showProgress = true,
|
||||
),
|
||||
MainScreenState(
|
||||
isVisible = true,
|
||||
onClick = {},
|
||||
description = MainScreenState.Description.GetBonus,
|
||||
logoState = MainScreenState.LogoState.Idle,
|
||||
showProgress = false,
|
||||
),
|
||||
),
|
||||
)
|
||||
|
|
@ -106,7 +106,7 @@ private fun StoryDescription(headerText: String, bodyText: String, modifier: Mod
|
|||
|
||||
@Preview
|
||||
@Composable
|
||||
private fun OneInchStoriesContentPreview_Light() {
|
||||
private fun Learn2earnStoriesScreenPreview_Light() {
|
||||
TangemTheme(
|
||||
isDark = false,
|
||||
) {
|
||||
|
|
@ -118,7 +118,7 @@ private fun OneInchStoriesContentPreview_Light() {
|
|||
|
||||
@Preview
|
||||
@Composable
|
||||
private fun OneInchStoriesContentPreview_Dark() {
|
||||
private fun Learn2earnStoriesScreenPreview_Dark() {
|
||||
TangemTheme(
|
||||
isDark = true,
|
||||
) {
|
||||
|
|
|
|||
|
|
@ -68,7 +68,7 @@ data class MainScreenState(
|
|||
}
|
||||
}
|
||||
|
||||
class UiActions(
|
||||
class Learn2earnUiActions(
|
||||
val buttonStoryClick: () -> Unit,
|
||||
val buttonMainClick: () -> Unit,
|
||||
)
|
||||
|
|
@ -3,7 +3,7 @@ package com.tangem.feature.learn2earn.presentation.ui.state
|
|||
/**
|
||||
[REDACTED_AUTHOR]
|
||||
*/
|
||||
internal fun Learn2earnState.Companion.init(uiActions: UiActions): Learn2earnState {
|
||||
internal fun Learn2earnState.Companion.init(uiActions: Learn2earnUiActions): Learn2earnState {
|
||||
return Learn2earnState(
|
||||
storyScreenState = StoryScreenState(
|
||||
isVisible = false,
|
||||
|
|
|
|||
|
|
@ -22,7 +22,9 @@ internal class WebViewViewModel @Inject constructor(
|
|||
}
|
||||
|
||||
fun extractData(intent: Intent): WebViewData {
|
||||
val uriString = intent.getStringExtra(Learn2earnWebViewActivity.EXTRA_WEB_URI)!!
|
||||
val uriString = requireNotNull(intent.getStringExtra(Learn2earnWebViewActivity.EXTRA_WEB_URI)) {
|
||||
"The Intent property EXTRA_WEB_URI is null"
|
||||
}
|
||||
val rawHeaders = intent.getStringArrayListExtra(Learn2earnWebViewActivity.EXTRA_WEB_HEADERS) ?: ArrayList()
|
||||
|
||||
return WebViewData(
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue