mirror of
https://github.com/permissionlesstech/bitchat-android.git
synced 2026-07-25 02:25:21 +00:00
fix fav updates
This commit is contained in:
@@ -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)
|
||||||
}
|
}
|
||||||
)
|
)
|
||||||
|
|||||||
Reference in New Issue
Block a user