mirror of
https://github.com/permissionlesstech/bitchat.git
synced 2026-07-25 01:05:19 +00:00
Add visual save indicator button for rooms
- Add bookmark icon button in room header to toggle save status - Use bookmark.fill when room is saved, bookmark when not - Button shows yellow when saved, default color when not - Integrate with existing /save command functionality - Add savedRooms published property for reactive UI updates
This commit is contained in:
@@ -48,6 +48,7 @@ class ChatViewModel: ObservableObject {
|
|||||||
@Published var roomKeyCommitments: [String: String] = [:] // room -> SHA256(derivedKey) for verification
|
@Published var roomKeyCommitments: [String: String] = [:] // room -> SHA256(derivedKey) for verification
|
||||||
@Published var showPasswordPrompt: Bool = false
|
@Published var showPasswordPrompt: Bool = false
|
||||||
@Published var passwordPromptRoom: String? = nil
|
@Published var passwordPromptRoom: String? = nil
|
||||||
|
@Published var savedRooms: Set<String> = [] // Rooms saved for message retention
|
||||||
|
|
||||||
let meshService = BluetoothMeshService()
|
let meshService = BluetoothMeshService()
|
||||||
private let userDefaults = UserDefaults.standard
|
private let userDefaults = UserDefaults.standard
|
||||||
@@ -70,6 +71,7 @@ class ChatViewModel: ObservableObject {
|
|||||||
loadFavorites()
|
loadFavorites()
|
||||||
loadJoinedRooms()
|
loadJoinedRooms()
|
||||||
loadRoomData()
|
loadRoomData()
|
||||||
|
savedRooms = MessageRetentionService.shared.getFavoriteRooms()
|
||||||
meshService.delegate = self
|
meshService.delegate = self
|
||||||
|
|
||||||
// Log startup info
|
// Log startup info
|
||||||
@@ -930,6 +932,7 @@ class ChatViewModel: ObservableObject {
|
|||||||
|
|
||||||
// Clear all retained messages
|
// Clear all retained messages
|
||||||
MessageRetentionService.shared.deleteAllStoredMessages()
|
MessageRetentionService.shared.deleteAllStoredMessages()
|
||||||
|
savedRooms.removeAll()
|
||||||
|
|
||||||
// Clear message retry queue
|
// Clear message retry queue
|
||||||
MessageRetryService.shared.clearRetryQueue()
|
MessageRetryService.shared.clearRetryQueue()
|
||||||
@@ -1590,6 +1593,13 @@ extension ChatViewModel: BitchatDelegate {
|
|||||||
let isFavorite = MessageRetentionService.shared.toggleFavoriteRoom(room)
|
let isFavorite = MessageRetentionService.shared.toggleFavoriteRoom(room)
|
||||||
let status = isFavorite ? "saved" : "unsaved"
|
let status = isFavorite ? "saved" : "unsaved"
|
||||||
|
|
||||||
|
// Update published property
|
||||||
|
if isFavorite {
|
||||||
|
savedRooms.insert(room)
|
||||||
|
} else {
|
||||||
|
savedRooms.remove(room)
|
||||||
|
}
|
||||||
|
|
||||||
// If just marked as favorite, load any previously saved messages
|
// If just marked as favorite, load any previously saved messages
|
||||||
if isFavorite {
|
if isFavorite {
|
||||||
let savedMessages = MessageRetentionService.shared.loadMessagesForRoom(room)
|
let savedMessages = MessageRetentionService.shared.loadMessagesForRoom(room)
|
||||||
|
|||||||
@@ -296,6 +296,16 @@ struct ContentView: View {
|
|||||||
Spacer()
|
Spacer()
|
||||||
|
|
||||||
HStack(spacing: 8) {
|
HStack(spacing: 8) {
|
||||||
|
// Save button
|
||||||
|
Button(action: {
|
||||||
|
viewModel.sendMessage("/save")
|
||||||
|
}) {
|
||||||
|
Image(systemName: viewModel.savedRooms.contains(currentRoom) ? "bookmark.fill" : "bookmark")
|
||||||
|
.font(.system(size: 16))
|
||||||
|
.foregroundColor(viewModel.savedRooms.contains(currentRoom) ? Color.yellow : textColor)
|
||||||
|
}
|
||||||
|
.buttonStyle(.plain)
|
||||||
|
|
||||||
// Password button for room creator only
|
// Password button for room creator only
|
||||||
if viewModel.roomCreators[currentRoom] == viewModel.meshService.myPeerID {
|
if viewModel.roomCreators[currentRoom] == viewModel.meshService.myPeerID {
|
||||||
Button(action: {
|
Button(action: {
|
||||||
|
|||||||
Reference in New Issue
Block a user