Merge pull request 'chore: improve loading state handling' (#38) from fix-loading-state into master

Reviewed-on: #38
This commit was merged in pull request #38.
This commit is contained in:
2026-07-07 04:09:28 +00:00
7 changed files with 10 additions and 21 deletions

View File

@@ -1,8 +1,6 @@
package su.reya.coop.screens
import androidx.compose.runtime.Composable
import androidx.compose.runtime.rememberCoroutineScope
import kotlinx.coroutines.launch
import su.reya.coop.LocalAuthViewModel
import su.reya.coop.LocalNavigator
import su.reya.coop.Screen
@@ -12,17 +10,14 @@ import su.reya.coop.shared.ProfileEditor
fun NewIdentityScreen() {
val authViewModel = LocalAuthViewModel.current
val navigator = LocalNavigator.current
val scope = rememberCoroutineScope()
ProfileEditor(
title = "Create a new identity",
buttonLabel = "Continue",
onBack = { navigator.goBack() },
onConfirm = { name, bio, bytes, type ->
scope.launch {
authViewModel.createIdentity(name, bio, bytes, type)
navigator.navigate(Screen.Home)
}
authViewModel.createIdentity(name, bio, bytes, type)
navigator.navigate(Screen.Home)
}
)
}

View File

@@ -2,9 +2,7 @@ package su.reya.coop.screens
import androidx.compose.runtime.Composable
import androidx.compose.runtime.getValue
import androidx.compose.runtime.rememberCoroutineScope
import androidx.lifecycle.compose.collectAsStateWithLifecycle
import kotlinx.coroutines.launch
import su.reya.coop.LocalNavigator
import su.reya.coop.LocalNostrViewModel
import su.reya.coop.shared.ProfileEditor
@@ -13,7 +11,6 @@ import su.reya.coop.shared.ProfileEditor
fun UpdateProfileScreen() {
val nostrViewModel = LocalNostrViewModel.current
val navigator = LocalNavigator.current
val scope = rememberCoroutineScope()
val currentUser by nostrViewModel.currentUserProfile.collectAsStateWithLifecycle()
val profile = currentUser?.metadata?.asRecord()
@@ -26,10 +23,8 @@ fun UpdateProfileScreen() {
initialPicture = profile?.picture,
onBack = { navigator.goBack() },
onConfirm = { name, bio, bytes, type ->
scope.launch {
nostrViewModel.updateProfile(name, bio, bytes, type)
navigator.goBack()
}
nostrViewModel.updateProfile(name, bio, bytes, type)
navigator.goBack()
}
)
}

View File

@@ -69,7 +69,7 @@ fun ProfileEditor(
initialBio: String = "",
initialPicture: Any? = null, // Accepts Uri (picked) or String (current URL)
onBack: () -> Unit,
onConfirm: (name: String, bio: String, pictureBytes: ByteArray?, contentType: String?) -> Unit
onConfirm: suspend (name: String, bio: String, pictureBytes: ByteArray?, contentType: String?) -> Unit
) {
val context = LocalContext.current
val snackbarHostState = LocalSnackbarHostState.current

View File

@@ -155,7 +155,7 @@ class Nostr {
val processedEvent = mutableSetOf<EventId>()
val notifications = client?.notifications() ?: return@supervisorScope
val giftWrapQueue = Channel<Event>(Channel.UNLIMITED)
val giftWrapQueue = Channel<Event>(1024)
var processedCount = 0
var eoseReceived = false
@@ -219,6 +219,7 @@ class Nostr {
KindStandard.INBOX_RELAYS -> {
// Get all gift wrap events for the current user
if (isSignedByUser(event = event)) {
messages.updateSyncState { it.copy(isSyncing = true) }
messages.getUserMessages(msgRelayList = event)
}
}

View File

@@ -82,7 +82,7 @@ class ProfileManager(private val nostr: Nostr) {
client?.sync(filter, relays)
} catch (e: Exception) {
throw IllegalStateException("Failed to fetch mutual contacts: ${e.message}", e)
println("Failed to sync mutual contacts: ${e.message}")
}
}

View File

@@ -65,7 +65,7 @@ class ChatViewModel(private val nostr: Nostr) : BaseViewModel() {
launch {
nostr.messages.messageSyncState.collect { syncState ->
// When at least some messages are processed, allow UI to show the list
if (syncState.processedCount > 0) {
if (syncState.processedCount > 0 || !syncState.isSyncing) {
_state.update { it.copy(isPartialProcessedGiftWrap = true) }
}

View File

@@ -72,8 +72,6 @@ class NostrViewModel(private val nostr: Nostr) : BaseViewModel() {
private val metadataRequestChannel = Channel<PublicKey>(Channel.UNLIMITED)
private val seenPublicKeys = mutableSetOf<PublicKey>()
val isBusy = appState.map { it.isBusy }
.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5000), false)
val isRelayListEmpty = appState.map { it.isRelayListEmpty }
.stateIn(viewModelScope, SharingStarted.WhileSubscribed(5000), false)