diff --git a/core/res/src/main/res/values/strings.xml b/core/res/src/main/res/values/strings.xml
index 6b1af5876a..6b1a0e2d9b 100644
--- a/core/res/src/main/res/values/strings.xml
+++ b/core/res/src/main/res/values/strings.xml
@@ -258,7 +258,7 @@
Enable
Enabled
Error
- Network service fee
+ Top-up network fee
Swap
Explore
Explore transaction history
@@ -274,7 +274,7 @@
Free
From
Synchronize addresses
- Get started
+ Learn more
Get token
Go to provider
Go to token
@@ -573,8 +573,8 @@
Upgrade current wallet
Go to backup
Please back up your wallet before creating an access code.
+ Finish Backup First
Finalize backup first
- Finish backup first
Incomplete
Other methods
Physical devices that securely store your private key offline.
@@ -1374,6 +1374,7 @@
Completed
Declined
Pending
+ Terms, Fees & Limits
The bank rejected this transaction request.
This fee goes to cover the cost of handling your transfer.
Keep using your money. You can freeze anytime.
@@ -1410,12 +1411,12 @@
View Status
KYC in progress for Tangem Pay
Get card
- Add to your wallet and pay with your phone anywhere.
- Apple Pay & Google Pay
- Use your USDC balance to pay for everyday purchases seamlessly.
- Everyday purchases
- Your card details are protected — full control in the app.
- Built-in security
+ Spend your crypto anywhere
+ With digital card that works with Apple Pay and Google Pay
+ There are no additional fees for purchases
+ Pay exactly what you see
+ A separate payment account will be created without disclosing your addresses and assets
+ Unrivaled privacy
Get your free Crypto Card\nin minutes
Tangem Pay
This is my wallet
@@ -1880,7 +1881,7 @@
With Yield mode active, all future deposits to this address will go to Aave. You can still manage your funds freely.
Your %s is supplied to Aave
Supplying %1$s %2$s to Aave is pending
- Give Approve
+ Approve
Your token’s approval has been revoked. Grant it again to resume service functionality.
Approve needed
The fee will be taken out, and your assets will be lent again.
@@ -1909,7 +1910,7 @@
Maximum fee
The minimum amount is calculated based on the current network fee so that it does not exceed 4%% of the top-up amount, which makes the minimum %1$s (%2$s).
Minimum top-up
- Fee policy
+ Top-up fee policy
Tangem also takes a 15% service fee on yield earned.
Your funds will be automatically supplied to Aave once network fees are lower or your balance meets the minimum required amount.
Historical returns
@@ -1936,7 +1937,7 @@
When you top up, your funds will be automatically sent to Aave to start earning interest. %s will be deducted to cover the transaction fee.
Supply assets
Your %s will be supplied to Aave, but will remain manageable.
- See fee policy
+ See top-up fee policy
Your next top-ups will be automatically supplied to Aave.
Active
Paused
@@ -1950,7 +1951,7 @@
Interest accrues automatically.
Interest accrues automatically
Yield mode
- Processing your deposit
+ Processing your top-up
Yield Mode
Automatic
Deposit some %1$s %2$s to cover the network fee for transactions
diff --git a/core/ui/src/main/res/drawable/img_tangem_pay_visa.webp b/core/ui/src/main/res/drawable/img_tangem_pay_visa.webp
new file mode 100644
index 0000000000..ba8b70f6d3
Binary files /dev/null and b/core/ui/src/main/res/drawable/img_tangem_pay_visa.webp differ
diff --git a/features/tangempay/onboarding/impl/build.gradle.kts b/features/tangempay/onboarding/impl/build.gradle.kts
index a118c239b7..7b91afb8fd 100644
--- a/features/tangempay/onboarding/impl/build.gradle.kts
+++ b/features/tangempay/onboarding/impl/build.gradle.kts
@@ -16,6 +16,8 @@ dependencies {
implementation(projects.core.decompose)
implementation(projects.core.ui)
implementation(projects.core.error)
+ implementation(projects.core.navigation)
+ implementation(deps.arrow.core)
implementation(deps.arrow.core)
/** Common */
diff --git a/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayOnboardingModel.kt b/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayOnboardingModel.kt
index aedb40e989..6bfcbb7147 100644
--- a/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayOnboardingModel.kt
+++ b/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/model/TangemPayOnboardingModel.kt
@@ -6,14 +6,17 @@ import com.tangem.core.decompose.di.ModelScoped
import com.tangem.core.decompose.model.Model
import com.tangem.core.decompose.model.ParamsContainer
import com.tangem.core.decompose.navigation.Router
+import com.tangem.core.navigation.url.UrlOpener
import com.tangem.domain.pay.repository.OnboardingRepository
import com.tangem.domain.pay.usecase.ProduceTangemPayInitialDataUseCase
import com.tangem.features.tangempay.components.TangemPayOnboardingComponent
+import com.tangem.features.tangempay.model.transformers.TangemPayOnboardingButtonLoadingTransformer
import com.tangem.features.tangempay.ui.TangemPayOnboardingScreenState
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.StateFlow
import kotlinx.coroutines.flow.update
+import com.tangem.utils.transformer.update as transformerUpdate
import kotlinx.coroutines.launch
import timber.log.Timber
import javax.inject.Inject
@@ -26,6 +29,7 @@ internal class TangemPayOnboardingModel @Inject constructor(
override val dispatchers: CoroutineDispatcherProvider,
private val repository: OnboardingRepository,
private val produceInitialDataUseCase: ProduceTangemPayInitialDataUseCase,
+ private val urlOpener: UrlOpener,
) : Model() {
private val params = paramsContainer.require()
@@ -48,7 +52,16 @@ internal class TangemPayOnboardingModel @Inject constructor(
}
private fun showOnboarding() {
- uiState.update { it.copy(fullScreenLoading = false) }
+ uiState.update {
+ TangemPayOnboardingScreenState.Content(
+ onBack = it.onBack,
+ onTermsClick = ::onTermsClick,
+ buttonConfig = TangemPayOnboardingScreenState.Content.ButtonConfig(
+ isLoading = false,
+ onClick = ::onGetCardClick,
+ ),
+ )
+ }
}
private suspend fun checkCustomerInfo() {
@@ -57,8 +70,7 @@ internal class TangemPayOnboardingModel @Inject constructor(
when {
!customerInfo.isKycApproved -> {
when (params) {
- is TangemPayOnboardingComponent.Params.Deeplink ->
- uiState.value = uiState.value.copy(fullScreenLoading = false)
+ is TangemPayOnboardingComponent.Params.Deeplink -> showOnboarding()
else -> openKyc()
}
}
@@ -68,13 +80,17 @@ internal class TangemPayOnboardingModel @Inject constructor(
.onLeft { back() }
}
+ private fun onTermsClick() {
+ urlOpener.openUrl("https://tangem.com/docs/en/tangem-visa-tariffs.pdf")
+ }
+
private fun onGetCardClick() {
- uiState.update { it.copy(buttonLoading = true) }
+ uiState.transformerUpdate(TangemPayOnboardingButtonLoadingTransformer(isLoading = true))
modelScope.launch {
val result = produceInitialDataUseCase()
if (result.isLeft()) {
Timber.e("Error producing initial data: ${result.leftOrNull()?.message}")
- uiState.update { it.copy(buttonLoading = false) }
+ uiState.transformerUpdate(TangemPayOnboardingButtonLoadingTransformer(isLoading = false))
return@launch
}
@@ -82,7 +98,7 @@ internal class TangemPayOnboardingModel @Inject constructor(
.fold(
ifLeft = {
Timber.e("Error getCustomerInfo: ${it.errorCode}")
- uiState.update { it.copy(buttonLoading = false) }
+ uiState.transformerUpdate(TangemPayOnboardingButtonLoadingTransformer(isLoading = false))
},
ifRight = { customerInfo ->
if (customerInfo.isKycApproved) {
@@ -104,11 +120,6 @@ internal class TangemPayOnboardingModel @Inject constructor(
}
private fun getInitialState(): TangemPayOnboardingScreenState {
- return TangemPayOnboardingScreenState(
- fullScreenLoading = true,
- buttonLoading = false,
- onGetCardClick = ::onGetCardClick,
- onBackClick = ::back,
- )
+ return TangemPayOnboardingScreenState.Loading(onBack = ::back)
}
}
\ No newline at end of file
diff --git a/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/model/transformers/TangemPayOnboardingButtonLoadingTransformer.kt b/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/model/transformers/TangemPayOnboardingButtonLoadingTransformer.kt
new file mode 100644
index 0000000000..0b01a766a2
--- /dev/null
+++ b/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/model/transformers/TangemPayOnboardingButtonLoadingTransformer.kt
@@ -0,0 +1,14 @@
+package com.tangem.features.tangempay.model.transformers
+
+import com.tangem.features.tangempay.ui.TangemPayOnboardingScreenState
+import com.tangem.utils.transformer.Transformer
+
+internal class TangemPayOnboardingButtonLoadingTransformer(
+ private val isLoading: Boolean,
+) : Transformer {
+ override fun transform(prevState: TangemPayOnboardingScreenState): TangemPayOnboardingScreenState {
+ val contentState = prevState as? TangemPayOnboardingScreenState.Content ?: return prevState
+ val updatedButtonConfig = contentState.buttonConfig.copy(isLoading = isLoading)
+ return contentState.copy(buttonConfig = updatedButtonConfig)
+ }
+}
\ No newline at end of file
diff --git a/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/ui/TandemPayOnboardingScreen.kt b/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/ui/TandemPayOnboardingScreen.kt
index 54f4140025..b30c97ef7c 100644
--- a/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/ui/TandemPayOnboardingScreen.kt
+++ b/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/ui/TandemPayOnboardingScreen.kt
@@ -1,18 +1,34 @@
package com.tangem.features.tangempay.ui
import android.content.res.Configuration
-import androidx.compose.foundation.layout.fillMaxSize
-import androidx.compose.foundation.layout.padding
-import androidx.compose.foundation.layout.statusBarsPadding
-import androidx.compose.foundation.layout.systemBarsPadding
+import androidx.annotation.DrawableRes
+import androidx.compose.foundation.Image
+import androidx.compose.foundation.layout.*
+import androidx.compose.foundation.rememberScrollState
+import androidx.compose.foundation.verticalScroll
+import androidx.compose.material3.CircularProgressIndicator
+import androidx.compose.material3.Icon
import androidx.compose.material3.Scaffold
+import androidx.compose.material3.Text
import androidx.compose.runtime.Composable
+import androidx.compose.ui.Alignment
import androidx.compose.ui.Modifier
+import androidx.compose.ui.res.painterResource
+import androidx.compose.ui.text.style.TextAlign
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.common.ui.navigationButtons.NavigationButton
+import com.tangem.common.ui.navigationButtons.NavigationPrimaryButton
import com.tangem.core.ui.R
+import com.tangem.core.ui.components.SecondaryButton
import com.tangem.core.ui.components.appbar.AppBarWithBackButton
+import com.tangem.core.ui.extensions.TextReference
+import com.tangem.core.ui.extensions.resolveReference
+import com.tangem.core.ui.extensions.resourceReference
+import com.tangem.core.ui.extensions.stringResourceSafe
+import com.tangem.core.ui.res.TangemTheme
import com.tangem.core.ui.res.TangemThemePreview
import com.tangem.core.ui.utils.WindowInsetsZero
@@ -23,27 +39,166 @@ internal fun TandemPayOnboardingScreen(state: TangemPayOnboardingScreenState, mo
topBar = {
AppBarWithBackButton(
modifier = Modifier.statusBarsPadding(),
- onBackClick = state.onBackClick,
+ onBackClick = state.onBack,
iconRes = R.drawable.ic_back_24,
)
},
contentWindowInsets = WindowInsetsZero,
content = { paddingValues ->
- TangemPayOnboardingContent(
- modifier = Modifier
- .padding(paddingValues)
- .fillMaxSize(),
- state = state,
- onButtonClick = state.onGetCardClick,
- )
+ val contentModifier = Modifier
+ .systemBarsPadding()
+ .padding(paddingValues)
+ .fillMaxSize()
+ when (state) {
+ is TangemPayOnboardingScreenState.Loading -> TangemPayOnboardingLoading(modifier = contentModifier)
+ is TangemPayOnboardingScreenState.Content -> TangemPayOnboardingContent(
+ state = state,
+ modifier = contentModifier,
+ )
+ }
},
)
}
+@Composable
+private fun TangemPayOnboardingLoading(modifier: Modifier = Modifier) {
+ Box(modifier = modifier, contentAlignment = Alignment.Center) {
+ CircularProgressIndicator(
+ modifier = Modifier,
+ color = TangemTheme.colors.icon.primary1,
+ )
+ }
+}
+
+@Composable
+private fun TangemPayOnboardingContent(state: TangemPayOnboardingScreenState.Content, modifier: Modifier = Modifier) {
+ Column(modifier = modifier.padding(horizontal = 16.dp)) {
+ Column(
+ modifier = Modifier
+ .padding(bottom = 16.dp)
+ .weight(1f)
+ .verticalScroll(rememberScrollState()),
+ horizontalAlignment = Alignment.CenterHorizontally,
+ verticalArrangement = Arrangement.Center,
+ ) {
+ Image(
+ painter = painterResource(id = R.drawable.img_tangem_pay_visa),
+ contentDescription = null,
+ modifier = Modifier.size(width = 200.dp, height = 130.dp),
+ )
+
+ Text(
+ text = stringResourceSafe(R.string.tangempay_onboarding_title),
+ style = TangemTheme.typography.h2,
+ color = TangemTheme.colors.text.primary1,
+ textAlign = TextAlign.Center,
+ modifier = Modifier
+ .padding(top = 24.dp)
+ .padding(horizontal = 12.dp)
+ .fillMaxWidth(),
+ )
+
+ TangemPayOnboardingBlocks(
+ modifier = Modifier
+ .padding(top = 24.dp)
+ .padding(horizontal = 12.dp),
+ )
+ }
+ FooterButtons(
+ modifier = Modifier.padding(bottom = 16.dp),
+ primaryButtonConfig = state.buttonConfig,
+ onTermsClick = state.onTermsClick,
+ )
+ }
+}
+
+@Composable
+internal fun TangemPayOnboardingBlocks(modifier: Modifier = Modifier) {
+ Column(
+ modifier = modifier,
+ verticalArrangement = Arrangement.spacedBy(20.dp),
+ ) {
+ TangemPayOnboardingBlock(
+ painterRes = R.drawable.ic_security_check_22,
+ titleRef = TextReference.Res(R.string.tangempay_onboarding_security_title),
+ descriptionRef = TextReference.Res(R.string.tangempay_onboarding_security_description),
+ )
+
+ TangemPayOnboardingBlock(
+ painterRes = R.drawable.ic_shopping_basket_22,
+ titleRef = TextReference.Res(R.string.tangempay_onboarding_purchases_title),
+ descriptionRef = TextReference.Res(R.string.tangempay_onboarding_purchases_description),
+ )
+
+ TangemPayOnboardingBlock(
+ painterRes = R.drawable.ic_credit_card_add_22,
+ titleRef = TextReference.Res(R.string.tangempay_onboarding_pay_title),
+ descriptionRef = TextReference.Res(R.string.tangempay_onboarding_pay_description),
+ )
+ }
+}
+
+@Composable
+private fun TangemPayOnboardingBlock(
+ @DrawableRes painterRes: Int,
+ titleRef: TextReference,
+ descriptionRef: TextReference,
+ modifier: Modifier = Modifier,
+) {
+ Row(modifier = modifier) {
+ Icon(
+ painter = painterResource(id = painterRes),
+ contentDescription = null,
+ modifier = Modifier.size(width = 24.dp, height = 24.dp),
+ tint = TangemTheme.colors.icon.accent,
+ )
+ Column(
+ modifier = Modifier
+ .padding(start = 12.dp)
+ .fillMaxWidth(),
+ ) {
+ Text(
+ text = titleRef.resolveReference(),
+ style = TangemTheme.typography.subtitle1,
+ color = TangemTheme.colors.text.primary1,
+ )
+ Text(
+ text = descriptionRef.resolveReference(),
+ style = TangemTheme.typography.body2,
+ color = TangemTheme.colors.text.secondary,
+ )
+ }
+ }
+}
+
+@Composable
+private fun FooterButtons(
+ primaryButtonConfig: TangemPayOnboardingScreenState.Content.ButtonConfig,
+ onTermsClick: () -> Unit,
+ modifier: Modifier = Modifier,
+) {
+ Column(modifier = modifier, verticalArrangement = Arrangement.spacedBy(8.dp)) {
+ SecondaryButton(
+ modifier = Modifier.fillMaxWidth(),
+ text = stringResourceSafe(R.string.tangem_pay_terms_fees_limits),
+ onClick = onTermsClick,
+ )
+ NavigationPrimaryButton(
+ primaryButton = NavigationButton(
+ textReference = resourceReference(R.string.tangempay_onboarding_get_card_button_text),
+ iconRes = R.drawable.ic_tangem_24,
+ isIconVisible = true,
+ shouldShowProgress = primaryButtonConfig.isLoading,
+ onClick = primaryButtonConfig.onClick,
+ ),
+ )
+ }
+}
+
@Preview(showBackground = true)
@Preview(showBackground = true, uiMode = Configuration.UI_MODE_NIGHT_YES)
@Composable
-private fun PreviewDarkTheme(
+private fun TandemPayOnboardingScreenPreview(
@PreviewParameter(TangemPayOnboardingScreenStateProvider::class)
state: TangemPayOnboardingScreenState,
) {
@@ -55,23 +210,16 @@ private fun PreviewDarkTheme(
private class TangemPayOnboardingScreenStateProvider :
CollectionPreviewParameterProvider(
listOf(
- TangemPayOnboardingScreenState(
- fullScreenLoading = true,
- buttonLoading = false,
- onGetCardClick = {},
- onBackClick = {},
+ TangemPayOnboardingScreenState.Loading(onBack = {}),
+ TangemPayOnboardingScreenState.Content(
+ onBack = {},
+ onTermsClick = {},
+ buttonConfig = TangemPayOnboardingScreenState.Content.ButtonConfig(isLoading = false, onClick = {}),
),
- TangemPayOnboardingScreenState(
- fullScreenLoading = false,
- buttonLoading = false,
- onGetCardClick = {},
- onBackClick = {},
- ),
- TangemPayOnboardingScreenState(
- fullScreenLoading = false,
- buttonLoading = true,
- onGetCardClick = {},
- onBackClick = {},
+ TangemPayOnboardingScreenState.Content(
+ onBack = {},
+ onTermsClick = {},
+ buttonConfig = TangemPayOnboardingScreenState.Content.ButtonConfig(isLoading = true, onClick = {}),
),
),
)
\ No newline at end of file
diff --git a/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/ui/TangemPayOnboardingBlock.kt b/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/ui/TangemPayOnboardingBlock.kt
deleted file mode 100644
index 94dc71b1ba..0000000000
--- a/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/ui/TangemPayOnboardingBlock.kt
+++ /dev/null
@@ -1,48 +0,0 @@
-package com.tangem.features.tangempay.ui
-
-import androidx.annotation.DrawableRes
-import androidx.compose.foundation.layout.*
-import androidx.compose.material3.Icon
-import androidx.compose.material3.Text
-import androidx.compose.runtime.Composable
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.res.painterResource
-import androidx.compose.ui.unit.dp
-import com.tangem.core.ui.extensions.TextReference
-import com.tangem.core.ui.extensions.resolveReference
-import com.tangem.core.ui.res.TangemTheme
-
-@Composable
-internal fun TangemPayOnboardingBlock(
- @DrawableRes painterRes: Int,
- titleRef: TextReference,
- descriptionRef: TextReference,
- modifier: Modifier = Modifier,
-) {
- Row(
- modifier = modifier
- .padding(start = 32.dp, end = 32.dp),
- ) {
- Icon(
- painter = painterResource(id = painterRes),
- contentDescription = null,
- modifier = Modifier
- .width(24.dp)
- .height(24.dp),
- )
- Column(
- modifier = Modifier.padding(start = 12.dp),
- ) {
- Text(
- text = titleRef.resolveReference(),
- style = TangemTheme.typography.subtitle1,
- color = TangemTheme.colors.text.primary1,
- )
- Text(
- text = descriptionRef.resolveReference(),
- style = TangemTheme.typography.body2,
- color = TangemTheme.colors.text.secondary,
- )
- }
- }
-}
\ No newline at end of file
diff --git a/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/ui/TangemPayOnboardingBlocks.kt b/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/ui/TangemPayOnboardingBlocks.kt
deleted file mode 100644
index 71ae0aadcc..0000000000
--- a/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/ui/TangemPayOnboardingBlocks.kt
+++ /dev/null
@@ -1,36 +0,0 @@
-package com.tangem.features.tangempay.ui
-
-import androidx.compose.runtime.Composable
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.unit.dp
-import com.tangem.core.ui.R
-import com.tangem.core.ui.components.SpacerH
-import com.tangem.core.ui.extensions.TextReference
-
-@Composable
-internal fun TangemPayOnboardingBLocks(modifier: Modifier = Modifier) {
- TangemPayOnboardingBlock(
- modifier = modifier,
- painterRes = R.drawable.ic_security_check_22,
- titleRef = TextReference.Res(R.string.tangempay_onboarding_security_title),
- descriptionRef = TextReference.Res(R.string.tangempay_onboarding_security_description),
- )
-
- SpacerH(18.dp)
-
- TangemPayOnboardingBlock(
- modifier = modifier,
- painterRes = R.drawable.ic_shopping_basket_22,
- titleRef = TextReference.Res(R.string.tangempay_onboarding_purchases_title),
- descriptionRef = TextReference.Res(R.string.tangempay_onboarding_purchases_description),
- )
-
- SpacerH(18.dp)
-
- TangemPayOnboardingBlock(
- modifier = modifier,
- painterRes = R.drawable.ic_credit_card_add_22,
- titleRef = TextReference.Res(R.string.tangempay_onboarding_pay_title),
- descriptionRef = TextReference.Res(R.string.tangempay_onboarding_pay_description),
- )
-}
\ No newline at end of file
diff --git a/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/ui/TangemPayOnboardingContent.kt b/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/ui/TangemPayOnboardingContent.kt
deleted file mode 100644
index 25b03d0e92..0000000000
--- a/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/ui/TangemPayOnboardingContent.kt
+++ /dev/null
@@ -1,84 +0,0 @@
-package com.tangem.features.tangempay.ui
-
-import androidx.compose.foundation.Image
-import androidx.compose.foundation.layout.*
-import androidx.compose.material3.CircularProgressIndicator
-import androidx.compose.material3.Text
-import androidx.compose.runtime.Composable
-import androidx.compose.ui.Alignment
-import androidx.compose.ui.Modifier
-import androidx.compose.ui.res.painterResource
-import androidx.compose.ui.text.style.TextAlign
-import androidx.compose.ui.unit.dp
-import com.tangem.common.ui.navigationButtons.NavigationButton
-import com.tangem.common.ui.navigationButtons.NavigationPrimaryButton
-import com.tangem.core.ui.components.SpacerH
-import com.tangem.core.ui.extensions.resourceReference
-import com.tangem.core.ui.extensions.stringResourceSafe
-import com.tangem.core.ui.res.TangemTheme
-import com.tangem.features.tangempay.onboarding.impl.R
-
-@Composable
-internal fun TangemPayOnboardingContent(
- state: TangemPayOnboardingScreenState,
- onButtonClick: () -> Unit,
- modifier: Modifier = Modifier,
-) {
- if (state.fullScreenLoading) {
- Box(
- modifier = modifier.fillMaxSize(),
- contentAlignment = Alignment.Center,
- ) {
- CircularProgressIndicator(
- modifier = Modifier,
- color = TangemTheme.colors.icon.primary1,
- )
- }
- } else {
- Column(
- modifier
- .fillMaxSize()
- .navigationBarsPadding(),
- ) {
- Column(
- modifier = Modifier
- .weight(1f)
- .padding(top = 24.dp, bottom = 32.dp),
- horizontalAlignment = Alignment.CenterHorizontally,
- ) {
- Image(
- painter = painterResource(id = R.drawable.img_tangem_pay_onboarding),
- contentDescription = null,
- modifier = Modifier
- .height(250.dp)
- .fillMaxWidth(),
- )
-
- Text(
- text = stringResourceSafe(R.string.tangempay_onboarding_title),
- style = TangemTheme.typography.h2,
- color = TangemTheme.colors.text.primary1,
- textAlign = TextAlign.Center,
- )
-
- SpacerH(32.dp)
-
- TangemPayOnboardingBLocks()
- }
-
- NavigationPrimaryButton(
- modifier = Modifier
- .imePadding()
- .padding(start = 16.dp, end = 16.dp, bottom = 16.dp)
- .fillMaxWidth(),
- primaryButton = NavigationButton(
- textReference = resourceReference(R.string.tangempay_onboarding_get_card_button_text),
- iconRes = R.drawable.ic_tangem_24,
- isIconVisible = true,
- shouldShowProgress = state.buttonLoading,
- onClick = onButtonClick,
- ),
- )
- }
- }
-}
\ No newline at end of file
diff --git a/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/ui/TangemPayOnboardingScreenState.kt b/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/ui/TangemPayOnboardingScreenState.kt
index 9cf4deb4d6..af92226019 100644
--- a/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/ui/TangemPayOnboardingScreenState.kt
+++ b/features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/ui/TangemPayOnboardingScreenState.kt
@@ -3,9 +3,15 @@ package com.tangem.features.tangempay.ui
import javax.annotation.concurrent.Immutable
@Immutable
-internal data class TangemPayOnboardingScreenState(
- val fullScreenLoading: Boolean,
- val buttonLoading: Boolean,
- val onGetCardClick: () -> Unit,
- val onBackClick: () -> Unit,
-)
\ No newline at end of file
+internal sealed class TangemPayOnboardingScreenState {
+ abstract val onBack: () -> Unit
+
+ data class Loading(override val onBack: () -> Unit) : TangemPayOnboardingScreenState()
+ data class Content(
+ override val onBack: () -> Unit,
+ val onTermsClick: () -> Unit,
+ val buttonConfig: ButtonConfig,
+ ) : TangemPayOnboardingScreenState() {
+ data class ButtonConfig(val isLoading: Boolean, val onClick: () -> Unit)
+ }
+}
\ No newline at end of file