From 581fb9d723506028d5214df257019f351d44528a Mon Sep 17 00:00:00 2001 From: Kgothatso Ngako Date: Fri, 10 Jul 2026 20:27:34 +0200 Subject: [PATCH] Sync profile key packages before inviting --- .../SearchMemberToAddToChatRoomViewModel.kt | 50 +++++++++++++++++-- 1 file changed, 47 insertions(+), 3 deletions(-) diff --git a/composeApp/src/commonMain/kotlin/at/torch/compose/ui/view/model/SearchMemberToAddToChatRoomViewModel.kt b/composeApp/src/commonMain/kotlin/at/torch/compose/ui/view/model/SearchMemberToAddToChatRoomViewModel.kt index d70e8db0..748a77b5 100644 --- a/composeApp/src/commonMain/kotlin/at/torch/compose/ui/view/model/SearchMemberToAddToChatRoomViewModel.kt +++ b/composeApp/src/commonMain/kotlin/at/torch/compose/ui/view/model/SearchMemberToAddToChatRoomViewModel.kt @@ -9,10 +9,17 @@ import androidx.lifecycle.ViewModelProvider import androidx.lifecycle.viewModelScope import androidx.lifecycle.viewmodel.initializer import androidx.lifecycle.viewmodel.viewModelFactory +import at.torch.compose.database.model.NegentropySynchronizeRequest +import at.torch.compose.database.model.Profile +import at.torch.compose.database.model.Relay +import at.torch.compose.database.model.intermdiate.LocalChatRoom +import at.torch.compose.database.model.types.SynchronizationFilter +import at.torch.compose.nostr.Relays import at.torch.compose.repository.ChatRepository import at.torch.compose.repository.NostrRepository import at.torch.compose.ui.view.state.SearchMemberToAddToChatRoomUIState import co.touchlab.kermit.Logger +import com.vitorpamplona.quartz.marmot.mip00KeyPackages.KeyPackageEvent import com.vitorpamplona.quartz.nip01Core.core.HexKey import kotlinx.coroutines.Dispatchers import kotlinx.coroutines.IO @@ -46,16 +53,53 @@ class SearchMemberToAddToChatRoomViewModel( // Initiate new chat... and navigate to new chat... SearchMemberToAddToChatRoomUIState.Error("Failed to load chat") } else { + val contacts = nostrRepository.searchableProfiles( + excludingPublicKeys = localChatRoom.localParticipants.map { it.participant.participantPublicKey }.toTypedArray() + ) + scheduleKeyPackageEventSynchronization( + profiles = contacts + ) SearchMemberToAddToChatRoomUIState.Loaded( localChatRoom = localChatRoom, - contacts = nostrRepository.searchableProfiles( - excludingPublicKeys = localChatRoom.localParticipants.map { it.participant.participantPublicKey }.toTypedArray() - ) + contacts = contacts ) } } } + fun scheduleKeyPackageEventSynchronization(profiles: List) { + logger.d("scheduleKeyPackageEventSynchronization: $profiles") + + viewModelScope.launch(Dispatchers.IO) { + // TODO: Sync from aggregated relays of profile KeyPackageRelays... + val negentropySynchronizeRequests = Relays.DefaultDMRelayList.map { normalizedRelayUrl -> + val synchronizationFilter = SynchronizationFilter( + authors = profiles.map { it.publicKey }.toTypedArray(), + kinds = arrayOf( + KeyPackageEvent.KIND + ) + ) + + NegentropySynchronizeRequest( + id = NegentropySynchronizeRequest.computeId( + relayURL = normalizedRelayUrl.url, + synchronizationFilter = synchronizationFilter + ), + purpose = "key-packages", + synchronizationFilter = synchronizationFilter, + relayURL = normalizedRelayUrl.url, + level = 0 + ) + } + logger.i("negentropySynchronizeRequests: $negentropySynchronizeRequests") + + nostrRepository.queueNegentropySynchronizeRequest( + negentropySynchronizeRequests + ) + } + } + + companion object { private const val TAG = "SearchMemberToAddToChatRoomViewModel"