Updated on 2026-08-14
This commit is contained in:
parent
eb07388729
commit
3f6bcd3a0e
23 changed files with 226 additions and 101 deletions
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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) }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
@ -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
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue