Add room message indicator and simplify room header

- Add blue hashtag icon in main header when there are unread room messages
- Remove member count from room title for cleaner look
- Add debug logging to diagnose room member list issue
This commit is contained in:
jack
2025-07-05 19:35:37 +02:00
parent 36155b457b
commit 10ee001728
2 changed files with 23 additions and 4 deletions
+4
View File
@@ -251,6 +251,7 @@ class ChatViewModel: ObservableObject {
roomMembers[room] = [] roomMembers[room] = []
} }
roomMembers[room]?.insert(meshService.myPeerID) roomMembers[room]?.insert(meshService.myPeerID)
print("[DEBUG-ROOM] Added self \(meshService.myPeerID) to room \(room), total members: \(roomMembers[room]?.count ?? 0)")
} else { } else {
// Add to main messages // Add to main messages
messages.append(message) messages.append(message)
@@ -676,6 +677,9 @@ extension ChatViewModel: BitchatDelegate {
} }
if let senderPeerID = message.senderPeerID { if let senderPeerID = message.senderPeerID {
roomMembers[room]?.insert(senderPeerID) roomMembers[room]?.insert(senderPeerID)
print("[DEBUG-ROOM] Added member \(senderPeerID) to room \(room), total members: \(roomMembers[room]?.count ?? 0)")
} else {
print("[DEBUG-ROOM] No senderPeerID for message in room \(room)")
} }
// Update unread count if not currently viewing this room // Update unread count if not currently viewing this room
+19 -4
View File
@@ -206,14 +206,13 @@ struct ContentView: View {
} else if let currentRoom = viewModel.currentRoom { } else if let currentRoom = viewModel.currentRoom {
// Room header // Room header
HStack(spacing: 4) { HStack(spacing: 4) {
let memberCount = (viewModel.roomMembers[currentRoom]?.count ?? 0) + 1 // +1 for self
Button(action: { Button(action: {
withAnimation(.spring(response: 0.3, dampingFraction: 0.8)) { withAnimation(.spring(response: 0.3, dampingFraction: 0.8)) {
showSidebar.toggle() showSidebar.toggle()
sidebarDragOffset = 0 sidebarDragOffset = 0
} }
}) { }) {
Text("\(currentRoom) (\(memberCount))") Text(currentRoom)
.font(.system(size: 18, weight: .medium, design: .monospaced)) .font(.system(size: 18, weight: .medium, design: .monospaced))
.foregroundColor(Color.blue) .foregroundColor(Color.blue)
} }
@@ -291,6 +290,15 @@ struct ContentView: View {
// People counter with unread indicator // People counter with unread indicator
HStack(spacing: 4) { HStack(spacing: 4) {
// Check for any unread room messages
let hasUnreadRoomMessages = viewModel.unreadRoomMessages.values.contains { $0 > 0 }
if hasUnreadRoomMessages {
Image(systemName: "number")
.font(.system(size: 12))
.foregroundColor(Color.blue)
}
if !viewModel.unreadPrivateMessages.isEmpty { if !viewModel.unreadPrivateMessages.isEmpty {
Image(systemName: "envelope.fill") Image(systemName: "envelope.fill")
.font(.system(size: 12)) .font(.system(size: 12))
@@ -593,11 +601,18 @@ struct ContentView: View {
if let currentRoom = viewModel.currentRoom, if let currentRoom = viewModel.currentRoom,
let roomMemberIDs = viewModel.roomMembers[currentRoom] { let roomMemberIDs = viewModel.roomMembers[currentRoom] {
// Show only peers who have sent messages to this room (including self) // Show only peers who have sent messages to this room (including self)
print("[DEBUG-VIEW] Room \(currentRoom) has members: \(roomMemberIDs)")
print("[DEBUG-VIEW] Connected peers: \(viewModel.connectedPeers)")
var memberPeers = viewModel.connectedPeers.filter { roomMemberIDs.contains($0) } var memberPeers = viewModel.connectedPeers.filter { roomMemberIDs.contains($0) }
// Always include ourselves if we're connected // Always include ourselves if we're connected
if viewModel.connectedPeers.contains(myPeerID) { if viewModel.connectedPeers.contains(myPeerID) && roomMemberIDs.contains(myPeerID) {
memberPeers.append(myPeerID) if !memberPeers.contains(myPeerID) {
memberPeers.append(myPeerID)
}
} }
print("[DEBUG-VIEW] Peers to show in room: \(memberPeers)")
return Array(Set(memberPeers)) // Remove duplicates return Array(Set(memberPeers)) // Remove duplicates
} else { } else {
// Show all connected peers in main chat // Show all connected peers in main chat