From 6c09e47e4f902ba4d1e15b2c2a16b04a227fefcf Mon Sep 17 00:00:00 2001 From: Vitor Pamplona Date: Fri, 25 Aug 2023 17:26:47 -0400 Subject: [PATCH] Moves coroutine of NIP-05 verification to the viewModel --- .../ui/note/NIP05VerificationDisplay.kt | 45 +++---------------- .../ui/screen/loggedIn/AccountViewModel.kt | 33 ++++++++++++++ .../ui/screen/loggedIn/ProfileScreen.kt | 2 +- 3 files changed, 41 insertions(+), 39 deletions(-) diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NIP05VerificationDisplay.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NIP05VerificationDisplay.kt index e18db8176..db9e3fcad 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NIP05VerificationDisplay.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/NIP05VerificationDisplay.kt @@ -34,7 +34,6 @@ import com.vitorpamplona.amethyst.R import com.vitorpamplona.amethyst.model.AddressableNote import com.vitorpamplona.amethyst.model.Note 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.LoadStatuses 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.utils.TimeUtils import kotlinx.collections.immutable.ImmutableList -import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.delay -import kotlinx.coroutines.launch import kotlin.time.Duration.Companion.seconds @Composable -fun nip05VerificationAsAState(userMetadata: UserMetadata, pubkeyHex: String): MutableState { +fun nip05VerificationAsAState(userMetadata: UserMetadata, pubkeyHex: String, accountViewModel: AccountViewModel): MutableState { val nip05Verified = remember(userMetadata.nip05) { // starts with null if must verify or already filled in if verified in the last hour val default = if ((userMetadata.nip05LastVerificationTime ?: 0) > TimeUtils.oneHourAgo()) { @@ -75,37 +72,9 @@ fun nip05VerificationAsAState(userMetadata: UserMetadata, pubkeyHex: String): Mu if (nip05Verified.value == null) { LaunchedEffect(key1 = userMetadata.nip05) { - launch(Dispatchers.IO) { - userMetadata.nip05?.ifBlank { null }?.let { nip05 -> - Nip05Verifier().verifyNip05( - 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 - } - } - ) + accountViewModel.verifyNip05(userMetadata, pubkeyHex) { newVerificationStatus -> + if (nip05Verified.value != newVerificationStatus) { + nip05Verified.value = newVerificationStatus } } } @@ -156,7 +125,7 @@ private fun VerifyAndDisplayNIP05OrStatusLine( Column(modifier = columnModifier) { Row(verticalAlignment = Alignment.CenterVertically) { if (nip05 != null) { - val nip05Verified = nip05VerificationAsAState(baseUser.info!!, baseUser.pubkeyHex) + val nip05Verified = nip05VerificationAsAState(baseUser.info!!, baseUser.pubkeyHex, accountViewModel) if (nip05Verified.value != true) { DisplayNIP05(nip05, nip05Verified) @@ -358,12 +327,12 @@ private fun NIP05VerifiedSymbol(nip05Verified: MutableState, modifier: } @Composable -fun DisplayNip05ProfileStatus(user: User) { +fun DisplayNip05ProfileStatus(user: User, accountViewModel: AccountViewModel) { val uri = LocalUriHandler.current user.nip05()?.let { nip05 -> if (nip05.split("@").size <= 2) { - val nip05Verified = nip05VerificationAsAState(user.info!!, user.pubkeyHex) + val nip05Verified = nip05VerificationAsAState(user.info!!, user.pubkeyHex, accountViewModel) Row(verticalAlignment = Alignment.CenterVertically) { NIP05VerifiedSymbol(nip05Verified, Size16Modifier) var domainPadStart = 5.dp diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/AccountViewModel.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/AccountViewModel.kt index 5300f38a4..4194e9d45 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/AccountViewModel.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/AccountViewModel.kt @@ -21,6 +21,7 @@ import com.vitorpamplona.amethyst.model.Note import com.vitorpamplona.amethyst.model.UrlCachedPreviewer import com.vitorpamplona.amethyst.model.User import com.vitorpamplona.amethyst.model.UserState +import com.vitorpamplona.amethyst.service.Nip05Verifier import com.vitorpamplona.amethyst.service.OnlineChecker import com.vitorpamplona.amethyst.service.lnurl.LightningAddressResolver 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.ReportEvent 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.persistentSetOf 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 { override fun create(modelClass: Class): AccountViewModel { return AccountViewModel(account) as AccountViewModel diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ProfileScreen.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ProfileScreen.kt index 0654d3be9..166a1ef4a 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ProfileScreen.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/screen/loggedIn/ProfileScreen.kt @@ -920,7 +920,7 @@ private fun DrawAdditionalInfo( DisplayBadges(baseUser, nav) - DisplayNip05ProfileStatus(user) + DisplayNip05ProfileStatus(user, accountViewModel) val website = user.info?.website if (!website.isNullOrEmpty()) {