From 9f08cdbd072cdd055d29f2dbee603d4461fd2aa0 Mon Sep 17 00:00:00 2001 From: Tangem Date: Fri, 13 Sep 2024 11:58:13 +0300 Subject: [PATCH] Updated on 2026-08-14 --- .../firebase/FirebaseAppInstanceIdProvider.kt | 7 +++- .../preview/PreviewDetailsComponent.kt | 5 +-- .../features/details/model/DetailsModel.kt | 21 ++++++++++ .../features/details/utils/ItemsBuilder.kt | 41 +++++++------------ 4 files changed, 42 insertions(+), 32 deletions(-) diff --git a/app/src/main/java/com/tangem/tap/common/analytics/handlers/firebase/FirebaseAppInstanceIdProvider.kt b/app/src/main/java/com/tangem/tap/common/analytics/handlers/firebase/FirebaseAppInstanceIdProvider.kt index 8d33e1522e..5a8a85c072 100644 --- a/app/src/main/java/com/tangem/tap/common/analytics/handlers/firebase/FirebaseAppInstanceIdProvider.kt +++ b/app/src/main/java/com/tangem/tap/common/analytics/handlers/firebase/FirebaseAppInstanceIdProvider.kt @@ -19,6 +19,11 @@ internal class FirebaseAppInstanceIdProvider : AppInstanceIdProvider { } override fun getAppInstanceIdSync(): String? { - return Firebase.analytics.appInstanceId.result + return try { + Firebase.analytics.appInstanceId.result + } catch (e: IllegalStateException) { + Timber.e(e, "getAppInstanceIdSync") + null + } } } \ No newline at end of file diff --git a/features/details/impl/src/main/kotlin/com/tangem/features/details/component/preview/PreviewDetailsComponent.kt b/features/details/impl/src/main/kotlin/com/tangem/features/details/component/preview/PreviewDetailsComponent.kt index 1a15b85fc5..9a4ec03248 100644 --- a/features/details/impl/src/main/kotlin/com/tangem/features/details/component/preview/PreviewDetailsComponent.kt +++ b/features/details/impl/src/main/kotlin/com/tangem/features/details/component/preview/PreviewDetailsComponent.kt @@ -2,7 +2,6 @@ package com.tangem.features.details.component.preview import androidx.compose.runtime.Composable import androidx.compose.ui.Modifier -import com.tangem.core.analytics.DummyAppInstanceIdProvider import com.tangem.core.decompose.navigation.DummyRouter import com.tangem.core.navigation.url.DummyUrlOpener import com.tangem.features.details.component.DetailsComponent @@ -18,9 +17,7 @@ internal class PreviewDetailsComponent : DetailsComponent { private val previewBlocks = runBlocking { ItemsBuilder( router = DummyRouter(), - urlOpener = DummyUrlOpener(), - appInstanceIdProvider = DummyAppInstanceIdProvider(), - ).buildAll(isWalletConnectAvailable = true, onSupportClick = {}) + ).buildAll(isWalletConnectAvailable = true, onSupportClick = {}, onBuyClick = {}) } private val previewFooter = DetailsFooterUM( diff --git a/features/details/impl/src/main/kotlin/com/tangem/features/details/model/DetailsModel.kt b/features/details/impl/src/main/kotlin/com/tangem/features/details/model/DetailsModel.kt index fd592c79b8..884ee4f78a 100644 --- a/features/details/impl/src/main/kotlin/com/tangem/features/details/model/DetailsModel.kt +++ b/features/details/impl/src/main/kotlin/com/tangem/features/details/model/DetailsModel.kt @@ -1,10 +1,12 @@ package com.tangem.features.details.model import arrow.core.getOrElse +import com.tangem.core.analytics.AppInstanceIdProvider import com.tangem.core.decompose.di.ComponentScoped 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.redux.LegacyAction import com.tangem.domain.redux.ReduxStateHolder import com.tangem.domain.walletconnect.CheckIsWalletConnectAvailableUseCase @@ -35,6 +37,8 @@ internal class DetailsModel @Inject constructor( private val appVersionProvider: AppVersionProvider, private val checkIsWalletConnectAvailableUseCase: CheckIsWalletConnectAvailableUseCase, private val router: Router, + private val urlOpener: UrlOpener, + private val appInstanceIdProvider: AppInstanceIdProvider, paramsContainer: ParamsContainer, private val getSelectedWalletSyncUseCase: GetSelectedWalletSyncUseCase, private val appStateHolder: ReduxStateHolder, @@ -74,6 +78,7 @@ internal class DetailsModel @Inject constructor( items.value = itemsBuilder.buildAll( isWalletConnectAvailable = isWalletConnectAvailable, onSupportClick = ::sendFeedback, + onBuyClick = ::onBuyClick, ) } @@ -86,6 +91,12 @@ internal class DetailsModel @Inject constructor( } } + private fun onBuyClick() { + modelScope.launch { + urlOpener.openUrl(buildBuyLink()) + } + } + private fun updateState(items: ImmutableList) { state.update { prevState -> prevState.copy(items = items) @@ -93,4 +104,14 @@ internal class DetailsModel @Inject constructor( } private fun getAppVersion(): String = "${appVersionProvider.versionName} (${appVersionProvider.versionCode})" + + private suspend fun buildBuyLink(): String { + return appInstanceIdProvider.getAppInstanceId()?.let { + "$BUY_TANGEM_URL&app_instance_id=$it" + } ?: BUY_TANGEM_URL + } + + private companion object { + const val BUY_TANGEM_URL = "https://buy.tangem.com/?utm_source=tangem&utm_medium=app" + } } \ No newline at end of file diff --git a/features/details/impl/src/main/kotlin/com/tangem/features/details/utils/ItemsBuilder.kt b/features/details/impl/src/main/kotlin/com/tangem/features/details/utils/ItemsBuilder.kt index 2f1093804f..70d3936e99 100644 --- a/features/details/impl/src/main/kotlin/com/tangem/features/details/utils/ItemsBuilder.kt +++ b/features/details/impl/src/main/kotlin/com/tangem/features/details/utils/ItemsBuilder.kt @@ -1,10 +1,8 @@ package com.tangem.features.details.utils import com.tangem.common.routing.AppRoute -import com.tangem.core.analytics.AppInstanceIdProvider import com.tangem.core.decompose.di.ComponentScoped import com.tangem.core.decompose.navigation.Router -import com.tangem.core.navigation.url.UrlOpener import com.tangem.core.ui.components.block.model.BlockUM import com.tangem.core.ui.extensions.resourceReference import com.tangem.core.ui.extensions.stringReference @@ -17,20 +15,19 @@ import kotlinx.collections.immutable.toImmutableList import javax.inject.Inject @ComponentScoped -internal class ItemsBuilder @Inject constructor( - private val router: Router, - private val urlOpener: UrlOpener, - private val appInstanceIdProvider: AppInstanceIdProvider, -) { +internal class ItemsBuilder @Inject constructor(private val router: Router) { - fun buildAll(isWalletConnectAvailable: Boolean, onSupportClick: () -> Unit): ImmutableList = - buildList { - buildWalletConnectBlock(isWalletConnectAvailable)?.let(::add) - buildUserWalletListBlock().let(::add) - buildShopBlock().let(::add) - buildSettingsBlock().let(::add) - buildSupportBlock(onSupportClick).let(::add) - }.toImmutableList() + fun buildAll( + isWalletConnectAvailable: Boolean, + onSupportClick: () -> Unit, + onBuyClick: () -> Unit, + ): ImmutableList = buildList { + buildWalletConnectBlock(isWalletConnectAvailable)?.let(::add) + buildUserWalletListBlock().let(::add) + buildShopBlock(onBuyClick).let(::add) + buildSettingsBlock().let(::add) + buildSupportBlock(onSupportClick).let(::add) + }.toImmutableList() private fun buildWalletConnectBlock(isWalletConnectAvailable: Boolean): DetailsItemUM? { return if (isWalletConnectAvailable) { @@ -44,7 +41,7 @@ internal class ItemsBuilder @Inject constructor( private fun buildUserWalletListBlock(): DetailsItemUM = DetailsItemUM.UserWalletList - private fun buildShopBlock(): DetailsItemUM = DetailsItemUM.Basic( + private fun buildShopBlock(onBuyClick: () -> Unit): DetailsItemUM = DetailsItemUM.Basic( id = "shop", items = persistentListOf( DetailsItemUM.Basic.Item( @@ -52,7 +49,7 @@ internal class ItemsBuilder @Inject constructor( block = BlockUM( text = resourceReference(R.string.details_buy_wallet), iconRes = R.drawable.ic_tangem_24, - onClick = { urlOpener.openUrl(buildBuyLink()) }, + onClick = onBuyClick, ), ), ), @@ -104,14 +101,4 @@ internal class ItemsBuilder @Inject constructor( ), ), ) - - private fun buildBuyLink(): String { - return appInstanceIdProvider.getAppInstanceIdSync()?.let { - "$BUY_TANGEM_URL&app_instance_id=$it" - } ?: BUY_TANGEM_URL - } - - private companion object { - const val BUY_TANGEM_URL = "https://buy.tangem.com/?utm_source=tangem&utm_medium=app" - } } \ No newline at end of file