diff --git a/Meshtastic/Persistence/UpdateCoreData.swift b/Meshtastic/Persistence/UpdateCoreData.swift index 59fda031..3bc0e29b 100644 --- a/Meshtastic/Persistence/UpdateCoreData.swift +++ b/Meshtastic/Persistence/UpdateCoreData.swift @@ -75,6 +75,21 @@ public func deleteChannelMessages(channelIndex: Int32, context: NSManagedObjectC } } +public func deleteUserMessages(user: UserEntity, context: NSManagedObjectContext) { + + let fetchUserMessagesRequest: NSFetchRequest = NSFetchRequest.init(entityName: "MessageEntity") + fetchUserMessagesRequest.predicate = NSPredicate(format: "((toUser.num == %lld) OR (fromUser.num == %lld)) AND toUser != nil AND fromUser != nil AND admin == false", Int64(user.num), Int64(user.num)) + do { + let deleteRequest = NSBatchDeleteRequest(fetchRequest: fetchUserMessagesRequest) + try context.executeAndMergeChanges(using: deleteRequest) + try context.save() + + } catch let error as NSError { + print("Error: \(error.localizedDescription)") + abort() + } +} + public func clearCoreDataDatabase(context: NSManagedObjectContext) { let persistenceController = PersistenceController.shared.container diff --git a/Meshtastic/Views/Messages/Contacts.swift b/Meshtastic/Views/Messages/Contacts.swift index d8a34b40..8a2bf258 100644 --- a/Meshtastic/Views/Messages/Contacts.swift +++ b/Meshtastic/Views/Messages/Contacts.swift @@ -20,8 +20,9 @@ struct Contacts: View { private var users: FetchedResults @State var node: NodeInfoEntity? = nil - @State private var selection: UserEntity? = nil // Nothing selected by default. + @State private var isPresentingDeleteChannelMessagesConfirm: Bool = false + @State private var isPresentingDeleteUserMessagesConfirm: Bool = false var body: some View { @@ -83,11 +84,24 @@ struct Contacts: View { } .frame(maxWidth: .infinity, maxHeight: 80, alignment: .leading) .contextMenu { + if channel.allPrivateMessages.count > 0 { + Button(role: .destructive) { + isPresentingDeleteChannelMessagesConfirm = true + } label: { + Label("Delete Messages", systemImage: "trash") + } + } + } + .confirmationDialog( + "This conversation will be deleted.", + isPresented: $isPresentingDeleteChannelMessagesConfirm, + titleVisibility: .visible + ) { + Button(role: .destructive) { - print("I want to delete all the messages for \(channel.name ?? String(channel.index))") deleteChannelMessages(channelIndex: channel.index, context: context) } label: { - Label("Delete Messages", systemImage: "trash") + Text("Delete") } } } @@ -143,6 +157,28 @@ struct Contacts: View { } } .frame(maxWidth: .infinity, maxHeight: 80, alignment: .leading) + .contextMenu { + if user.messageList.count > 0 { + Button(role: .destructive) { + print("I want to delete all the messages for \(user.longName)") + isPresentingDeleteUserMessagesConfirm = true + } label: { + Label("Delete Messages", systemImage: "trash") + } + } + } + .confirmationDialog( + "This conversation will be deleted.", + isPresented: $isPresentingDeleteUserMessagesConfirm, + titleVisibility: .visible + ) { + + Button(role: .destructive) { + deleteUserMessages(user: user, context: context) + } label: { + Text("Delete") + } + } } } }