From 7c9e5337573ba6a9358a17aab1279ee60ed21962 Mon Sep 17 00:00:00 2001 From: Tangem Date: Mon, 10 Nov 2025 19:24:43 +0500 Subject: [PATCH] Updated on 2026-08-14 --- core/res/src/main/res/values/strings.xml | 27 +-- .../res/drawable/img_tangem_pay_visa.webp | Bin 0 -> 2164 bytes .../onboarding/impl/build.gradle.kts | 2 + .../model/TangemPayOnboardingModel.kt | 35 ++- ...emPayOnboardingButtonLoadingTransformer.kt | 14 ++ .../tangempay/ui/TandemPayOnboardingScreen.kt | 206 +++++++++++++++--- .../tangempay/ui/TangemPayOnboardingBlock.kt | 48 ---- .../tangempay/ui/TangemPayOnboardingBlocks.kt | 36 --- .../ui/TangemPayOnboardingContent.kt | 84 ------- .../ui/TangemPayOnboardingScreenState.kt | 18 +- 10 files changed, 242 insertions(+), 228 deletions(-) create mode 100644 core/ui/src/main/res/drawable/img_tangem_pay_visa.webp create mode 100644 features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/model/transformers/TangemPayOnboardingButtonLoadingTransformer.kt delete mode 100644 features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/ui/TangemPayOnboardingBlock.kt delete mode 100644 features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/ui/TangemPayOnboardingBlocks.kt delete mode 100644 features/tangempay/onboarding/impl/src/main/kotlin/com/tangem/features/tangempay/ui/TangemPayOnboardingContent.kt 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 0000000000000000000000000000000000000000..ba8b70f6d33b6d100d50f95a38d987b14c4281c1 GIT binary patch literal 2164 zcmV-)2#fbpNk&F&2mk!`>wfC37QLSr+FNF0$U@*N%CSl_iIqW=>BVO-4d zbC&|)Y0mF~leyo(&%Zg@nZV+%pnNFUz7@ zP*8-ge-SSJ)xgWUV**s;)w88b09H^qAi@U#01znvodGJy0D=HMkwTkGrK2JurV)BT zuo4MrYt^k+wh3KL{kivo1%O_D-dN$dl#&^bpO7EpLEmrw-OlJQtOxK8pWk2n7!9wi zgKEEAjy)(Gxi&d0M!)HL2KBiAC%$)oz=H36s|656Z7(*vxoOQ6k{}+vmXjLKZ#73r zJ|$+TFE|OSu#w`*s*r+!=enhze`S4*{WFpNJyPON-fdGgcR%qx!j1?2&O?yH?Sc=@ zk{lR=%QIYtGwE|D18u6(jIKp9qD?H;u+j0d7#BC1EnHWD4CV~C6hexAtRy9vBXljm z$=o#4qx0IGGI`dBLk5*JHS^6x-TiCGKpNA4DBlA=ynZpS1QVP{D~T%ZSz*xC{5!_m zIppYtCT>1li>R?H^CUjVGT69ppzStfhDtj#Sf4fU&t-PPAN3h%+hy3E47$;ck zkMdeP9^M{3OJ;hqZ8u_L-E%Le_<}n$G4AachEH=z`c=ZRk2LJZ?!xs;|Aak&zztjD}fR2)In)H5#> zyn@A(3`0!u1=pGXWve_Hk2gmWAP2Lg^^S5RGr6TzwaJ-f=bZLUS5E>QK}P~$^OkdU zkU^ZfvzALzg+V~PC6ixCvn${%ur*NPa3FYD6W5ISf%Z;h%~w zzej%ylWMHfD(Ub~YLbdKPQF>0tlM!SF-=OyH?2VoDX-Igexfe1^*IyzPgWKdRcB*f zS3PHq+8$lhYiL@U13B9H(Mib|{`rC9Uw~g2!|wS5YQfe3s53?Va48V;=opV(Bl?gl z%v`B^>4bWQ&IBeAfpE=)tp}>7HT`o-D1}0Xr#6{U`=EaC^0>?U3*g zvi(Pybu}B2mP+zk@o5Rj!N)wkI{46kTO{AbwpyRb#+tzUml|I99HQww0`C7ZC%`e^ zSi+tE(j~d6EhLQ|w%*JH1@Wux>j$+fna2dF6WuXpCA8%6x6vB`FapOy>zTqPBaJ`> zs@QkjwCb(q;3IQ5At1uqQFJrB-JYf0TY2z^9ANFIKlr2^&nKq83JCSaM*_Rup22pS zjR^B{wNP%&mKz6?#YsWf*wTT4b|dijnbS&eD?d5yd#hmpM;zesz+mas1H9nSzG*(7 z2NdwqI4o|Kwl<9s)m0Z^gn6#4)zah1=QLLscDth305NiJc?x2_=J<*|}MXGfX zMKS8xmV7BKZ&-2>QB0K!f!0q?4v0LaKjV(A(~nvHW$iV^=x z@4da{t+)fe0O&1&+S{7uoVBR!cVx-e6Y$$>i(s@oZrZ=p-D=Bqb$U(wc+cfK6$oXg ze`2(~g;=N5J^%OK2zxUB6LEu8+f-SLWbTMdP6?@`YHgcW(42O%SStg}b^?M-chUw90`B(l*j6sM#c8J z?tz(L+ed?KgYfVj1T&;H=iZV1Ly5VHLgDR0Xw~eIU6gpsUrh2u%r#irUtsYU+$tZ- zT0xwzCoj#=nJKV1QFW9PP+j3S7Mu&N#|OKxw*ClpvC{U>-K!d)^6&41Vu6IUgUtXM qCfQ3)u6<() @@ -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