Updated on 2026-08-14

This commit is contained in:
Tangem 2023-06-28 15:54:43 +03:00
parent 54d8ce26bf
commit 1b486b730c
15 changed files with 99 additions and 49 deletions

View file

@ -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()

View file

@ -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]
*/

View file

@ -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 {

View file

@ -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?
}

View file

@ -9,8 +9,6 @@ interface Learn2earnInteractor : WebViewRedirectHandler {
var webViewResultHandler: WebViewResultHandler?
fun setupDependencies(authCredentials: String?, countryCodeProvider: () -> String)
suspend fun init()
fun isUserHadPromoCode(): Boolean

View file

@ -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,
)
}

View file

@ -29,7 +29,7 @@ class Learn2earnViewModel @Inject constructor(
var uiState: Learn2earnState by mutableStateOf(
Learn2earnState.init(
uiActions = UiActions(
uiActions = Learn2earnUiActions(
buttonStoryClick = ::buttonStoryClick,
buttonMainClick = ::buttonMainClick,
),

View file

@ -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,
),
),
)

View file

@ -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,
) {

View file

@ -68,7 +68,7 @@ data class MainScreenState(
}
}
class UiActions(
class Learn2earnUiActions(
val buttonStoryClick: () -> Unit,
val buttonMainClick: () -> Unit,
)

View file

@ -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,

View file

@ -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(