mirror of
https://github.com/vitorpamplona/amethyst.git
synced 2025-09-29 04:52:31 +02:00
Moves coroutine of NIP-05 verification to the viewModel
This commit is contained in:
@@ -34,7 +34,6 @@ import com.vitorpamplona.amethyst.R
|
|||||||
import com.vitorpamplona.amethyst.model.AddressableNote
|
import com.vitorpamplona.amethyst.model.AddressableNote
|
||||||
import com.vitorpamplona.amethyst.model.Note
|
import com.vitorpamplona.amethyst.model.Note
|
||||||
import com.vitorpamplona.amethyst.model.User
|
import com.vitorpamplona.amethyst.model.User
|
||||||
import com.vitorpamplona.amethyst.service.Nip05Verifier
|
|
||||||
import com.vitorpamplona.amethyst.ui.note.LoadAddressableNote
|
import com.vitorpamplona.amethyst.ui.note.LoadAddressableNote
|
||||||
import com.vitorpamplona.amethyst.ui.note.LoadStatuses
|
import com.vitorpamplona.amethyst.ui.note.LoadStatuses
|
||||||
import com.vitorpamplona.amethyst.ui.note.NIP05CheckingIcon
|
import com.vitorpamplona.amethyst.ui.note.NIP05CheckingIcon
|
||||||
@@ -55,13 +54,11 @@ import com.vitorpamplona.quartz.events.AddressableEvent
|
|||||||
import com.vitorpamplona.quartz.events.UserMetadata
|
import com.vitorpamplona.quartz.events.UserMetadata
|
||||||
import com.vitorpamplona.quartz.utils.TimeUtils
|
import com.vitorpamplona.quartz.utils.TimeUtils
|
||||||
import kotlinx.collections.immutable.ImmutableList
|
import kotlinx.collections.immutable.ImmutableList
|
||||||
import kotlinx.coroutines.Dispatchers
|
|
||||||
import kotlinx.coroutines.delay
|
import kotlinx.coroutines.delay
|
||||||
import kotlinx.coroutines.launch
|
|
||||||
import kotlin.time.Duration.Companion.seconds
|
import kotlin.time.Duration.Companion.seconds
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun nip05VerificationAsAState(userMetadata: UserMetadata, pubkeyHex: String): MutableState<Boolean?> {
|
fun nip05VerificationAsAState(userMetadata: UserMetadata, pubkeyHex: String, accountViewModel: AccountViewModel): MutableState<Boolean?> {
|
||||||
val nip05Verified = remember(userMetadata.nip05) {
|
val nip05Verified = remember(userMetadata.nip05) {
|
||||||
// starts with null if must verify or already filled in if verified in the last hour
|
// starts with null if must verify or already filled in if verified in the last hour
|
||||||
val default = if ((userMetadata.nip05LastVerificationTime ?: 0) > TimeUtils.oneHourAgo()) {
|
val default = if ((userMetadata.nip05LastVerificationTime ?: 0) > TimeUtils.oneHourAgo()) {
|
||||||
@@ -75,37 +72,9 @@ fun nip05VerificationAsAState(userMetadata: UserMetadata, pubkeyHex: String): Mu
|
|||||||
|
|
||||||
if (nip05Verified.value == null) {
|
if (nip05Verified.value == null) {
|
||||||
LaunchedEffect(key1 = userMetadata.nip05) {
|
LaunchedEffect(key1 = userMetadata.nip05) {
|
||||||
launch(Dispatchers.IO) {
|
accountViewModel.verifyNip05(userMetadata, pubkeyHex) { newVerificationStatus ->
|
||||||
userMetadata.nip05?.ifBlank { null }?.let { nip05 ->
|
if (nip05Verified.value != newVerificationStatus) {
|
||||||
Nip05Verifier().verifyNip05(
|
nip05Verified.value = newVerificationStatus
|
||||||
nip05,
|
|
||||||
onSuccess = {
|
|
||||||
// Marks user as verified
|
|
||||||
if (it == pubkeyHex) {
|
|
||||||
userMetadata.nip05Verified = true
|
|
||||||
userMetadata.nip05LastVerificationTime = TimeUtils.now()
|
|
||||||
|
|
||||||
if (nip05Verified.value != true) {
|
|
||||||
nip05Verified.value = true
|
|
||||||
}
|
|
||||||
} else {
|
|
||||||
userMetadata.nip05Verified = false
|
|
||||||
userMetadata.nip05LastVerificationTime = 0
|
|
||||||
|
|
||||||
if (nip05Verified.value != false) {
|
|
||||||
nip05Verified.value = false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
onError = {
|
|
||||||
userMetadata.nip05LastVerificationTime = 0
|
|
||||||
userMetadata.nip05Verified = false
|
|
||||||
|
|
||||||
if (nip05Verified.value != false) {
|
|
||||||
nip05Verified.value = false
|
|
||||||
}
|
|
||||||
}
|
|
||||||
)
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -156,7 +125,7 @@ private fun VerifyAndDisplayNIP05OrStatusLine(
|
|||||||
Column(modifier = columnModifier) {
|
Column(modifier = columnModifier) {
|
||||||
Row(verticalAlignment = Alignment.CenterVertically) {
|
Row(verticalAlignment = Alignment.CenterVertically) {
|
||||||
if (nip05 != null) {
|
if (nip05 != null) {
|
||||||
val nip05Verified = nip05VerificationAsAState(baseUser.info!!, baseUser.pubkeyHex)
|
val nip05Verified = nip05VerificationAsAState(baseUser.info!!, baseUser.pubkeyHex, accountViewModel)
|
||||||
|
|
||||||
if (nip05Verified.value != true) {
|
if (nip05Verified.value != true) {
|
||||||
DisplayNIP05(nip05, nip05Verified)
|
DisplayNIP05(nip05, nip05Verified)
|
||||||
@@ -358,12 +327,12 @@ private fun NIP05VerifiedSymbol(nip05Verified: MutableState<Boolean?>, modifier:
|
|||||||
}
|
}
|
||||||
|
|
||||||
@Composable
|
@Composable
|
||||||
fun DisplayNip05ProfileStatus(user: User) {
|
fun DisplayNip05ProfileStatus(user: User, accountViewModel: AccountViewModel) {
|
||||||
val uri = LocalUriHandler.current
|
val uri = LocalUriHandler.current
|
||||||
|
|
||||||
user.nip05()?.let { nip05 ->
|
user.nip05()?.let { nip05 ->
|
||||||
if (nip05.split("@").size <= 2) {
|
if (nip05.split("@").size <= 2) {
|
||||||
val nip05Verified = nip05VerificationAsAState(user.info!!, user.pubkeyHex)
|
val nip05Verified = nip05VerificationAsAState(user.info!!, user.pubkeyHex, accountViewModel)
|
||||||
Row(verticalAlignment = Alignment.CenterVertically) {
|
Row(verticalAlignment = Alignment.CenterVertically) {
|
||||||
NIP05VerifiedSymbol(nip05Verified, Size16Modifier)
|
NIP05VerifiedSymbol(nip05Verified, Size16Modifier)
|
||||||
var domainPadStart = 5.dp
|
var domainPadStart = 5.dp
|
||||||
|
@@ -21,6 +21,7 @@ import com.vitorpamplona.amethyst.model.Note
|
|||||||
import com.vitorpamplona.amethyst.model.UrlCachedPreviewer
|
import com.vitorpamplona.amethyst.model.UrlCachedPreviewer
|
||||||
import com.vitorpamplona.amethyst.model.User
|
import com.vitorpamplona.amethyst.model.User
|
||||||
import com.vitorpamplona.amethyst.model.UserState
|
import com.vitorpamplona.amethyst.model.UserState
|
||||||
|
import com.vitorpamplona.amethyst.service.Nip05Verifier
|
||||||
import com.vitorpamplona.amethyst.service.OnlineChecker
|
import com.vitorpamplona.amethyst.service.OnlineChecker
|
||||||
import com.vitorpamplona.amethyst.service.lnurl.LightningAddressResolver
|
import com.vitorpamplona.amethyst.service.lnurl.LightningAddressResolver
|
||||||
import com.vitorpamplona.amethyst.ui.components.UrlPreviewState
|
import com.vitorpamplona.amethyst.ui.components.UrlPreviewState
|
||||||
@@ -35,6 +36,8 @@ import com.vitorpamplona.quartz.events.LnZapRequestEvent
|
|||||||
import com.vitorpamplona.quartz.events.PayInvoiceErrorResponse
|
import com.vitorpamplona.quartz.events.PayInvoiceErrorResponse
|
||||||
import com.vitorpamplona.quartz.events.ReportEvent
|
import com.vitorpamplona.quartz.events.ReportEvent
|
||||||
import com.vitorpamplona.quartz.events.SealedGossipEvent
|
import com.vitorpamplona.quartz.events.SealedGossipEvent
|
||||||
|
import com.vitorpamplona.quartz.events.UserMetadata
|
||||||
|
import com.vitorpamplona.quartz.utils.TimeUtils
|
||||||
import kotlinx.collections.immutable.ImmutableSet
|
import kotlinx.collections.immutable.ImmutableSet
|
||||||
import kotlinx.collections.immutable.persistentSetOf
|
import kotlinx.collections.immutable.persistentSetOf
|
||||||
import kotlinx.collections.immutable.toImmutableSet
|
import kotlinx.collections.immutable.toImmutableSet
|
||||||
@@ -494,6 +497,36 @@ class AccountViewModel(val account: Account) : ViewModel() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun verifyNip05(userMetadata: UserMetadata, pubkeyHex: String, onResult: (Boolean) -> Unit) {
|
||||||
|
val nip05 = userMetadata.nip05?.ifBlank { null } ?: return
|
||||||
|
|
||||||
|
viewModelScope.launch(Dispatchers.IO) {
|
||||||
|
Nip05Verifier().verifyNip05(
|
||||||
|
nip05,
|
||||||
|
onSuccess = {
|
||||||
|
// Marks user as verified
|
||||||
|
if (it == pubkeyHex) {
|
||||||
|
userMetadata.nip05Verified = true
|
||||||
|
userMetadata.nip05LastVerificationTime = TimeUtils.now()
|
||||||
|
|
||||||
|
onResult(userMetadata.nip05Verified)
|
||||||
|
} else {
|
||||||
|
userMetadata.nip05Verified = false
|
||||||
|
userMetadata.nip05LastVerificationTime = 0
|
||||||
|
|
||||||
|
onResult(userMetadata.nip05Verified)
|
||||||
|
}
|
||||||
|
},
|
||||||
|
onError = {
|
||||||
|
userMetadata.nip05LastVerificationTime = 0
|
||||||
|
userMetadata.nip05Verified = false
|
||||||
|
|
||||||
|
onResult(userMetadata.nip05Verified)
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class Factory(val account: Account) : ViewModelProvider.Factory {
|
class Factory(val account: Account) : ViewModelProvider.Factory {
|
||||||
override fun <AccountViewModel : ViewModel> create(modelClass: Class<AccountViewModel>): AccountViewModel {
|
override fun <AccountViewModel : ViewModel> create(modelClass: Class<AccountViewModel>): AccountViewModel {
|
||||||
return AccountViewModel(account) as AccountViewModel
|
return AccountViewModel(account) as AccountViewModel
|
||||||
|
@@ -920,7 +920,7 @@ private fun DrawAdditionalInfo(
|
|||||||
|
|
||||||
DisplayBadges(baseUser, nav)
|
DisplayBadges(baseUser, nav)
|
||||||
|
|
||||||
DisplayNip05ProfileStatus(user)
|
DisplayNip05ProfileStatus(user, accountViewModel)
|
||||||
|
|
||||||
val website = user.info?.website
|
val website = user.info?.website
|
||||||
if (!website.isNullOrEmpty()) {
|
if (!website.isNullOrEmpty()) {
|
||||||
|
Reference in New Issue
Block a user