fix fav updates

This commit is contained in:
callebtc
2025-07-12 17:11:19 +02:00
parent ea25b71d6f
commit a97e2549b8
4 changed files with 37 additions and 12 deletions
@@ -152,11 +152,17 @@ fun ChatHeaderContent(
when { when {
selectedPrivatePeer != null -> { selectedPrivatePeer != null -> {
// Private chat header // Private chat header - ensure state synchronization
val favoritePeers by viewModel.favoritePeers.observeAsState(emptySet())
val fingerprint = viewModel.privateChatManager.getPeerFingerprint(selectedPrivatePeer)
val isFavorite = favoritePeers.contains(fingerprint)
Log.d("ChatHeader", "Header recomposing: peer=$selectedPrivatePeer, fingerprint=$fingerprint, isFav=$isFavorite")
PrivateChatHeader( PrivateChatHeader(
peerID = selectedPrivatePeer, peerID = selectedPrivatePeer,
peerNicknames = viewModel.meshService.getPeerNicknames(), peerNicknames = viewModel.meshService.getPeerNicknames(),
isFavorite = viewModel.isFavorite(selectedPrivatePeer), isFavorite = isFavorite,
onBackClick = onBackClick, onBackClick = onBackClick,
onToggleFavorite = { viewModel.toggleFavorite(selectedPrivatePeer) } onToggleFavorite = { viewModel.toggleFavorite(selectedPrivatePeer) }
) )
@@ -189,8 +189,17 @@ class ChatState {
} }
fun setFavoritePeers(favorites: Set<String>) { fun setFavoritePeers(favorites: Set<String>) {
val currentValue = _favoritePeers.value ?: emptySet()
Log.d("ChatState", "setFavoritePeers called with ${favorites.size} favorites: $favorites") Log.d("ChatState", "setFavoritePeers called with ${favorites.size} favorites: $favorites")
Log.d("ChatState", "Current value: $currentValue")
Log.d("ChatState", "Values equal: ${currentValue == favorites}")
Log.d("ChatState", "Setting on thread: ${Thread.currentThread().name}")
// Always set the value - even if equal, this ensures observers are triggered
_favoritePeers.value = favorites _favoritePeers.value = favorites
Log.d("ChatState", "LiveData value after set: ${_favoritePeers.value}")
Log.d("ChatState", "LiveData has active observers: ${_favoritePeers.hasActiveObservers()}")
} }
} }
@@ -109,6 +109,9 @@ class PrivateChatManager(
val wasFavorite = dataManager.isFavorite(fingerprint) val wasFavorite = dataManager.isFavorite(fingerprint)
Log.d(TAG, "Current favorite status: $wasFavorite") Log.d(TAG, "Current favorite status: $wasFavorite")
val currentFavorites = state.getFavoritePeersValue()
Log.d(TAG, "Current UI state favorites: $currentFavorites")
if (wasFavorite) { if (wasFavorite) {
dataManager.removeFavorite(fingerprint) dataManager.removeFavorite(fingerprint)
Log.d(TAG, "Removed from favorites: $fingerprint") Log.d(TAG, "Removed from favorites: $fingerprint")
@@ -117,10 +120,11 @@ class PrivateChatManager(
Log.d(TAG, "Added to favorites: $fingerprint") Log.d(TAG, "Added to favorites: $fingerprint")
} }
// Update state to trigger UI refresh // Always update state to trigger UI refresh - create new set to ensure change detection
state.setFavoritePeers(dataManager.favoritePeers) val newFavorites = dataManager.favoritePeers.toSet()
state.setFavoritePeers(newFavorites)
Log.d(TAG, "Updated favorite peers state. New favorites: ${dataManager.favoritePeers}") Log.d(TAG, "Force updated favorite peers state. New favorites: $newFavorites")
Log.d(TAG, "All peer fingerprints: $peerIDToPublicKeyFingerprint") Log.d(TAG, "All peer fingerprints: $peerIDToPublicKeyFingerprint")
} }
@@ -264,20 +264,26 @@ fun PeopleSection(
val privateChats by viewModel.privateChats.observeAsState(emptyMap()) val privateChats by viewModel.privateChats.observeAsState(emptyMap())
val favoritePeers by viewModel.favoritePeers.observeAsState(emptySet()) val favoritePeers by viewModel.favoritePeers.observeAsState(emptySet())
// Pre-calculate all favorite states to ensure proper state synchronization
val peerFavoriteStates = remember(favoritePeers, connectedPeers) {
connectedPeers.associateWith { peerID ->
val fingerprint = viewModel.privateChatManager.getPeerFingerprint(peerID)
favoritePeers.contains(fingerprint)
}
}
Log.d("SidebarComponents", "Recomposing with ${favoritePeers.size} favorites, peer states: $peerFavoriteStates")
// Smart sorting: unread DMs first, then by most recent DM, then favorites, then alphabetical // Smart sorting: unread DMs first, then by most recent DM, then favorites, then alphabetical
val sortedPeers = connectedPeers.sortedWith( val sortedPeers = connectedPeers.sortedWith(
compareBy<String> { !hasUnreadPrivateMessages.contains(it) } // Unread DM senders first compareBy<String> { !hasUnreadPrivateMessages.contains(it) } // Unread DM senders first
.thenByDescending { privateChats[it]?.maxByOrNull { msg -> msg.timestamp }?.timestamp?.time ?: 0L } // Most recent DM (convert Date to Long) .thenByDescending { privateChats[it]?.maxByOrNull { msg -> msg.timestamp }?.timestamp?.time ?: 0L } // Most recent DM (convert Date to Long)
.thenBy { .thenBy { !(peerFavoriteStates[it] ?: false) } // Favorites first
val fingerprint = viewModel.privateChatManager.getPeerFingerprint(it)
fingerprint == null || !favoritePeers.contains(fingerprint)
} // Favorites
.thenBy { (if (it == nickname) "You" else (peerNicknames[it] ?: it)).lowercase() } // Alphabetical .thenBy { (if (it == nickname) "You" else (peerNicknames[it] ?: it)).lowercase() } // Alphabetical
) )
sortedPeers.forEach { peerID -> sortedPeers.forEach { peerID ->
val fingerprint = viewModel.privateChatManager.getPeerFingerprint(peerID) val isFavorite = peerFavoriteStates[peerID] ?: false
val isFavorite = favoritePeers.contains(fingerprint)
PeerItem( PeerItem(
peerID = peerID, peerID = peerID,
@@ -289,7 +295,7 @@ fun PeopleSection(
colorScheme = colorScheme, colorScheme = colorScheme,
onItemClick = { onPrivateChatStart(peerID) }, onItemClick = { onPrivateChatStart(peerID) },
onToggleFavorite = { onToggleFavorite = {
Log.d("SidebarComponents", "Sidebar toggle favorite: peerID=$peerID, fingerprint=$fingerprint, currentFavorite=$isFavorite") Log.d("SidebarComponents", "Sidebar toggle favorite: peerID=$peerID, currentFavorite=$isFavorite")
viewModel.toggleFavorite(peerID) viewModel.toggleFavorite(peerID)
} }
) )