diff --git a/app/build.gradle.kts b/app/build.gradle.kts index 7b8485d96e..dc249a446b 100644 --- a/app/build.gradle.kts +++ b/app/build.gradle.kts @@ -111,6 +111,7 @@ dependencies { implementation(project(":common")) implementation(project(":core:ui")) implementation(project(":libs:crypto")) + implementation(project(":features:referral:presentation")) /** AndroidX libraries */ implementation(AndroidX.coreKtx) @@ -144,7 +145,7 @@ dependencies { /** DI */ implementation(Library.hilt) - implementation(Library.hiltKapt) + kapt(Library.hiltKapt) /** Other libraries */ implementation(Library.materialComponent) diff --git a/app/src/main/java/com/tangem/tap/MainActivity.kt b/app/src/main/java/com/tangem/tap/MainActivity.kt index e557e59247..aa9e63c2dc 100644 --- a/app/src/main/java/com/tangem/tap/MainActivity.kt +++ b/app/src/main/java/com/tangem/tap/MainActivity.kt @@ -30,6 +30,7 @@ import com.tangem.tap.domain.TangemSdkManager import com.tangem.tap.features.shop.redux.ShopAction import com.tangem.wallet.R import com.tangem.wallet.databinding.ActivityMainBinding +import dagger.hilt.android.AndroidEntryPoint import kotlinx.coroutines.CoroutineScope import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.Job @@ -49,6 +50,7 @@ private val mainCoroutineContext: CoroutineContext get() = Job() + Dispatchers.Main + FeatureCoroutineExceptionHandler.create("mainScope") val mainScope = CoroutineScope(mainCoroutineContext) +@AndroidEntryPoint class MainActivity : AppCompatActivity(), SnackbarHandler, ActivityResultCallbackHolder { private var snackbar: Snackbar? = null diff --git a/app/src/main/res/drawable/ic_more_vertical_24.xml b/app/src/main/res/drawable/ic_more_vertical_24.xml deleted file mode 100644 index fd51d1fbf2..0000000000 --- a/app/src/main/res/drawable/ic_more_vertical_24.xml +++ /dev/null @@ -1,10 +0,0 @@ - - - diff --git a/app/src/main/res/menu/menu_wallet.xml b/app/src/main/res/menu/menu_wallet.xml index edd88afb93..c5848ecb6a 100644 --- a/app/src/main/res/menu/menu_wallet.xml +++ b/app/src/main/res/menu/menu_wallet.xml @@ -2,9 +2,9 @@ + android:id="@+id/details_menu" + android:title="@string/details_title" + android:icon="@drawable/ic_more_vertical" + app:iconTint="@color/darkGray6" + app:showAsAction="ifRoom" /> diff --git a/core/ui/build.gradle.kts b/core/ui/build.gradle.kts index ee2eab0e2a..3c509f8c3f 100644 --- a/core/ui/build.gradle.kts +++ b/core/ui/build.gradle.kts @@ -35,4 +35,7 @@ dependencies { implementation(Compose.foundation) implementation(Compose.material) implementation(Compose.uiTooling) + + /** Other libraries */ + implementation(Library.accompanistSystemUiController) } \ No newline at end of file diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/appbar/AppBarWithAdditionalButtons.kt b/core/ui/src/main/java/com/tangem/core/ui/components/appbar/AppBarWithAdditionalButtons.kt new file mode 100644 index 0000000000..73cca24307 --- /dev/null +++ b/core/ui/src/main/java/com/tangem/core/ui/components/appbar/AppBarWithAdditionalButtons.kt @@ -0,0 +1,169 @@ +package com.tangem.core.ui.components.appbar + +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.padding +import androidx.compose.foundation.layout.size +import androidx.compose.material.Icon +import androidx.compose.material.IconButton +import androidx.compose.material.MaterialTheme +import androidx.compose.material.Text +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.dimensionResource +import androidx.compose.ui.res.painterResource +import androidx.compose.ui.tooling.preview.Preview +import com.tangem.core.ui.R +import com.tangem.core.ui.components.appbar.models.AdditionalButton +import com.tangem.core.ui.res.IconColorType +import com.tangem.core.ui.res.TangemTheme +import com.tangem.core.ui.res.TextColorType +import com.tangem.core.ui.res.iconColor +import com.tangem.core.ui.res.textColor + +/** + * App bar with title and two additional buttons + * + * @param startButton button information attached to the left edge + * @param endButton button information attached to the right edge + * + * @see + * Figma Component + */ +@Composable +fun AppBarWithAdditionalButtons( + text: String, + startButton: AdditionalButton? = null, + endButton: AdditionalButton? = null, +) { + Box( + modifier = Modifier + .fillMaxWidth() + .height(dimensionResource(id = R.dimen.size56)) + .padding(all = dimensionResource(id = R.dimen.spacing16)), + ) { + if (startButton != null) { + IconButton(modifier = Modifier.align(Alignment.CenterStart), onClick = startButton.onIconClicked) { + Icon( + painter = painterResource(id = startButton.iconRes), + contentDescription = null, + modifier = Modifier.size(dimensionResource(id = R.dimen.size24)), + tint = MaterialTheme.colors.iconColor(type = IconColorType.PRIMARY1), + ) + } + } + + Text( + text = text, + modifier = Modifier.align(Alignment.Center), + color = MaterialTheme.colors.textColor(type = TextColorType.PRIMARY1), + maxLines = 1, + style = MaterialTheme.typography.subtitle1, + ) + + if (endButton != null) { + IconButton(modifier = Modifier.align(Alignment.CenterEnd), onClick = endButton.onIconClicked) { + Icon( + painter = painterResource(id = endButton.iconRes), + contentDescription = null, + modifier = Modifier.size(dimensionResource(id = R.dimen.size24)), + tint = MaterialTheme.colors.iconColor(type = IconColorType.PRIMARY1), + ) + } + } + } +} + +@Preview(widthDp = 360, heightDp = 56, showBackground = true) +@Composable +fun Preview_AppBarWithAdditionalButtons_InLightTheme() { + TangemTheme(isDarkTheme = false) { + AppBarWithAdditionalButtons( + text = "Tangem", + startButton = AdditionalButton( + iconRes = R.drawable.ic_scan, + onIconClicked = {}, + ), + endButton = AdditionalButton( + iconRes = R.drawable.ic_more_vertical, + onIconClicked = {}, + ), + ) + } +} + +@Preview(widthDp = 360, heightDp = 56, showBackground = true) +@Composable +fun Preview_AppBarWithAdditionalButtons_InDarkTheme() { + TangemTheme(isDarkTheme = true) { + AppBarWithAdditionalButtons( + text = "Tangem", + startButton = AdditionalButton( + iconRes = R.drawable.ic_scan, + onIconClicked = {}, + ), + endButton = AdditionalButton( + iconRes = R.drawable.ic_more_vertical, + onIconClicked = {}, + ), + ) + } +} + +@Preview(widthDp = 360, heightDp = 56, showBackground = true) +@Composable +fun Preview_AppBarWithOnlyStartButtons_InLightTheme() { + TangemTheme(isDarkTheme = false) { + AppBarWithAdditionalButtons( + text = "Tangem", + startButton = AdditionalButton( + iconRes = R.drawable.ic_scan, + onIconClicked = {}, + ), + ) + } +} + +@Preview(widthDp = 360, heightDp = 56, showBackground = true) +@Composable +fun Preview_AppBarWithOnlyStartButtons_InDarkTheme() { + TangemTheme(isDarkTheme = true) { + AppBarWithAdditionalButtons( + text = "Tangem", + startButton = AdditionalButton( + iconRes = R.drawable.ic_scan, + onIconClicked = {}, + ), + ) + } +} + +@Preview(widthDp = 360, heightDp = 56, showBackground = true) +@Composable +fun Preview_AppBarWithOnlyEndButtons_InLightTheme() { + TangemTheme(isDarkTheme = false) { + AppBarWithAdditionalButtons( + text = "Tangem", + endButton = AdditionalButton( + iconRes = R.drawable.ic_more_vertical, + onIconClicked = {}, + ), + ) + } +} + +@Preview(widthDp = 360, heightDp = 56, showBackground = true) +@Composable +fun Preview_AppBarWithOnlyEndButtons_InDarkTheme() { + TangemTheme(isDarkTheme = true) { + AppBarWithAdditionalButtons( + text = "Tangem", + endButton = AdditionalButton( + iconRes = R.drawable.ic_more_vertical, + onIconClicked = {}, + ), + ) + } +} \ No newline at end of file diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/AppBar.kt b/core/ui/src/main/java/com/tangem/core/ui/components/appbar/AppBarWithBackButton.kt similarity index 94% rename from core/ui/src/main/java/com/tangem/core/ui/components/AppBar.kt rename to core/ui/src/main/java/com/tangem/core/ui/components/appbar/AppBarWithBackButton.kt index 6b5e3dc55d..99d6aa527a 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/components/AppBar.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/components/appbar/AppBarWithBackButton.kt @@ -1,6 +1,5 @@ -package com.tangem.core.ui.components +package com.tangem.core.ui.components.appbar -import androidx.compose.foundation.background import androidx.compose.foundation.clickable import androidx.compose.foundation.layout.Arrangement import androidx.compose.foundation.layout.Row @@ -48,7 +47,6 @@ fun PreviewAppBarWithBackButtonInDarkTheme() { fun AppBarWithBackButton(text: String? = null, onBackClick: () -> Unit) { Row( modifier = Modifier - .background(MaterialTheme.colors.primaryVariant) .padding(all = dimensionResource(R.dimen.spacing16)) .fillMaxWidth(), horizontalArrangement = Arrangement.spacedBy(dimensionResource(R.dimen.spacing16)), diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/appbar/models/AdditionalButton.kt b/core/ui/src/main/java/com/tangem/core/ui/components/appbar/models/AdditionalButton.kt new file mode 100644 index 0000000000..2517f5ef41 --- /dev/null +++ b/core/ui/src/main/java/com/tangem/core/ui/components/appbar/models/AdditionalButton.kt @@ -0,0 +1,8 @@ +package com.tangem.core.ui.components.appbar.models + +import androidx.annotation.DrawableRes + +data class AdditionalButton( + @DrawableRes val iconRes: Int, + val onIconClicked: () -> Unit, +) \ No newline at end of file diff --git a/core/ui/src/main/java/com/tangem/core/ui/components/atoms/BottomSheetIndicator.kt b/core/ui/src/main/java/com/tangem/core/ui/components/atoms/BottomSheetIndicator.kt new file mode 100644 index 0000000000..edf127e645 --- /dev/null +++ b/core/ui/src/main/java/com/tangem/core/ui/components/atoms/BottomSheetIndicator.kt @@ -0,0 +1,60 @@ +package com.tangem.core.ui.components.atoms + +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Box +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.layout.width +import androidx.compose.foundation.shape.RoundedCornerShape +import androidx.compose.material.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.ui.Alignment +import androidx.compose.ui.Modifier +import androidx.compose.ui.res.dimensionResource +import androidx.compose.ui.tooling.preview.Preview +import com.tangem.core.ui.R +import com.tangem.core.ui.res.IconColorType +import com.tangem.core.ui.res.TangemTheme +import com.tangem.core.ui.res.iconColor + +/** + * Bottom sheet indicator + * + * @see + * Figma Component + */ +@Composable +fun BottomSheetIndicator() { + Box( + modifier = Modifier + .fillMaxWidth() + .height(dimensionResource(id = R.dimen.size20)), + contentAlignment = Alignment.Center, + ) { + Box( + modifier = Modifier + .width(dimensionResource(id = R.dimen.size32)) + .height(dimensionResource(id = R.dimen.size4)) + .background( + color = MaterialTheme.colors.iconColor(type = IconColorType.INACTIVE), + shape = RoundedCornerShape(dimensionResource(id = R.dimen.radius2)), + ), + ) + } +} + +@Preview(heightDp = 20, showBackground = true) +@Composable +fun Preview_BottomSheetIndicator_InLightTheme() { + TangemTheme(isDarkTheme = false) { + BottomSheetIndicator() + } +} + +@Preview(heightDp = 20, showBackground = true) +@Composable +fun Preview_BottomSheetIndicator_InDarkTheme() { + TangemTheme(isDarkTheme = true) { + BottomSheetIndicator() + } +} \ No newline at end of file diff --git a/core/ui/src/main/java/com/tangem/core/ui/res/TangemTheme.kt b/core/ui/src/main/java/com/tangem/core/ui/res/TangemTheme.kt index 2e065ba6ee..ebd0da2f57 100644 --- a/core/ui/src/main/java/com/tangem/core/ui/res/TangemTheme.kt +++ b/core/ui/src/main/java/com/tangem/core/ui/res/TangemTheme.kt @@ -4,6 +4,8 @@ import androidx.compose.material.MaterialTheme import androidx.compose.material.darkColors import androidx.compose.material.lightColors import androidx.compose.runtime.Composable +import androidx.compose.runtime.SideEffect +import com.google.accompanist.systemuicontroller.rememberSystemUiController internal val isSystemInDarkTheme: Boolean = false // TODO: use isSystemInDarkTheme() for automatic color detection @@ -12,6 +14,11 @@ fun TangemTheme( isDarkTheme: Boolean = isSystemInDarkTheme, content: @Composable () -> Unit, ) { + val systemUiController = rememberSystemUiController() + SideEffect { + systemUiController.setSystemBarsColor(color = if (isDarkTheme) Black else Light1, darkIcons = !isDarkTheme) + } + MaterialTheme( colors = if (isDarkTheme) DarkColors else LightColors, typography = TangemTypography, diff --git a/core/ui/src/main/res/drawable/ic_more_vertical.xml b/core/ui/src/main/res/drawable/ic_more_vertical.xml new file mode 100644 index 0000000000..9f5887ceb4 --- /dev/null +++ b/core/ui/src/main/res/drawable/ic_more_vertical.xml @@ -0,0 +1,10 @@ + + + diff --git a/app/src/main/res/drawable/ic_scan.xml b/core/ui/src/main/res/drawable/ic_scan.xml similarity index 94% rename from app/src/main/res/drawable/ic_scan.xml rename to core/ui/src/main/res/drawable/ic_scan.xml index 1e4cd949d6..31f4345be7 100644 --- a/app/src/main/res/drawable/ic_scan.xml +++ b/core/ui/src/main/res/drawable/ic_scan.xml @@ -2,7 +2,7 @@ android:viewportHeight="24" android:viewportWidth="24" android:width="24dp" xmlns:android="http://schemas.android.com/apk/res/android"> - + diff --git a/core/ui/src/main/res/values/dimens.xml b/core/ui/src/main/res/values/dimens.xml index 3863794b73..98fbe4b379 100644 --- a/core/ui/src/main/res/values/dimens.xml +++ b/core/ui/src/main/res/values/dimens.xml @@ -19,10 +19,14 @@ + 0dp + 4dp 11dp 16dp + 20dp 24dp 28dp + 32dp 40dp 48dp 56dp @@ -45,5 +49,6 @@ 44dp 50dp 54dp + 2dp \ No newline at end of file diff --git a/features/referral/presentation/build.gradle.kts b/features/referral/presentation/build.gradle.kts index 05a5ad278c..73a9372e4b 100644 --- a/features/referral/presentation/build.gradle.kts +++ b/features/referral/presentation/build.gradle.kts @@ -34,6 +34,9 @@ dependencies { /** Core modules */ implementation(project(":core:ui")) + /** AndroidX */ + implementation(AndroidX.appCompat) + /** Compose */ implementation(Compose.foundation) implementation(Compose.material) diff --git a/features/referral/presentation/src/main/java/com/tangem/feature/referral/models/ReferralStateHolder.kt b/features/referral/presentation/src/main/java/com/tangem/feature/referral/models/ReferralStateHolder.kt index 4c592299c1..0f9a5666b3 100644 --- a/features/referral/presentation/src/main/java/com/tangem/feature/referral/models/ReferralStateHolder.kt +++ b/features/referral/presentation/src/main/java/com/tangem/feature/referral/models/ReferralStateHolder.kt @@ -4,6 +4,7 @@ data class ReferralStateHolder( val headerState: HeaderState, val referralInfoState: ReferralInfoState, val effects: Effects, + val agreementBottomSheetState: AgreementBottomSheetState ) { data class HeaderState(val onBackClicked: () -> Unit) @@ -16,7 +17,6 @@ data class ReferralStateHolder( val award: String, val address: String, val discount: String, - val onAgreementClicked: () -> Unit, val onParticipateClicked: () -> Unit, ) : ReferralInfoState, ReferralInfoContentState @@ -27,11 +27,12 @@ data class ReferralStateHolder( val code: String, val onCopyClicked: () -> Unit, val onShareClicked: () -> Unit, - val onAgreementClicked: () -> Unit, ) : ReferralInfoState, ReferralInfoContentState object Loading : ReferralInfoState } data class Effects(val showErrorToast: Boolean) + + data class AgreementBottomSheetState(val url: String) } diff --git a/features/referral/presentation/src/main/java/com/tangem/feature/referral/ui/AgreementBottomSheetContent.kt b/features/referral/presentation/src/main/java/com/tangem/feature/referral/ui/AgreementBottomSheetContent.kt new file mode 100644 index 0000000000..a1f8adc86c --- /dev/null +++ b/features/referral/presentation/src/main/java/com/tangem/feature/referral/ui/AgreementBottomSheetContent.kt @@ -0,0 +1,80 @@ +package com.tangem.feature.referral.ui + +import android.view.ViewGroup.LayoutParams +import android.webkit.WebView +import android.webkit.WebViewClient +import androidx.compose.foundation.background +import androidx.compose.foundation.layout.Column +import androidx.compose.foundation.layout.fillMaxWidth +import androidx.compose.foundation.layout.height +import androidx.compose.foundation.rememberScrollState +import androidx.compose.foundation.verticalScroll +import androidx.compose.material.MaterialTheme +import androidx.compose.runtime.Composable +import androidx.compose.ui.Modifier +import androidx.compose.ui.platform.LocalConfiguration +import androidx.compose.ui.res.dimensionResource +import androidx.compose.ui.res.stringResource +import androidx.compose.ui.tooling.preview.Preview +import androidx.compose.ui.unit.dp +import androidx.compose.ui.viewinterop.AndroidView +import com.tangem.core.ui.components.appbar.AppBarWithAdditionalButtons +import com.tangem.core.ui.components.atoms.BottomSheetIndicator +import com.tangem.core.ui.res.TangemTheme +import com.tangem.feature.referral.presentation.R + +/** + * Bottom sheet content with referral program terms of use + * + * @param url link to the html page + */ +@Composable +fun AgreementBottomSheetContent(url: String) { + Column( + modifier = Modifier + .background(color = MaterialTheme.colors.secondary) + .fillMaxWidth() + .height(LocalConfiguration.current.screenHeightDp.dp - dimensionResource(id = R.dimen.spacing16)), + ) { + BottomSheetIndicator() + Column(modifier = Modifier.verticalScroll(rememberScrollState())) { + AppBarWithAdditionalButtons(text = stringResource(id = R.string.details_referral_title)) + AgreementHtmlView(url = url) + } + } +} + +@Composable +private fun AgreementHtmlView(url: String) { + AndroidView( + modifier = Modifier.background(MaterialTheme.colors.secondary), + factory = { + WebView(it).apply { + layoutParams = LayoutParams(LayoutParams.MATCH_PARENT, LayoutParams.MATCH_PARENT) + webViewClient = WebViewClient() + settings.apply { + javaScriptEnabled = false + allowFileAccess = false + } + loadUrl(url) + } + }, + update = { it.loadUrl(url) }, + ) +} + +@Preview +@Composable +fun Preview_AgreementBottomSheet_InLightTheme() { + TangemTheme(isDarkTheme = false) { + AgreementBottomSheetContent(url = "https://tangem.com/en/") + } +} + +@Preview +@Composable +fun Preview_AgreementBottomSheet_InDarkTheme() { + TangemTheme(isDarkTheme = true) { + AgreementBottomSheetContent(url = "https://tangem.com/en/") + } +} \ No newline at end of file diff --git a/features/referral/presentation/src/main/java/com/tangem/feature/referral/ui/ReferralScreen.kt b/features/referral/presentation/src/main/java/com/tangem/feature/referral/ui/ReferralScreen.kt index 46de8b45c4..a9935a04cc 100644 --- a/features/referral/presentation/src/main/java/com/tangem/feature/referral/ui/ReferralScreen.kt +++ b/features/referral/presentation/src/main/java/com/tangem/feature/referral/ui/ReferralScreen.kt @@ -17,10 +17,16 @@ import androidx.compose.foundation.layout.width import androidx.compose.foundation.rememberScrollState import androidx.compose.foundation.shape.RoundedCornerShape import androidx.compose.foundation.verticalScroll +import androidx.compose.material.BottomSheetScaffold +import androidx.compose.material.BottomSheetState +import androidx.compose.material.BottomSheetValue +import androidx.compose.material.ExperimentalMaterialApi import androidx.compose.material.Icon import androidx.compose.material.MaterialTheme import androidx.compose.material.Text +import androidx.compose.material.rememberBottomSheetScaffoldState import androidx.compose.runtime.Composable +import androidx.compose.runtime.rememberCoroutineScope import androidx.compose.ui.Alignment import androidx.compose.ui.Modifier import androidx.compose.ui.draw.clip @@ -32,8 +38,8 @@ import androidx.compose.ui.text.buildAnnotatedString import androidx.compose.ui.text.style.TextAlign import androidx.compose.ui.text.withStyle import androidx.compose.ui.tooling.preview.Preview -import com.tangem.core.ui.components.AppBarWithBackButton import com.tangem.core.ui.components.VerticalSpacer +import com.tangem.core.ui.components.appbar.AppBarWithBackButton import com.tangem.core.ui.res.ButtonColorType import com.tangem.core.ui.res.IconColorType import com.tangem.core.ui.res.TangemTheme @@ -46,126 +52,51 @@ import com.tangem.feature.referral.models.ReferralStateHolder import com.tangem.feature.referral.models.ReferralStateHolder.ReferralInfoState import com.tangem.feature.referral.presentation.R import com.valentinilk.shimmer.shimmer - -@Preview(widthDp = 360, showBackground = true) -@Composable -fun Preview_ReferralScreen_Participant_InLightTheme() { - TangemTheme(isDarkTheme = false) { - ReferralScreen( - stateHolder = ReferralStateHolder( - headerState = ReferralStateHolder.HeaderState(onBackClicked = {}), - referralInfoState = ReferralInfoState.ParticipantContent( - award = "10 USDT", - address = "ma80...zk8q2", - discount = "10%", - onAgreementClicked = {}, - onParticipateClicked = {}, - ), - effects = ReferralStateHolder.Effects(showErrorToast = false), - ), - ) - } -} - -@Preview(widthDp = 360, showBackground = true) -@Composable -fun Preview_ReferralScreen_Participant_InDarkTheme() { - TangemTheme(isDarkTheme = true) { - ReferralScreen( - stateHolder = ReferralStateHolder( - headerState = ReferralStateHolder.HeaderState(onBackClicked = {}), - referralInfoState = ReferralInfoState.ParticipantContent( - award = "10 USDT", - address = "ma80...zk8q2", - discount = "10%", - onAgreementClicked = {}, - onParticipateClicked = {}, - ), - effects = ReferralStateHolder.Effects(showErrorToast = false), - ), - ) - } -} - -@Preview(widthDp = 360, showBackground = true) -@Composable -fun Preview_ReferralScreen_NonParticipant_InLightTheme() { - TangemTheme(isDarkTheme = false) { - ReferralScreen( - stateHolder = ReferralStateHolder( - headerState = ReferralStateHolder.HeaderState(onBackClicked = {}), - referralInfoState = ReferralInfoState.NonParticipantContent( - award = "10 USDT", - discount = "10%", - purchasedWalletCount = 3, - code = "x4JdK", - onCopyClicked = {}, - onShareClicked = {}, - onAgreementClicked = {}, - ), - effects = ReferralStateHolder.Effects(showErrorToast = false), - ), - ) - } -} - -@Preview(widthDp = 360, showBackground = true) -@Composable -fun Preview_ReferralScreen_NonParticipant_InDarkTheme() { - TangemTheme(isDarkTheme = true) { - ReferralScreen( - stateHolder = ReferralStateHolder( - headerState = ReferralStateHolder.HeaderState(onBackClicked = {}), - referralInfoState = ReferralInfoState.NonParticipantContent( - award = "10 USDT", - discount = "10%", - purchasedWalletCount = 3, - code = "x4JdK", - onCopyClicked = {}, - onShareClicked = {}, - onAgreementClicked = {}, - ), - effects = ReferralStateHolder.Effects(showErrorToast = false), - ), - ) - } -} - -@Preview(widthDp = 360, showBackground = true) -@Composable -fun Preview_ReferralScreen_Loading_InLightTheme() { - TangemTheme(isDarkTheme = false) { - ReferralScreen( - stateHolder = ReferralStateHolder( - headerState = ReferralStateHolder.HeaderState(onBackClicked = {}), - referralInfoState = ReferralInfoState.Loading, - effects = ReferralStateHolder.Effects(showErrorToast = false), - ), - ) - } -} - -@Preview(widthDp = 360, showBackground = true) -@Composable -fun Preview_ReferralScreen_Loading_InDarkTheme() { - TangemTheme(isDarkTheme = true) { - ReferralScreen( - stateHolder = ReferralStateHolder( - headerState = ReferralStateHolder.HeaderState(onBackClicked = {}), - referralInfoState = ReferralInfoState.Loading, - effects = ReferralStateHolder.Effects(showErrorToast = false), - ), - ) - } -} +import kotlinx.coroutines.launch /** * Referral program screen for participant and non-participant * * @param stateHolder state holder */ +@OptIn(ExperimentalMaterialApi::class) @Composable fun ReferralScreen(stateHolder: ReferralStateHolder) { + val coroutineScope = rememberCoroutineScope() + val bottomSheetScaffoldState = rememberBottomSheetScaffoldState( + bottomSheetState = BottomSheetState(BottomSheetValue.Collapsed), + ) + + TangemTheme { + BottomSheetScaffold( + sheetContent = { AgreementBottomSheetContent(stateHolder.agreementBottomSheetState.url) }, + scaffoldState = bottomSheetScaffoldState, + sheetShape = RoundedCornerShape( + topStart = dimensionResource(id = R.dimen.radius16), + topEnd = dimensionResource(id = R.dimen.radius16), + ), + sheetElevation = dimensionResource(id = R.dimen.elevation24), + sheetPeekHeight = dimensionResource(id = R.dimen.size0), + content = { + ReferralContent( + stateHolder = stateHolder, + onAgreementClicked = { + coroutineScope.launch { + if (bottomSheetScaffoldState.bottomSheetState.isCollapsed) { + bottomSheetScaffoldState.bottomSheetState.expand() + } else { + bottomSheetScaffoldState.bottomSheetState.collapse() + } + } + }, + ) + }, + ) + } +} + +@Composable +fun ReferralContent(stateHolder: ReferralStateHolder, onAgreementClicked: () -> Unit) { Column( modifier = Modifier .background(color = MaterialTheme.colors.primary) @@ -175,7 +106,7 @@ fun ReferralScreen(stateHolder: ReferralStateHolder) { ) { Header(stateHolder = stateHolder) VerticalSpacer(spaceResId = R.dimen.spacing16) - ReferralInfo(stateHolder = stateHolder) + ReferralInfo(stateHolder = stateHolder, onAgreementClicked = onAgreementClicked) } } @@ -202,17 +133,17 @@ private fun ColumnScope.Header(stateHolder: ReferralStateHolder) { } @Composable -fun ReferralInfo(stateHolder: ReferralStateHolder) { +fun ReferralInfo(stateHolder: ReferralStateHolder, onAgreementClicked: () -> Unit) { when (val state = stateHolder.referralInfoState) { is ReferralInfoState.ParticipantContent -> { Conditions(state = state) VerticalSpacer(spaceResId = R.dimen.spacing44) - ParticipantBottomBlock(state = state) + ParticipantBottomBlock(state = state, onAgreementClicked = onAgreementClicked) } is ReferralInfoState.NonParticipantContent -> { Conditions(state = state) VerticalSpacer(spaceResId = R.dimen.spacing24) - NonParticipantBottomBlock(state = state) + NonParticipantBottomBlock(state = state, onAgreementClicked = onAgreementClicked) } is ReferralInfoState.Loading -> { LoadingCondition(iconResId = R.drawable.ic_tether) @@ -373,21 +304,150 @@ private fun ShimmerInfo() { } @Composable -private fun ParticipantBottomBlock(state: ReferralInfoState.ParticipantContent) { +private fun ParticipantBottomBlock(state: ReferralInfoState.ParticipantContent, onAgreementClicked: () -> Unit) { ParticipateBottomBlock( - onAgreementClicked = state.onAgreementClicked, + onAgreementClicked = onAgreementClicked, onParticipateClicked = state.onParticipateClicked, ) } @Composable -private fun NonParticipantBottomBlock(state: ReferralInfoState.NonParticipantContent) { +private fun NonParticipantBottomBlock(state: ReferralInfoState.NonParticipantContent, onAgreementClicked: () -> Unit) { NonParticipateBottomBlock( purchasedWalletCount = state.purchasedWalletCount, code = state.code, onCopyClicked = state.onCopyClicked, onShareClicked = state.onShareClicked, - onAgreementClicked = state.onAgreementClicked, + onAgreementClicked = onAgreementClicked, ) } +@Preview(widthDp = 360, showBackground = true) +@Composable +fun Preview_ReferralScreen_Participant_InLightTheme() { + TangemTheme(isDarkTheme = false) { + ReferralScreen( + stateHolder = ReferralStateHolder( + headerState = ReferralStateHolder.HeaderState(onBackClicked = {}), + referralInfoState = ReferralInfoState.ParticipantContent( + award = "10 USDT", + address = "ma80...zk8q2", + discount = "10%", + onParticipateClicked = {}, + ), + effects = ReferralStateHolder.Effects(showErrorToast = false), + agreementBottomSheetState = ReferralStateHolder.AgreementBottomSheetState( + url = "", + ), + ), + ) + } +} + +@Preview(widthDp = 360, showBackground = true) +@Composable +fun Preview_ReferralScreen_Participant_InDarkTheme() { + TangemTheme(isDarkTheme = true) { + ReferralScreen( + stateHolder = ReferralStateHolder( + headerState = ReferralStateHolder.HeaderState(onBackClicked = {}), + referralInfoState = ReferralInfoState.ParticipantContent( + award = "10 USDT", + address = "ma80...zk8q2", + discount = "10%", + + onParticipateClicked = {}, + ), + effects = ReferralStateHolder.Effects(showErrorToast = false), + agreementBottomSheetState = ReferralStateHolder.AgreementBottomSheetState( + url = "", + ), + ), + ) + } +} + +@Preview(widthDp = 360, showBackground = true) +@Composable +fun Preview_ReferralScreen_NonParticipant_InLightTheme() { + TangemTheme(isDarkTheme = false) { + ReferralScreen( + stateHolder = ReferralStateHolder( + headerState = ReferralStateHolder.HeaderState(onBackClicked = {}), + referralInfoState = ReferralInfoState.NonParticipantContent( + award = "10 USDT", + discount = "10%", + purchasedWalletCount = 3, + code = "x4JdK", + onCopyClicked = {}, + onShareClicked = {}, + + ), + effects = ReferralStateHolder.Effects(showErrorToast = false), + agreementBottomSheetState = ReferralStateHolder.AgreementBottomSheetState( + url = "", + ), + ), + ) + } +} + +@Preview(widthDp = 360, showBackground = true) +@Composable +fun Preview_ReferralScreen_NonParticipant_InDarkTheme() { + TangemTheme(isDarkTheme = true) { + ReferralScreen( + stateHolder = ReferralStateHolder( + headerState = ReferralStateHolder.HeaderState(onBackClicked = {}), + referralInfoState = ReferralInfoState.NonParticipantContent( + award = "10 USDT", + discount = "10%", + purchasedWalletCount = 3, + code = "x4JdK", + onCopyClicked = {}, + onShareClicked = {}, + + ), + effects = ReferralStateHolder.Effects(showErrorToast = false), + agreementBottomSheetState = ReferralStateHolder.AgreementBottomSheetState( + url = "", + ), + ), + ) + } +} + +@Preview(widthDp = 360, showBackground = true) +@Composable +fun Preview_ReferralScreen_Loading_InLightTheme() { + TangemTheme(isDarkTheme = false) { + ReferralScreen( + stateHolder = ReferralStateHolder( + headerState = ReferralStateHolder.HeaderState(onBackClicked = {}), + referralInfoState = ReferralInfoState.Loading, + effects = ReferralStateHolder.Effects(showErrorToast = false), + agreementBottomSheetState = ReferralStateHolder.AgreementBottomSheetState( + url = "", + ), + ), + ) + } +} + +@Preview(widthDp = 360, showBackground = true) +@Composable +fun Preview_ReferralScreen_Loading_InDarkTheme() { + TangemTheme(isDarkTheme = true) { + ReferralScreen( + stateHolder = ReferralStateHolder( + headerState = ReferralStateHolder.HeaderState(onBackClicked = {}), + referralInfoState = ReferralInfoState.Loading, + effects = ReferralStateHolder.Effects(showErrorToast = false), + agreementBottomSheetState = ReferralStateHolder.AgreementBottomSheetState( + url = "", + ), + ), + ) + } +} + diff --git a/features/referral/presentation/src/main/res/values-ru/string.xml b/features/referral/presentation/src/main/res/values-ru/string.xml index 27e42e7c03..4a6e997f8e 100644 --- a/features/referral/presentation/src/main/res/values-ru/string.xml +++ b/features/referral/presentation/src/main/res/values-ru/string.xml @@ -4,10 +4,10 @@ Приведи друга в Tangem Вы Получите - за каждый кошелек, который купит ваш друг на ваш адрес в сети Tron %@ + за каждый кошелек, который купит ваш друг на ваш адрес в сети Tron %s Ваш друг Получит - %@ скидку + %s скидку при покупке карточки на сайте tangem.com Нажимая на эту кнопку вы принимаете условия участия