Updated on 2026-08-14

This commit is contained in:
Tangem 2023-05-15 18:26:35 +03:00
commit 205f6b32de
7 changed files with 43 additions and 52 deletions

View file

@ -14,7 +14,6 @@ import com.tangem.tap.common.extensions.dispatchOnMain
import com.tangem.tap.common.extensions.setContext
import com.tangem.tap.common.redux.global.GlobalAction
import com.tangem.tap.domain.model.UserWallet
import com.tangem.tap.domain.model.builders.UserWalletIdBuilder
import com.tangem.tap.domain.walletStores.WalletStoresError
import com.tangem.tap.features.details.redux.walletconnect.WalletConnectAction
import com.tangem.tap.features.disclaimer.createDisclaimer
@ -36,12 +35,6 @@ class TapWalletManager {
}
suspend fun onWalletSelected(userWallet: UserWallet, refresh: Boolean, sendAnalyticsEvent: Boolean) {
// do nothing if its the same wallet
store.state.globalState.scanResponse?.let {
val userWalletId = UserWalletIdBuilder.scanResponse(it).build()
if (userWalletId == userWallet.walletId) return
}
Analytics.setContext(userWallet.scanResponse)
if (sendAnalyticsEvent) {
Analytics.send(Basic.WalletOpened())

View file

@ -7,17 +7,10 @@ import com.tangem.core.analytics.Analytics
import com.tangem.domain.common.extensions.withMainContext
import com.tangem.domain.common.util.twinsIsTwinned
import com.tangem.domain.models.scan.ScanResponse
import com.tangem.tap.DELAY_SDK_DIALOG_CLOSE
import com.tangem.tap.*
import com.tangem.tap.common.analytics.events.AnalyticsParam
import com.tangem.tap.common.analytics.events.Onboarding
import com.tangem.tap.common.extensions.dispatchDebugErrorNotification
import com.tangem.tap.common.extensions.dispatchDialogShow
import com.tangem.tap.common.extensions.dispatchErrorNotification
import com.tangem.tap.common.extensions.dispatchOnMain
import com.tangem.tap.common.extensions.dispatchOpenUrl
import com.tangem.tap.common.extensions.getAddressData
import com.tangem.tap.common.extensions.getTopUpUrl
import com.tangem.tap.common.extensions.onUserWalletSelected
import com.tangem.tap.common.extensions.*
import com.tangem.tap.common.postUi
import com.tangem.tap.common.redux.AppDialog
import com.tangem.tap.common.redux.AppState
@ -36,10 +29,6 @@ import com.tangem.tap.features.wallet.models.Currency
import com.tangem.tap.features.wallet.redux.ProgressState
import com.tangem.tap.features.wallet.redux.WalletAction
import com.tangem.tap.features.wallet.redux.models.WalletDialog
import com.tangem.tap.preferencesStorage
import com.tangem.tap.scope
import com.tangem.tap.store
import com.tangem.tap.userWalletsListManager
import kotlinx.coroutines.delay
import kotlinx.coroutines.launch
import org.rekotlin.Action
@ -130,20 +119,9 @@ private fun handle(action: Action, dispatch: DispatchFunction) {
Analytics.send(Onboarding.Twins.ScreenOpened())
preferencesStorage.saveTwinsOnboardingShown()
}
TwinCardsStep.CreateFirstWallet -> {
is TwinCardsStep.CreateFirstWallet -> {
Analytics.send(Onboarding.CreateWallet.ScreenOpened())
Analytics.send(Onboarding.Twins.SetupStarted())
scope.launch {
userWalletsListManager.delete(
listOfNotNull(UserWalletIdBuilder.scanResponse(getScanResponse()).build()),
)
userWalletsListManager.selectedUserWalletSync?.let { selectedWallet ->
store.onUserWalletSelected(
userWallet = selectedWallet,
sendAnalyticsEvent = false,
)
}
}
}
TwinCardsStep.TopUpWallet -> {
Analytics.send(Onboarding.Topup.ScreenOpened())
@ -170,6 +148,12 @@ private fun handle(action: Action, dispatch: DispatchFunction) {
scope.launch {
when (val result = manager.createFirstWallet(action.initialMessage)) {
is CompletionResult.Success -> {
// remove wallet only after first step of retwin
scope.launch {
userWalletsListManager.delete(
listOfNotNull(UserWalletIdBuilder.scanResponse(getScanResponse()).build()),
)
}
Analytics.send(Onboarding.CreateWallet.WalletCreatedSuccessfully())
startCardActivation(result.data.cardId)
delay(DELAY_SDK_DIALOG_CLOSE)

View file

@ -1,18 +1,7 @@
package com.tangem.datasource.api.tangemTech
import com.tangem.datasource.api.tangemTech.models.CoinsResponse
import com.tangem.datasource.api.tangemTech.models.CurrenciesResponse
import com.tangem.datasource.api.tangemTech.models.GeoResponse
import com.tangem.datasource.api.tangemTech.models.RatesResponse
import com.tangem.datasource.api.tangemTech.models.ReferralResponse
import com.tangem.datasource.api.tangemTech.models.StartReferralBody
import com.tangem.datasource.api.tangemTech.models.UserTokensResponse
import retrofit2.http.Body
import retrofit2.http.GET
import retrofit2.http.POST
import retrofit2.http.PUT
import retrofit2.http.Path
import retrofit2.http.Query
import com.tangem.datasource.api.tangemTech.models.*
import retrofit2.http.*
/**
* Interface of Tangem Tech API
@ -49,9 +38,17 @@ interface TangemTechApi {
/** Returns referral status by [walletId] */
@GET("referral/{walletId}")
suspend fun getReferralStatus(@Path("walletId") walletId: String): ReferralResponse
suspend fun getReferralStatus(
@Header("card_public_key") cardPublicKey: String,
@Header("card_id") cardId: String,
@Path("walletId") walletId: String,
): ReferralResponse
/** Make user referral, requires [StartReferralBody] */
@POST("referral")
suspend fun startReferral(@Body startReferralBody: StartReferralBody): ReferralResponse
suspend fun startReferral(
@Header("card_public_key") cardPublicKey: String,
@Header("card_id") cardId: String,
@Body startReferralBody: StartReferralBody,
): ReferralResponse
}

View file

@ -6,7 +6,6 @@ import com.tangem.datasource.api.tangemTech.TangemTechApi
import com.tangem.datasource.utils.RequestHeader.*
import com.tangem.datasource.utils.addHeaders
import com.tangem.datasource.utils.allowLogging
import com.tangem.lib.auth.AuthProvider
import dagger.Module
import dagger.Provides
import dagger.hilt.InstallIn
@ -22,7 +21,7 @@ class NetworkModule {
@Provides
@Singleton
fun provideTangemTechApi(authProvider: AuthProvider, @NetworkMoshi moshi: Moshi): TangemTechApi {
fun provideTangemTechApi(@NetworkMoshi moshi: Moshi): TangemTechApi {
return Retrofit.Builder()
.addConverterFactory(MoshiConverterFactory.create(moshi))
.baseUrl(PROD_TANGEM_TECH_BASE_URL)
@ -30,7 +29,8 @@ class NetworkModule {
OkHttpClient.Builder()
.addHeaders(
CacheControlHeader,
AuthenticationHeader(authProvider),
// TODO("refactor header init") get auth data after biometric auth to avoid race condition
// AuthenticationHeader(authProvider),
)
.allowLogging()
.build(),

View file

@ -12,6 +12,10 @@ dependencies {
implementation(project(":core:datasource"))
implementation(project(":core:utils"))
implementation(project(":features:referral:domain"))
/** Libs */
implementation(project(":libs:auth"))
/** Time */
implementation(deps.jodatime)

View file

@ -6,6 +6,7 @@ import com.tangem.datasource.demo.DemoModeDatasource
import com.tangem.feature.referral.converters.ReferralConverter
import com.tangem.feature.referral.domain.ReferralRepository
import com.tangem.feature.referral.domain.models.ReferralData
import com.tangem.lib.auth.AuthProvider
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import kotlinx.coroutines.withContext
import javax.inject.Inject
@ -15,6 +16,7 @@ internal class ReferralRepositoryImpl @Inject constructor(
private val referralConverter: ReferralConverter,
private val coroutineDispatcher: CoroutineDispatcherProvider,
private val demoModeDatasource: DemoModeDatasource,
private val authProvider: AuthProvider,
) : ReferralRepository {
override val isDemoMode: Boolean
@ -22,7 +24,13 @@ internal class ReferralRepositoryImpl @Inject constructor(
override suspend fun getReferralStatus(walletId: String): ReferralData {
return withContext(coroutineDispatcher.io) {
referralConverter.convert(referralApi.getReferralStatus(walletId))
referralConverter.convert(
referralApi.getReferralStatus(
cardPublicKey = authProvider.getCardPublicKey(),
cardId = authProvider.getCardId(),
walletId = walletId,
),
)
}
}
@ -35,7 +43,9 @@ internal class ReferralRepositoryImpl @Inject constructor(
return withContext(coroutineDispatcher.io) {
referralConverter.convert(
referralApi.startReferral(
StartReferralBody(
cardPublicKey = authProvider.getCardPublicKey(),
cardId = authProvider.getCardId(),
startReferralBody = StartReferralBody(
walletId = walletId,
networkId = networkId,
tokenId = tokenId,

View file

@ -5,6 +5,7 @@ import com.tangem.datasource.demo.DemoModeDatasource
import com.tangem.feature.referral.converters.ReferralConverter
import com.tangem.feature.referral.data.ReferralRepositoryImpl
import com.tangem.feature.referral.domain.ReferralRepository
import com.tangem.lib.auth.AuthProvider
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import dagger.Module
import dagger.Provides
@ -23,12 +24,14 @@ class ReferralRepositoryModule {
referralConverter: ReferralConverter,
coroutineDispatcherProvider: CoroutineDispatcherProvider,
demoModeDatasource: DemoModeDatasource,
authProvider: AuthProvider,
): ReferralRepository {
return ReferralRepositoryImpl(
referralApi = tangemTechApi,
referralConverter = referralConverter,
coroutineDispatcher = coroutineDispatcherProvider,
demoModeDatasource = demoModeDatasource,
authProvider = authProvider,
)
}
}