Skip to content

Commit a97e254

Browse files
committed
fix fav updates
1 parent ea25b71 commit a97e254

4 files changed

Lines changed: 37 additions & 12 deletions

File tree

app/src/main/java/com/bitchat/android/ui/ChatHeader.kt

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -152,11 +152,17 @@ fun ChatHeaderContent(
152152

153153
when {
154154
selectedPrivatePeer != null -> {
155-
// Private chat header
155+
// Private chat header - ensure state synchronization
156+
val favoritePeers by viewModel.favoritePeers.observeAsState(emptySet())
157+
val fingerprint = viewModel.privateChatManager.getPeerFingerprint(selectedPrivatePeer)
158+
val isFavorite = favoritePeers.contains(fingerprint)
159+
160+
Log.d("ChatHeader", "Header recomposing: peer=$selectedPrivatePeer, fingerprint=$fingerprint, isFav=$isFavorite")
161+
156162
PrivateChatHeader(
157163
peerID = selectedPrivatePeer,
158164
peerNicknames = viewModel.meshService.getPeerNicknames(),
159-
isFavorite = viewModel.isFavorite(selectedPrivatePeer),
165+
isFavorite = isFavorite,
160166
onBackClick = onBackClick,
161167
onToggleFavorite = { viewModel.toggleFavorite(selectedPrivatePeer) }
162168
)

app/src/main/java/com/bitchat/android/ui/ChatState.kt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -189,8 +189,17 @@ class ChatState {
189189
}
190190

191191
fun setFavoritePeers(favorites: Set<String>) {
192+
val currentValue = _favoritePeers.value ?: emptySet()
192193
Log.d("ChatState", "setFavoritePeers called with ${favorites.size} favorites: $favorites")
194+
Log.d("ChatState", "Current value: $currentValue")
195+
Log.d("ChatState", "Values equal: ${currentValue == favorites}")
196+
Log.d("ChatState", "Setting on thread: ${Thread.currentThread().name}")
197+
198+
// Always set the value - even if equal, this ensures observers are triggered
193199
_favoritePeers.value = favorites
200+
201+
Log.d("ChatState", "LiveData value after set: ${_favoritePeers.value}")
202+
Log.d("ChatState", "LiveData has active observers: ${_favoritePeers.hasActiveObservers()}")
194203
}
195204

196205
}

app/src/main/java/com/bitchat/android/ui/PrivateChatManager.kt

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,9 @@ class PrivateChatManager(
109109
val wasFavorite = dataManager.isFavorite(fingerprint)
110110
Log.d(TAG, "Current favorite status: $wasFavorite")
111111

112+
val currentFavorites = state.getFavoritePeersValue()
113+
Log.d(TAG, "Current UI state favorites: $currentFavorites")
114+
112115
if (wasFavorite) {
113116
dataManager.removeFavorite(fingerprint)
114117
Log.d(TAG, "Removed from favorites: $fingerprint")
@@ -117,10 +120,11 @@ class PrivateChatManager(
117120
Log.d(TAG, "Added to favorites: $fingerprint")
118121
}
119122

120-
// Update state to trigger UI refresh
121-
state.setFavoritePeers(dataManager.favoritePeers)
123+
// Always update state to trigger UI refresh - create new set to ensure change detection
124+
val newFavorites = dataManager.favoritePeers.toSet()
125+
state.setFavoritePeers(newFavorites)
122126

123-
Log.d(TAG, "Updated favorite peers state. New favorites: ${dataManager.favoritePeers}")
127+
Log.d(TAG, "Force updated favorite peers state. New favorites: $newFavorites")
124128
Log.d(TAG, "All peer fingerprints: $peerIDToPublicKeyFingerprint")
125129
}
126130

app/src/main/java/com/bitchat/android/ui/SidebarComponents.kt

Lines changed: 13 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -264,20 +264,26 @@ fun PeopleSection(
264264
val privateChats by viewModel.privateChats.observeAsState(emptyMap())
265265
val favoritePeers by viewModel.favoritePeers.observeAsState(emptySet())
266266

267+
// Pre-calculate all favorite states to ensure proper state synchronization
268+
val peerFavoriteStates = remember(favoritePeers, connectedPeers) {
269+
connectedPeers.associateWith { peerID ->
270+
val fingerprint = viewModel.privateChatManager.getPeerFingerprint(peerID)
271+
favoritePeers.contains(fingerprint)
272+
}
273+
}
274+
275+
Log.d("SidebarComponents", "Recomposing with ${favoritePeers.size} favorites, peer states: $peerFavoriteStates")
276+
267277
// Smart sorting: unread DMs first, then by most recent DM, then favorites, then alphabetical
268278
val sortedPeers = connectedPeers.sortedWith(
269279
compareBy<String> { !hasUnreadPrivateMessages.contains(it) } // Unread DM senders first
270280
.thenByDescending { privateChats[it]?.maxByOrNull { msg -> msg.timestamp }?.timestamp?.time ?: 0L } // Most recent DM (convert Date to Long)
271-
.thenBy {
272-
val fingerprint = viewModel.privateChatManager.getPeerFingerprint(it)
273-
fingerprint == null || !favoritePeers.contains(fingerprint)
274-
} // Favorites
281+
.thenBy { !(peerFavoriteStates[it] ?: false) } // Favorites first
275282
.thenBy { (if (it == nickname) "You" else (peerNicknames[it] ?: it)).lowercase() } // Alphabetical
276283
)
277284

278285
sortedPeers.forEach { peerID ->
279-
val fingerprint = viewModel.privateChatManager.getPeerFingerprint(peerID)
280-
val isFavorite = favoritePeers.contains(fingerprint)
286+
val isFavorite = peerFavoriteStates[peerID] ?: false
281287

282288
PeerItem(
283289
peerID = peerID,
@@ -289,7 +295,7 @@ fun PeopleSection(
289295
colorScheme = colorScheme,
290296
onItemClick = { onPrivateChatStart(peerID) },
291297
onToggleFavorite = {
292-
Log.d("SidebarComponents", "Sidebar toggle favorite: peerID=$peerID, fingerprint=$fingerprint, currentFavorite=$isFavorite")
298+
Log.d("SidebarComponents", "Sidebar toggle favorite: peerID=$peerID, currentFavorite=$isFavorite")
293299
viewModel.toggleFavorite(peerID)
294300
}
295301
)

0 commit comments

Comments
 (0)