Updated on 2026-08-14

This commit is contained in:
Tangem 2025-08-20 11:43:43 +04:00
parent eb07388729
commit 3f6bcd3a0e
23 changed files with 226 additions and 101 deletions

View file

@ -1,57 +1,41 @@
package com.tangem.features.kyc
import com.sumsub.sns.core.SNSMobileSDK
import com.sumsub.sns.core.data.listener.SNSCompleteHandler
import com.sumsub.sns.core.data.listener.TokenExpirationHandler
import com.sumsub.sns.core.data.model.SNSCompletionResult
import com.sumsub.sns.core.data.model.SNSInitConfig
import com.sumsub.sns.core.data.model.SNSSDKState
import com.tangem.core.decompose.context.AppComponentContext
import com.tangem.domain.pay.repository.KycRepository
import com.tangem.domain.models.wallet.UserWalletId
import com.tangem.features.kyc.theme.TangemSNSTheme
import com.tangem.core.decompose.model.getOrCreateModel
import com.tangem.features.kyc.theme.TangemSNSIconHandler
import com.tangem.features.kyc.theme.TangemSNSTheme
import dagger.assisted.Assisted
import dagger.assisted.AssistedFactory
import dagger.assisted.AssistedInject
import kotlinx.coroutines.launch
import kotlinx.coroutines.runBlocking
import java.util.Locale
class DefaultKycComponent @AssistedInject constructor(
@Assisted appComponentContext: AppComponentContext,
private val kycRepositoryFactory: KycRepository.Factory,
) : KycComponent, AppComponentContext by appComponentContext {
private val kycRepository = kycRepositoryFactory.create(UserWalletId("0FFFFF"))
private val model: DefaultKycModel = getOrCreateModel()
override fun launch() {
override fun launch(params: KycComponent.Params) {
componentScope.launch {
val startInfo = kycRepository.getKycStartInfo().getOrNull() ?: return@launch
val tokenExpirationHandler = object : TokenExpirationHandler {
override fun onTokenExpired(): String? {
val newToken = runBlocking { kycRepository.getKycStartInfo().getOrNull()?.token }
return newToken
model.uiState.collect {
it?.let { startInfo ->
val tokenExpirationHandler = object : TokenExpirationHandler {
override fun onTokenExpired() = ""
}
val snsSdk = SNSMobileSDK.Builder(activity)
.withAccessToken(accessToken = startInfo.token, onTokenExpiration = tokenExpirationHandler)
.withTheme(TangemSNSTheme.theme(activity))
.withIconHandler(TangemSNSIconHandler())
.withLocale(Locale("en"))
.build()
snsSdk.launch()
}
}
val snsSdk = SNSMobileSDK.Builder(activity)
.withAccessToken(accessToken = startInfo.token, onTokenExpiration = tokenExpirationHandler)
.withConf(SNSInitConfig(strings = mapOf()))
.withTheme(TangemSNSTheme.theme(activity))
.withIconHandler(TangemSNSIconHandler())
.withLocale(Locale("en"))
.withCompleteHandler(
object : SNSCompleteHandler {
override fun onComplete(result: SNSCompletionResult, state: SNSSDKState) {
}
},
)
.build()
snsSdk.launch()
}
model.getKycToken(params)
}
@AssistedFactory

View file

@ -0,0 +1,32 @@
package com.tangem.features.kyc
import androidx.compose.runtime.Stable
import com.tangem.core.decompose.di.ModelScoped
import com.tangem.core.decompose.model.Model
import com.tangem.domain.pay.KycStartInfo
import com.tangem.domain.pay.repository.KycRepository
import com.tangem.utils.coroutines.CoroutineDispatcherProvider
import kotlinx.coroutines.flow.MutableStateFlow
import kotlinx.coroutines.flow.asStateFlow
import kotlinx.coroutines.launch
import javax.inject.Inject
@Stable
@ModelScoped
class DefaultKycModel @Inject constructor(
override val dispatchers: CoroutineDispatcherProvider,
kycRepositoryFactory: KycRepository.Factory,
) : Model() {
private val kycRepository = kycRepositoryFactory.create()
private val _uiState: MutableStateFlow<KycStartInfo?> = MutableStateFlow(null)
val uiState = _uiState.asStateFlow()
fun getKycToken(params: KycComponent.Params) {
modelScope.launch {
kycRepository.getKycStartInfo(address = params.targetAddress, cardId = params.cardId).getOrNull()
?.let { _uiState.emit(it) }
}
}
}

View file

@ -1,11 +1,16 @@
package com.tangem.features.kyc.di
import com.tangem.core.decompose.di.ModelComponent
import com.tangem.core.decompose.model.Model
import com.tangem.features.kyc.DefaultKycComponent
import com.tangem.features.kyc.DefaultKycModel
import com.tangem.features.kyc.KycComponent
import dagger.Binds
import dagger.Module
import dagger.hilt.InstallIn
import dagger.hilt.components.SingletonComponent
import dagger.multibindings.ClassKey
import dagger.multibindings.IntoMap
@Module
@InstallIn(SingletonComponent::class)
@ -13,4 +18,13 @@ internal interface FeatureModule {
@Binds
fun bindComponentFactory(impl: DefaultKycComponent.Factory): KycComponent.Factory
}
@Module
@InstallIn(ModelComponent::class)
internal interface ModelModule {
@Binds
@IntoMap
@ClassKey(DefaultKycModel::class)
fun provideModel(model: DefaultKycModel): Model
}