Updated on 2026-08-14

This commit is contained in:
Tangem 2024-09-13 11:58:13 +03:00
parent f18338ff44
commit 9f08cdbd07
4 changed files with 42 additions and 32 deletions

View file

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

View file

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

View file

@ -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<DetailsItemUM>) {
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"
}
}

View file

@ -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<DetailsItemUM> =
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<DetailsItemUM> = 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"
}
}