diff --git a/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt b/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt index 730c807f8..8684a6258 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/LocalPreferences.kt @@ -340,7 +340,7 @@ object LocalPreferences { putString( PrefKeys.PENDING_ATTESTATIONS, - Event.mapper.writeValueAsString(account.pendingAttestations), + Event.mapper.writeValueAsString(account.pendingAttestations.value), ) } .apply() @@ -604,7 +604,7 @@ object LocalPreferences { filterSpamFromStrangers = filterSpam, lastReadPerRoute = lastReadPerRoute, hasDonatedInVersion = hasDonatedInVersion, - pendingAttestations = pendingAttestations ?: emptyMap(), + pendingAttestations = MutableStateFlow(pendingAttestations ?: emptyMap()), ) // Loads from DB diff --git a/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt b/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt index eb16da414..afd7dccaa 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/model/Account.kt @@ -126,6 +126,7 @@ import kotlinx.coroutines.flow.flattenMerge import kotlinx.coroutines.flow.mapLatest import kotlinx.coroutines.flow.stateIn import kotlinx.coroutines.flow.transformLatest +import kotlinx.coroutines.flow.update import kotlinx.coroutines.launch import kotlinx.coroutines.suspendCancellableCoroutine import kotlinx.coroutines.withContext @@ -202,7 +203,7 @@ class Account( var filterSpamFromStrangers: Boolean = true, var lastReadPerRoute: Map = mapOf(), var hasDonatedInVersion: Set = setOf(), - var pendingAttestations: Map = mapOf(), + var pendingAttestations: MutableStateFlow> = MutableStateFlow>(mapOf()), val scope: CoroutineScope = Amethyst.instance.applicationIOScope, ) { var transientHiddenUsers: ImmutableSet = persistentSetOf() @@ -1014,9 +1015,9 @@ class Account( } suspend fun updateAttestations() { - Log.d("Pending Attestations", "Updating ${pendingAttestations.size} pending attestations") + Log.d("Pending Attestations", "Updating ${pendingAttestations.value.size} pending attestations") - pendingAttestations.toMap().forEach { pair -> + pendingAttestations.value.forEach { pair -> val newAttestation = OtsEvent.upgrade(pair.value, pair.key) if (pair.value != newAttestation) { @@ -1024,7 +1025,9 @@ class Account( LocalCache.justConsume(it, null) Client.send(it) - pendingAttestations = pendingAttestations - pair.key + pendingAttestations.update { + it - pair.key + } } } } @@ -1032,7 +1035,7 @@ class Account( fun hasPendingAttestations(note: Note): Boolean { val id = note.event?.id() ?: note.idHex - return pendingAttestations.get(id) != null + return pendingAttestations.value[id] != null } fun timestamp(note: Note) { @@ -1041,7 +1044,9 @@ class Account( val id = note.event?.id() ?: note.idHex - pendingAttestations = pendingAttestations + Pair(id, OtsEvent.stamp(id)) + pendingAttestations.update { + it + Pair(id, OtsEvent.stamp(id)) + } saveable.invalidateData() } diff --git a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/Loaders.kt b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/Loaders.kt index 48a8ee08e..1e2d605e9 100644 --- a/app/src/main/java/com/vitorpamplona/amethyst/ui/note/Loaders.kt +++ b/app/src/main/java/com/vitorpamplona/amethyst/ui/note/Loaders.kt @@ -29,6 +29,7 @@ import androidx.compose.runtime.produceState import androidx.compose.runtime.remember import androidx.compose.runtime.setValue import androidx.compose.ui.platform.LocalContext +import androidx.lifecycle.compose.collectAsStateWithLifecycle import com.fonfon.kgeohash.toGeoHash import com.vitorpamplona.amethyst.model.AddressableNote import com.vitorpamplona.amethyst.model.Channel @@ -176,8 +177,10 @@ fun LoadOts( (earliestDate as? GenericLoadable.Loaded)?.let { whenConfirmed(it.loaded) } ?: run { - val account = accountViewModel.account.saveable.observeAsState() - if (account.value?.account?.hasPendingAttestations(note) == true) { + val pendingAttestations by accountViewModel.account.pendingAttestations.collectAsStateWithLifecycle() + val id = note.event?.id() ?: note.idHex + + if (pendingAttestations[id] != null) { whenPending() } }